ProbeReflections.h 4.4 KB

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