HzbGenerator.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Copyright (C) 2009-present, 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/RendererObject.h>
  7. namespace anki {
  8. /// @addtogroup renderer
  9. /// @{
  10. /// @memberof HzbGenerator
  11. class HzbDirectionalLightInput
  12. {
  13. public:
  14. class Cascade
  15. {
  16. public:
  17. RenderTargetHandle m_hzbRt;
  18. UVec2 m_hzbRtSize;
  19. Mat3x4 m_viewMatrix;
  20. Mat4 m_projectionMatrix;
  21. F32 m_cascadeMaxDistance = -1.0f;
  22. };
  23. RenderTargetHandle m_depthBufferRt;
  24. UVec2 m_depthBufferRtSize;
  25. Mat4 m_cameraProjectionMatrix;
  26. Mat4 m_cameraInverseViewProjectionMatrix;
  27. Array<Cascade, kMaxShadowCascades> m_cascades;
  28. U32 m_cascadeCount = 0;
  29. };
  30. /// Hierarchical depth generator.
  31. class HzbGenerator : public RendererObject
  32. {
  33. public:
  34. Error init();
  35. void populateRenderGraph(RenderTargetHandle srcDepthRt, UVec2 srcDepthRtSize, RenderTargetHandle dstHzbRt, UVec2 dstHzbRtSize,
  36. RenderGraphBuilder& rgraph, CString customName = {}) const;
  37. void populateRenderGraphDirectionalLight(const HzbDirectionalLightInput& in, RenderGraphBuilder& rgraph) const;
  38. private:
  39. class DispatchInput
  40. {
  41. public:
  42. RenderTargetHandle m_srcDepthRt;
  43. UVec2 m_srcDepthRtSize;
  44. RenderTargetHandle m_dstHzbRt;
  45. UVec2 m_dstHzbRtSize;
  46. };
  47. ShaderProgramResourcePtr m_genPyramidProg;
  48. ShaderProgramPtr m_genPyramidGrProg;
  49. ShaderProgramResourcePtr m_maxDepthProg;
  50. ShaderProgramPtr m_maxDepthGrProg;
  51. ShaderProgramResourcePtr m_maxBoxProg;
  52. ShaderProgramPtr m_maxBoxGrProg;
  53. SamplerPtr m_maxSampler;
  54. // This class assumes that the populateRenderGraph and the populateRenderGraphDirectionalLight will be called once per frame
  55. static constexpr U32 kCounterBufferElementCount = 1 + kMaxShadowCascades; ///< One for the main pass and a few for shadow cascades
  56. U32 m_counterBufferElementSize = 0;
  57. BufferPtr m_counterBuffer;
  58. BufferPtr m_boxIndexBuffer;
  59. #if ANKI_ASSERTIONS_ENABLED
  60. // Some helper things to make sure that we don't re-use the counters inside a frame
  61. mutable U64 m_crntFrame = 0;
  62. mutable U8 m_counterBufferElementUseMask = 0;
  63. #endif
  64. void populateRenderGraphInternal(ConstWeakArray<DispatchInput> dispatchInputs, U32 firstCounterBufferElement, CString customName,
  65. RenderGraphBuilder& rgraph) const;
  66. };
  67. /// @}
  68. } // end namespace anki