backend.h 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. #pragma once
  2. #include "../draw_queue.h"
  3. #include "../ground/grass_gpu.h"
  4. #include "../ground/plant_gpu.h"
  5. #include "../ground/stone_gpu.h"
  6. #include "../ground/terrain_gpu.h"
  7. #include "camera.h"
  8. #include "persistent_buffer.h"
  9. #include "resources.h"
  10. #include "shader.h"
  11. #include "shader_cache.h"
  12. #include <QOpenGLFunctions_3_3_Core>
  13. #include <QVector2D>
  14. #include <QVector3D>
  15. #include <array>
  16. #include <memory>
  17. #include <vector>
  18. namespace Render::GL {
  19. class Backend : protected QOpenGLFunctions_3_3_Core {
  20. public:
  21. Backend() = default;
  22. ~Backend();
  23. void initialize();
  24. void beginFrame();
  25. void setViewport(int w, int h);
  26. void setClearColor(float r, float g, float b, float a);
  27. void execute(const DrawQueue &queue, const Camera &cam);
  28. ResourceManager *resources() const { return m_resources.get(); }
  29. Shader *shader(const QString &name) const {
  30. return m_shaderCache ? m_shaderCache->get(name) : nullptr;
  31. }
  32. Shader *getOrLoadShader(const QString &name, const QString &vertPath,
  33. const QString &fragPath) {
  34. if (!m_shaderCache)
  35. return nullptr;
  36. return m_shaderCache->load(name, vertPath, fragPath);
  37. }
  38. void enableDepthTest(bool enable) {
  39. if (enable)
  40. glEnable(GL_DEPTH_TEST);
  41. else
  42. glDisable(GL_DEPTH_TEST);
  43. }
  44. void setDepthFunc(GLenum func) { glDepthFunc(func); }
  45. void setDepthMask(bool write) { glDepthMask(write ? GL_TRUE : GL_FALSE); }
  46. void enableBlend(bool enable) {
  47. if (enable)
  48. glEnable(GL_BLEND);
  49. else
  50. glDisable(GL_BLEND);
  51. }
  52. void setBlendFunc(GLenum src, GLenum dst) { glBlendFunc(src, dst); }
  53. void enablePolygonOffset(bool enable) {
  54. if (enable)
  55. glEnable(GL_POLYGON_OFFSET_FILL);
  56. else
  57. glDisable(GL_POLYGON_OFFSET_FILL);
  58. }
  59. void setPolygonOffset(float factor, float units) {
  60. glPolygonOffset(factor, units);
  61. }
  62. private:
  63. int m_viewportWidth{0};
  64. int m_viewportHeight{0};
  65. std::array<float, 4> m_clearColor{0.2f, 0.3f, 0.3f, 0.0f};
  66. std::unique_ptr<ShaderCache> m_shaderCache;
  67. std::unique_ptr<ResourceManager> m_resources;
  68. Shader *m_basicShader = nullptr;
  69. Shader *m_gridShader = nullptr;
  70. Shader *m_cylinderShader = nullptr;
  71. Shader *m_fogShader = nullptr;
  72. Shader *m_grassShader = nullptr;
  73. Shader *m_stoneShader = nullptr;
  74. Shader *m_plantShader = nullptr;
  75. Shader *m_pineShader = nullptr;
  76. Shader *m_groundShader = nullptr;
  77. Shader *m_terrainShader = nullptr;
  78. Shader *m_archerShader = nullptr;
  79. Shader *m_knightShader = nullptr;
  80. struct BasicUniforms {
  81. Shader::UniformHandle mvp{Shader::InvalidUniform};
  82. Shader::UniformHandle model{Shader::InvalidUniform};
  83. Shader::UniformHandle texture{Shader::InvalidUniform};
  84. Shader::UniformHandle useTexture{Shader::InvalidUniform};
  85. Shader::UniformHandle color{Shader::InvalidUniform};
  86. Shader::UniformHandle alpha{Shader::InvalidUniform};
  87. } m_basicUniforms;
  88. BasicUniforms m_archerUniforms;
  89. BasicUniforms m_knightUniforms;
  90. struct GridUniforms {
  91. Shader::UniformHandle mvp{Shader::InvalidUniform};
  92. Shader::UniformHandle model{Shader::InvalidUniform};
  93. Shader::UniformHandle gridColor{Shader::InvalidUniform};
  94. Shader::UniformHandle lineColor{Shader::InvalidUniform};
  95. Shader::UniformHandle cellSize{Shader::InvalidUniform};
  96. Shader::UniformHandle thickness{Shader::InvalidUniform};
  97. } m_gridUniforms;
  98. struct CylinderUniforms {
  99. Shader::UniformHandle viewProj{Shader::InvalidUniform};
  100. } m_cylinderUniforms;
  101. struct FogUniforms {
  102. Shader::UniformHandle viewProj{Shader::InvalidUniform};
  103. } m_fogUniforms;
  104. struct GrassUniforms {
  105. Shader::UniformHandle viewProj{Shader::InvalidUniform};
  106. Shader::UniformHandle time{Shader::InvalidUniform};
  107. Shader::UniformHandle windStrength{Shader::InvalidUniform};
  108. Shader::UniformHandle windSpeed{Shader::InvalidUniform};
  109. Shader::UniformHandle soilColor{Shader::InvalidUniform};
  110. Shader::UniformHandle lightDir{Shader::InvalidUniform};
  111. } m_grassUniforms;
  112. struct StoneUniforms {
  113. Shader::UniformHandle viewProj{Shader::InvalidUniform};
  114. Shader::UniformHandle lightDirection{Shader::InvalidUniform};
  115. } m_stoneUniforms;
  116. struct PlantUniforms {
  117. Shader::UniformHandle viewProj{Shader::InvalidUniform};
  118. Shader::UniformHandle time{Shader::InvalidUniform};
  119. Shader::UniformHandle windStrength{Shader::InvalidUniform};
  120. Shader::UniformHandle windSpeed{Shader::InvalidUniform};
  121. Shader::UniformHandle lightDirection{Shader::InvalidUniform};
  122. } m_plantUniforms;
  123. struct PineUniforms {
  124. Shader::UniformHandle viewProj{Shader::InvalidUniform};
  125. Shader::UniformHandle time{Shader::InvalidUniform};
  126. Shader::UniformHandle windStrength{Shader::InvalidUniform};
  127. Shader::UniformHandle windSpeed{Shader::InvalidUniform};
  128. Shader::UniformHandle lightDirection{Shader::InvalidUniform};
  129. } m_pineUniforms;
  130. struct GroundUniforms {
  131. Shader::UniformHandle mvp{Shader::InvalidUniform};
  132. Shader::UniformHandle model{Shader::InvalidUniform};
  133. Shader::UniformHandle grassPrimary{Shader::InvalidUniform};
  134. Shader::UniformHandle grassSecondary{Shader::InvalidUniform};
  135. Shader::UniformHandle grassDry{Shader::InvalidUniform};
  136. Shader::UniformHandle soilColor{Shader::InvalidUniform};
  137. Shader::UniformHandle tint{Shader::InvalidUniform};
  138. Shader::UniformHandle noiseOffset{Shader::InvalidUniform};
  139. Shader::UniformHandle tileSize{Shader::InvalidUniform};
  140. Shader::UniformHandle macroNoiseScale{Shader::InvalidUniform};
  141. Shader::UniformHandle detailNoiseScale{Shader::InvalidUniform};
  142. Shader::UniformHandle soilBlendHeight{Shader::InvalidUniform};
  143. Shader::UniformHandle soilBlendSharpness{Shader::InvalidUniform};
  144. Shader::UniformHandle ambientBoost{Shader::InvalidUniform};
  145. Shader::UniformHandle lightDir{Shader::InvalidUniform};
  146. } m_groundUniforms;
  147. struct TerrainUniforms {
  148. Shader::UniformHandle mvp{Shader::InvalidUniform};
  149. Shader::UniformHandle model{Shader::InvalidUniform};
  150. Shader::UniformHandle grassPrimary{Shader::InvalidUniform};
  151. Shader::UniformHandle grassSecondary{Shader::InvalidUniform};
  152. Shader::UniformHandle grassDry{Shader::InvalidUniform};
  153. Shader::UniformHandle soilColor{Shader::InvalidUniform};
  154. Shader::UniformHandle rockLow{Shader::InvalidUniform};
  155. Shader::UniformHandle rockHigh{Shader::InvalidUniform};
  156. Shader::UniformHandle tint{Shader::InvalidUniform};
  157. Shader::UniformHandle noiseOffset{Shader::InvalidUniform};
  158. Shader::UniformHandle tileSize{Shader::InvalidUniform};
  159. Shader::UniformHandle macroNoiseScale{Shader::InvalidUniform};
  160. Shader::UniformHandle detailNoiseScale{Shader::InvalidUniform};
  161. Shader::UniformHandle slopeRockThreshold{Shader::InvalidUniform};
  162. Shader::UniformHandle slopeRockSharpness{Shader::InvalidUniform};
  163. Shader::UniformHandle soilBlendHeight{Shader::InvalidUniform};
  164. Shader::UniformHandle soilBlendSharpness{Shader::InvalidUniform};
  165. Shader::UniformHandle heightNoiseStrength{Shader::InvalidUniform};
  166. Shader::UniformHandle heightNoiseFrequency{Shader::InvalidUniform};
  167. Shader::UniformHandle ambientBoost{Shader::InvalidUniform};
  168. Shader::UniformHandle rockDetailStrength{Shader::InvalidUniform};
  169. Shader::UniformHandle lightDir{Shader::InvalidUniform};
  170. } m_terrainUniforms;
  171. struct CylinderInstanceGpu {
  172. QVector3D start;
  173. float radius{0.0f};
  174. QVector3D end;
  175. float alpha{1.0f};
  176. QVector3D color;
  177. float padding{0.0f};
  178. };
  179. GLuint m_cylinderVao = 0;
  180. GLuint m_cylinderVertexBuffer = 0;
  181. GLuint m_cylinderIndexBuffer = 0;
  182. GLuint m_cylinderInstanceBuffer = 0;
  183. GLsizei m_cylinderIndexCount = 0;
  184. std::size_t m_cylinderInstanceCapacity = 0;
  185. std::vector<CylinderInstanceGpu> m_cylinderScratch;
  186. PersistentRingBuffer<CylinderInstanceGpu> m_cylinderPersistentBuffer;
  187. bool m_usePersistentBuffers = false;
  188. struct FogInstanceGpu {
  189. QVector3D center;
  190. float size{1.0f};
  191. QVector3D color;
  192. float alpha{1.0f};
  193. };
  194. GLuint m_fogVao = 0;
  195. GLuint m_fogVertexBuffer = 0;
  196. GLuint m_fogIndexBuffer = 0;
  197. GLuint m_fogInstanceBuffer = 0;
  198. GLsizei m_fogIndexCount = 0;
  199. std::size_t m_fogInstanceCapacity = 0;
  200. std::vector<FogInstanceGpu> m_fogScratch;
  201. PersistentRingBuffer<FogInstanceGpu> m_fogPersistentBuffer;
  202. GLuint m_grassVao = 0;
  203. GLuint m_grassVertexBuffer = 0;
  204. GLsizei m_grassVertexCount = 0;
  205. GLuint m_stoneVao = 0;
  206. GLuint m_stoneVertexBuffer = 0;
  207. GLuint m_stoneIndexBuffer = 0;
  208. GLsizei m_stoneIndexCount = 0;
  209. GLsizei m_stoneVertexCount = 0;
  210. GLuint m_plantVao = 0;
  211. GLuint m_plantVertexBuffer = 0;
  212. GLuint m_plantIndexBuffer = 0;
  213. GLsizei m_plantIndexCount = 0;
  214. GLsizei m_plantVertexCount = 0;
  215. GLuint m_pineVao = 0;
  216. GLuint m_pineVertexBuffer = 0;
  217. GLuint m_pineIndexBuffer = 0;
  218. GLsizei m_pineIndexCount = 0;
  219. GLsizei m_pineVertexCount = 0;
  220. void cacheBasicUniforms();
  221. void cacheArcherUniforms();
  222. void cacheKnightUniforms();
  223. void cacheGridUniforms();
  224. void cacheCylinderUniforms();
  225. void initializeCylinderPipeline();
  226. void shutdownCylinderPipeline();
  227. void uploadCylinderInstances(std::size_t count);
  228. void drawCylinders(std::size_t count);
  229. void cacheFogUniforms();
  230. void initializeFogPipeline();
  231. void shutdownFogPipeline();
  232. void uploadFogInstances(std::size_t count);
  233. void drawFog(std::size_t count);
  234. void cacheGrassUniforms();
  235. void initializeGrassPipeline();
  236. void shutdownGrassPipeline();
  237. void cacheStoneUniforms();
  238. void initializeStonePipeline();
  239. void shutdownStonePipeline();
  240. void cachePlantUniforms();
  241. void initializePlantPipeline();
  242. void shutdownPlantPipeline();
  243. void cachePineUniforms();
  244. void initializePinePipeline();
  245. void shutdownPinePipeline();
  246. void cacheGroundUniforms();
  247. void cacheTerrainUniforms();
  248. Shader *m_lastBoundShader = nullptr;
  249. Texture *m_lastBoundTexture = nullptr;
  250. bool m_depthTestEnabled = true;
  251. bool m_blendEnabled = false;
  252. };
  253. } // namespace Render::GL