HzbGenerator.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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 = {});
  37. void populateRenderGraphDirectionalLight(const HzbDirectionalLightInput& in, RenderGraphBuilder& rgraph);
  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 = 2 + kMaxShadowCascades; ///< Two for the main pass and a few for shadow cascades
  56. BufferPtr m_counterBuffer;
  57. U64 m_crntFrame = 0;
  58. U32 m_counterBufferElementSize = 0;
  59. U32 m_counterBufferCrntElementCount = 0;
  60. BufferPtr m_boxIndexBuffer;
  61. void populateRenderGraphInternal(ConstWeakArray<DispatchInput> dispatchInputs, CString customName, RenderGraphBuilder& rgraph);
  62. };
  63. /// @}
  64. } // end namespace anki