ProbeReflections.h 3.5 KB

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