2
0

TraditionalDeferredShading.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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/RendererObject.h>
  7. #include <AnKi/Renderer/RenderQueue.h>
  8. namespace anki {
  9. /// @addtogroup renderer
  10. /// @{
  11. /// Parameters to be passed to TraditionalDeferredLightShading::drawLights.
  12. class TraditionalDeferredLightShadingDrawInfo
  13. {
  14. public:
  15. Mat4 m_viewProjectionMatrix;
  16. Mat4 m_invViewProjectionMatrix;
  17. Vec4 m_cameraPosWSpace;
  18. UVec4 m_viewport;
  19. Vec2 m_gbufferTexCoordsScale;
  20. Vec2 m_gbufferTexCoordsBias;
  21. Vec2 m_lightbufferTexCoordsScale;
  22. Vec2 m_lightbufferTexCoordsBias;
  23. F32 m_cameraNear;
  24. F32 m_cameraFar;
  25. const DirectionalLightQueueElement* m_directionalLight = nullptr;
  26. ConstWeakArray<PointLightQueueElement> m_pointLights;
  27. ConstWeakArray<SpotLightQueueElement> m_spotLights;
  28. const SkyboxQueueElement* m_skybox = nullptr;
  29. CommandBufferPtr m_commandBuffer;
  30. Bool m_computeSpecular = false;
  31. // Render targets
  32. Array<RenderTargetHandle, GBUFFER_COLOR_ATTACHMENT_COUNT - 1> m_gbufferRenderTargets;
  33. RenderTargetHandle m_gbufferDepthRenderTarget;
  34. RenderTargetHandle m_directionalLightShadowmapRenderTarget;
  35. RenderPassWorkContext* m_renderpassContext = nullptr;
  36. };
  37. /// Helper for drawing using traditional deferred shading.
  38. class TraditionalDeferredLightShading : public RendererObject
  39. {
  40. public:
  41. TraditionalDeferredLightShading(Renderer* r);
  42. ~TraditionalDeferredLightShading();
  43. Error init();
  44. /// Run the light shading. It will iterate over the lights and draw them. It doesn't bind anything related to
  45. /// GBuffer or the output buffer.
  46. void drawLights(TraditionalDeferredLightShadingDrawInfo& info);
  47. private:
  48. ShaderProgramResourcePtr m_lightProg;
  49. Array<ShaderProgramPtr, 2> m_plightGrProg;
  50. Array<ShaderProgramPtr, 2> m_slightGrProg;
  51. Array<ShaderProgramPtr, 2> m_dirLightGrProg;
  52. ShaderProgramResourcePtr m_skyboxProg;
  53. Array<ShaderProgramPtr, 2> m_skyboxGrProgs;
  54. /// @name Meshes of light volumes.
  55. /// @{
  56. MeshResourcePtr m_plightMesh;
  57. MeshResourcePtr m_slightMesh;
  58. /// @}
  59. SamplerPtr m_shadowSampler;
  60. static void bindVertexIndexBuffers(MeshResourcePtr& mesh, CommandBufferPtr& cmdb, U32& indexCount);
  61. };
  62. /// @}
  63. } // end namespace anki