RtShadows.h 3.4 KB

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