ProbeReflections.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. // Copyright (C) 2009-2020, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma once
  6. #include <anki/renderer/Renderer.h>
  7. #include <anki/renderer/RendererObject.h>
  8. #include <anki/renderer/TraditionalDeferredShading.h>
  9. #include <anki/renderer/ClusterBin.h>
  10. #include <anki/resource/TextureResource.h>
  11. namespace anki
  12. {
  13. /// @addtogroup renderer
  14. /// @{
  15. /// Probe reflections.
  16. class ProbeReflections : public RendererObject
  17. {
  18. friend class IrTask;
  19. public:
  20. ProbeReflections(Renderer* r);
  21. ~ProbeReflections();
  22. ANKI_USE_RESULT Error init(const ConfigSet& cfg);
  23. /// Populate the rendergraph.
  24. void populateRenderGraph(RenderingContext& ctx);
  25. U getReflectionTextureMipmapCount() const
  26. {
  27. return m_lightShading.m_mipCount;
  28. }
  29. TextureViewPtr getIntegrationLut() const
  30. {
  31. return m_integrationLut->getGrTextureView();
  32. }
  33. SamplerPtr getIntegrationLutSampler() const
  34. {
  35. return m_integrationLutSampler;
  36. }
  37. RenderTargetHandle getReflectionRt() const
  38. {
  39. return m_ctx.m_lightShadingRt;
  40. }
  41. private:
  42. class
  43. {
  44. public:
  45. U32 m_tileSize = 0;
  46. Array<RenderTargetDescription, GBUFFER_COLOR_ATTACHMENT_COUNT> m_colorRtDescrs;
  47. RenderTargetDescription m_depthRtDescr;
  48. FramebufferDescription m_fbDescr;
  49. } m_gbuffer; ///< G-buffer pass.
  50. class LS
  51. {
  52. public:
  53. U32 m_tileSize = 0;
  54. U32 m_mipCount = 0;
  55. TexturePtr m_cubeArr;
  56. TraditionalDeferredLightShading m_deferred;
  57. LS(Renderer* r)
  58. : m_deferred(r)
  59. {
  60. }
  61. } m_lightShading; ///< Light shading.
  62. class
  63. {
  64. public:
  65. ShaderProgramResourcePtr m_prog;
  66. ShaderProgramPtr m_grProg;
  67. BufferPtr m_diceValuesBuff;
  68. U32 m_workgroupSize = 16;
  69. } m_irradiance; ///< Irradiance.
  70. class
  71. {
  72. public:
  73. ShaderProgramResourcePtr m_prog;
  74. ShaderProgramPtr m_grProg;
  75. } m_irradianceToRefl; ///< Apply irradiance back to the reflection.
  76. class
  77. {
  78. public:
  79. RenderTargetDescription m_rtDescr;
  80. FramebufferDescription m_fbDescr;
  81. SamplerPtr m_shadowSampler;
  82. } m_shadowMapping;
  83. class CacheEntry
  84. {
  85. public:
  86. U64 m_uuid; ///< Probe UUID.
  87. Timestamp m_lastUsedTimestamp = 0; ///< When it was last seen by the renderer.
  88. Array<FramebufferDescription, 6> m_lightShadingFbDescrs;
  89. };
  90. DynamicArray<CacheEntry> m_cacheEntries;
  91. HashMap<U64, U32> m_probeUuidToCacheEntryIdx;
  92. // Other
  93. TextureResourcePtr m_integrationLut;
  94. SamplerPtr m_integrationLutSampler;
  95. class
  96. {
  97. public:
  98. const ReflectionProbeQueueElement* m_probe = nullptr;
  99. U32 m_cacheEntryIdx = MAX_U32;
  100. Array<RenderTargetHandle, GBUFFER_COLOR_ATTACHMENT_COUNT> m_gbufferColorRts;
  101. RenderTargetHandle m_gbufferDepthRt;
  102. RenderTargetHandle m_lightShadingRt;
  103. BufferHandle m_irradianceDiceValuesBuffHandle;
  104. RenderTargetHandle m_shadowMapRt;
  105. U32 m_gbufferRenderableCount = 0;
  106. U32 m_shadowRenderableCount = 0;
  107. } m_ctx; ///< Runtime context.
  108. ANKI_USE_RESULT Error initInternal(const ConfigSet& cfg);
  109. ANKI_USE_RESULT Error initGBuffer(const ConfigSet& cfg);
  110. ANKI_USE_RESULT Error initLightShading(const ConfigSet& cfg);
  111. ANKI_USE_RESULT Error initIrradiance(const ConfigSet& cfg);
  112. ANKI_USE_RESULT Error initIrradianceToRefl(const ConfigSet& cfg);
  113. ANKI_USE_RESULT Error initShadowMapping(const ConfigSet& cfg);
  114. /// Lazily init the cache entry
  115. void initCacheEntry(U32 cacheEntryIdx);
  116. void prepareProbes(RenderingContext& ctx, ReflectionProbeQueueElement*& probeToUpdate,
  117. U32& probeToUpdateCacheEntryIdx);
  118. void runGBuffer(RenderPassWorkContext& rgraphCtx);
  119. void runShadowMapping(RenderPassWorkContext& rgraphCtx);
  120. void runLightShading(U32 faceIdx, RenderPassWorkContext& rgraphCtx);
  121. void runMipmappingOfLightShading(U32 faceIdx, RenderPassWorkContext& rgraphCtx);
  122. void runIrradiance(RenderPassWorkContext& rgraphCtx);
  123. void runIrradianceToRefl(RenderPassWorkContext& rgraphCtx);
  124. // A RenderPassWorkCallback for the light shading pass into a single face.
  125. template<U faceIdx>
  126. static void runLightShadingCallback(RenderPassWorkContext& rgraphCtx)
  127. {
  128. ProbeReflections* const self = static_cast<ProbeReflections*>(rgraphCtx.m_userData);
  129. self->runLightShading(faceIdx, rgraphCtx);
  130. }
  131. // A RenderPassWorkCallback for the mipmapping of light shading result.
  132. template<U faceIdx>
  133. static void runMipmappingOfLightShadingCallback(RenderPassWorkContext& rgraphCtx)
  134. {
  135. ProbeReflections* const self = static_cast<ProbeReflections*>(rgraphCtx.m_userData);
  136. self->runMipmappingOfLightShading(faceIdx, rgraphCtx);
  137. }
  138. };
  139. /// @}
  140. } // end namespace anki