RtShadows.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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/Gr.h>
  7. #include <AnKi/Renderer/RendererObject.h>
  8. #include <AnKi/Resource/ImageResource.h>
  9. #include <AnKi/Util/BitSet.h>
  10. #include <AnKi/Shaders/Include/RtShadows.h>
  11. namespace anki
  12. {
  13. /// @addtogroup renderer
  14. /// @{
  15. /// Similar to ShadowmapsResolve but it's using ray tracing.
  16. class RtShadows : public RendererObject
  17. {
  18. public:
  19. RtShadows(Renderer* r)
  20. : RendererObject(r)
  21. {
  22. registerDebugRenderTarget("RtShadows");
  23. registerDebugRenderTarget("RtShadows1");
  24. registerDebugRenderTarget("RtShadows2");
  25. }
  26. ~RtShadows();
  27. ANKI_USE_RESULT Error init(const ConfigSet& cfg);
  28. void populateRenderGraph(RenderingContext& ctx);
  29. void getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
  30. ShaderProgramPtr& optionalShaderProgram) const override;
  31. RenderTargetHandle getRt() const
  32. {
  33. return m_runCtx.m_upscaledRt;
  34. }
  35. public:
  36. class ShadowLayer
  37. {
  38. public:
  39. U64 m_lightUuid = MAX_U64;
  40. U64 m_frameLastUsed = MAX_U64;
  41. };
  42. /// @name Render targets
  43. /// @{
  44. TexturePtr m_historyRt;
  45. RenderTargetDescription m_intermediateShadowsRtDescr;
  46. RenderTargetDescription m_upscaledRtDescr;
  47. Array<TexturePtr, 2> m_momentsRts;
  48. Array<TexturePtr, 2> m_historyLengthRts;
  49. RenderTargetDescription m_varianceRtDescr;
  50. /// @}
  51. /// @name Programs
  52. /// @{
  53. ShaderProgramResourcePtr m_rayGenProg;
  54. ShaderProgramPtr m_rtLibraryGrProg;
  55. U32 m_rayGenShaderGroupIdx = MAX_U32;
  56. ShaderProgramResourcePtr m_missProg;
  57. U32 m_missShaderGroupIdx = MAX_U32;
  58. ShaderProgramResourcePtr m_denoiseProg;
  59. ShaderProgramPtr m_grDenoiseHorizontalProg;
  60. ShaderProgramPtr m_grDenoiseVerticalProg;
  61. ShaderProgramResourcePtr m_svgfVarianceProg;
  62. ShaderProgramPtr m_svgfVarianceGrProg;
  63. ShaderProgramResourcePtr m_svgfAtrousProg;
  64. ShaderProgramPtr m_svgfAtrousGrProg;
  65. ShaderProgramPtr m_svgfAtrousLastPassGrProg;
  66. ShaderProgramResourcePtr m_upscaleProg;
  67. ShaderProgramPtr m_upscaleGrProg;
  68. ShaderProgramResourcePtr m_visualizeRenderTargetsProg;
  69. /// @}
  70. ImageResourcePtr m_blueNoiseImage;
  71. Array<ShadowLayer, MAX_RT_SHADOW_LAYERS> m_shadowLayers;
  72. U32 m_sbtRecordSize = 256;
  73. Bool m_rtsImportedOnce = false;
  74. Bool m_useSvgf = false;
  75. U8 m_atrousPassCount = 5;
  76. class
  77. {
  78. public:
  79. RenderingContext* m_ctx = nullptr;
  80. Array<RenderTargetHandle, 2> m_intermediateShadowsRts;
  81. RenderTargetHandle m_historyRt;
  82. RenderTargetHandle m_upscaledRt;
  83. RenderTargetHandle m_prevMomentsRt;
  84. RenderTargetHandle m_currentMomentsRt;
  85. RenderTargetHandle m_prevHistoryLengthRt;
  86. RenderTargetHandle m_currentHistoryLengthRt;
  87. Array<RenderTargetHandle, 2> m_varianceRts;
  88. BufferPtr m_sbtBuffer;
  89. PtrSize m_sbtOffset;
  90. U32 m_hitGroupCount = 0;
  91. BitSet<MAX_RT_SHADOW_LAYERS, U8> m_layersWithRejectedHistory = {false};
  92. U8 m_atrousPassIdx = 0;
  93. U8 m_denoiseOrientation = 0;
  94. } m_runCtx;
  95. ANKI_USE_RESULT Error initInternal(const ConfigSet& cfg);
  96. void run(RenderPassWorkContext& rgraphCtx);
  97. void runDenoise(RenderPassWorkContext& rgraphCtx);
  98. void runSvgfVariance(RenderPassWorkContext& rgraphCtx);
  99. void runSvgfAtrous(RenderPassWorkContext& rgraphCtx);
  100. void runUpscale(RenderPassWorkContext& rgraphCtx);
  101. void buildSbt();
  102. Bool findShadowLayer(U64 lightUuid, U32& layerIdx, Bool& rejectHistoryBuffer);
  103. U32 getPassCountWithoutUpscaling() const
  104. {
  105. return (m_useSvgf) ? (m_atrousPassCount + 2) : 3;
  106. }
  107. };
  108. /// @}
  109. } // namespace anki