3
0

ReflectionProbe.h 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <AzCore/Math/Transform.h>
  10. #include <Atom/Feature/RenderCommon.h>
  11. #include <Atom/Feature/Mesh/MeshFeatureProcessorInterface.h>
  12. #include <Atom/RPI.Public/Base.h>
  13. #include <Atom/RPI.Public/Model/Model.h>
  14. #include <Atom/RPI.Public/MeshDrawPacket.h>
  15. #include <Atom/RPI.Public/Pass/Specific/EnvironmentCubeMapPass.h>
  16. #include <Atom/RPI.Public/PipelineState.h>
  17. #include <Atom/RPI.Public/Shader/ShaderResourceGroup.h>
  18. #include <Atom/RPI.Public/Scene.h>
  19. #include <CubeMapCapture/CubeMapRenderer.h>
  20. namespace AZ
  21. {
  22. namespace Render
  23. {
  24. // shared data for rendering reflections, loaded and stored by the ReflectionProbeFeatureProcessor and passed to all probes
  25. struct ReflectionRenderData
  26. {
  27. AZStd::array<RHI::StreamBufferView, 1> m_boxPositionBufferView;
  28. RHI::IndexBufferView m_boxIndexBufferView;
  29. uint32_t m_boxIndexCount = 0;
  30. RPI::Ptr<RPI::PipelineStateForDraw> m_stencilPipelineState;
  31. RPI::Ptr<RPI::PipelineStateForDraw> m_blendWeightPipelineState;
  32. RPI::Ptr<RPI::PipelineStateForDraw> m_renderOuterPipelineState;
  33. RPI::Ptr<RPI::PipelineStateForDraw> m_renderInnerPipelineState;
  34. Data::Instance<RPI::Shader> m_stencilShader;
  35. RHI::Ptr<RHI::ShaderResourceGroupLayout> m_stencilSrgLayout;
  36. Data::Instance<RPI::Shader> m_blendWeightShader;
  37. RHI::Ptr<RHI::ShaderResourceGroupLayout> m_blendWeightSrgLayout;
  38. Data::Instance<RPI::Shader> m_renderOuterShader;
  39. RHI::Ptr<RHI::ShaderResourceGroupLayout> m_renderOuterSrgLayout;
  40. Data::Instance<RPI::Shader> m_renderInnerShader;
  41. RHI::Ptr<RHI::ShaderResourceGroupLayout> m_renderInnerSrgLayout;
  42. RHI::DrawListTag m_stencilDrawListTag;
  43. RHI::DrawListTag m_blendWeightDrawListTag;
  44. RHI::DrawListTag m_renderOuterDrawListTag;
  45. RHI::DrawListTag m_renderInnerDrawListTag;
  46. RHI::ShaderInputNameIndex m_modelToWorldStencilConstantIndex = "m_modelToWorld";
  47. RHI::ShaderInputNameIndex m_modelToWorldRenderConstantIndex = "m_modelToWorld";
  48. RHI::ShaderInputNameIndex m_modelToWorldInverseRenderConstantIndex = "m_modelToWorldInverse";
  49. RHI::ShaderInputNameIndex m_outerObbHalfLengthsRenderConstantIndex = "m_outerObbHalfLengths";
  50. RHI::ShaderInputNameIndex m_innerObbHalfLengthsRenderConstantIndex = "m_innerObbHalfLengths";
  51. RHI::ShaderInputNameIndex m_useParallaxCorrectionRenderConstantIndex = "m_useParallaxCorrection";
  52. RHI::ShaderInputNameIndex m_exposureConstantIndex = "m_exposure";
  53. RHI::ShaderInputNameIndex m_reflectionCubeMapRenderImageIndex = "m_reflectionCubeMap";
  54. };
  55. // ReflectionProbe manages all aspects of a single probe, including rendering, visualization, and cubemap generation
  56. class ReflectionProbe final
  57. : public AZ::Data::AssetBus::Handler
  58. , private CubeMapRenderer
  59. {
  60. public:
  61. ReflectionProbe() = default;
  62. ~ReflectionProbe();
  63. void Init(RPI::Scene* scene, ReflectionRenderData* reflectionRenderData);
  64. void Simulate(uint32_t probeIndex);
  65. void OnRenderEnd();
  66. const Vector3& GetPosition() const { return m_transform.GetTranslation(); }
  67. const AZ::Transform& GetTransform() const { return m_transform; }
  68. void SetTransform(const AZ::Transform& transform);
  69. const AZ::Vector3& GetOuterExtents() const { return m_outerExtents; }
  70. void SetOuterExtents(const AZ::Vector3& outerExtents);
  71. const AZ::Vector3& GetInnerExtents() const { return m_innerExtents; }
  72. void SetInnerExtents(const AZ::Vector3& innerExtents);
  73. const Obb& GetOuterObbWs() const { return m_outerObbWs; }
  74. const Obb& GetInnerObbWs() const { return m_innerObbWs; }
  75. const Data::Instance<RPI::Image>& GetCubeMapImage() const { return m_cubeMapImage; }
  76. void SetCubeMapImage(const Data::Instance<RPI::Image>& cubeMapImage, const AZStd::string& relativePath);
  77. const AZStd::string& GetCubeMapRelativePath() const { return m_cubeMapRelativePath; }
  78. bool GetUseParallaxCorrection() const { return m_useParallaxCorrection; }
  79. void SetUseParallaxCorrection(bool useParallaxCorrection) { m_useParallaxCorrection = useParallaxCorrection; }
  80. const AZ::Uuid& GetUuid() const { return m_uuid; }
  81. // initiates the reflection probe bake and invokes the callback when the cubemap is finished rendering
  82. void Bake(RenderCubeMapCallback callback);
  83. // called by the feature processor so the probe can set the default view for the pipeline
  84. void OnRenderPipelinePassesChanged(RPI::RenderPipeline* renderPipeline);
  85. // enables or disables rendering of the visualization sphere
  86. void ShowVisualization(bool showVisualization);
  87. // the exposure to use when rendering meshes with this probe's cubemap
  88. void SetRenderExposure(float renderExposure);
  89. float GetRenderExposure() const { return m_renderExposure; }
  90. // the exposure to use when baking the probe cubemap
  91. void SetBakeExposure(float bakeExposure);
  92. float GetBakeExposure() const { return m_bakeExposure; }
  93. private:
  94. AZ_DISABLE_COPY_MOVE(ReflectionProbe);
  95. const RHI::DrawPacket* BuildDrawPacket(
  96. const Data::Instance<RPI::ShaderResourceGroup>& srg,
  97. const RPI::Ptr<RPI::PipelineStateForDraw>& pipelineState,
  98. const RHI::DrawListTag& drawListTag,
  99. uint32_t stencilRef);
  100. void UpdateCulling();
  101. // AZ::Data::AssetBus::Handler overrides...
  102. void OnAssetReady(Data::Asset<Data::AssetData> asset) override;
  103. void OnAssetError(Data::Asset<Data::AssetData> asset) override;
  104. // scene
  105. RPI::Scene* m_scene = nullptr;
  106. // probe volume transform
  107. AZ::Transform m_transform = AZ::Transform::CreateIdentity();
  108. // extents of the probe volume
  109. AZ::Vector3 m_outerExtents = AZ::Vector3(0.0f, 0.0f, 0.0f);
  110. AZ::Vector3 m_innerExtents = AZ::Vector3(0.0f, 0.0f, 0.0f);
  111. // probe volume OBBs (world space), built from position and extents
  112. Obb m_outerObbWs;
  113. Obb m_innerObbWs;
  114. // cubemap
  115. Data::Instance<RPI::Image> m_cubeMapImage;
  116. AZStd::string m_cubeMapRelativePath;
  117. bool m_useParallaxCorrection = false;
  118. // probe visualization
  119. AZ::Render::MeshFeatureProcessorInterface* m_meshFeatureProcessor = nullptr;
  120. Data::Asset<RPI::ModelAsset> m_visualizationModelAsset;
  121. Data::Asset<RPI::MaterialAsset> m_visualizationMaterialAsset;
  122. AZ::Render::MeshFeatureProcessorInterface::MeshHandle m_visualizationMeshHandle;
  123. // reflection rendering
  124. ReflectionRenderData* m_reflectionRenderData = nullptr;
  125. Data::Instance<RPI::ShaderResourceGroup> m_stencilSrg;
  126. Data::Instance<RPI::ShaderResourceGroup> m_blendWeightSrg;
  127. Data::Instance<RPI::ShaderResourceGroup> m_renderOuterSrg;
  128. Data::Instance<RPI::ShaderResourceGroup> m_renderInnerSrg;
  129. RHI::ConstPtr<RHI::DrawPacket> m_stencilDrawPacket;
  130. RHI::ConstPtr<RHI::DrawPacket> m_blendWeightDrawPacket;
  131. RHI::ConstPtr<RHI::DrawPacket> m_renderOuterDrawPacket;
  132. RHI::ConstPtr<RHI::DrawPacket> m_renderInnerDrawPacket;
  133. float m_renderExposure = 0.0f;
  134. float m_bakeExposure = 0.0f;
  135. bool m_updateSrg = false;
  136. const RHI::DrawItemSortKey InvalidSortKey = static_cast<RHI::DrawItemSortKey>(-1);
  137. RHI::DrawItemSortKey m_sortKey = InvalidSortKey;
  138. // culling
  139. RPI::Cullable m_cullable;
  140. AZ::Uuid m_uuid = AZ::Uuid::Create();
  141. };
  142. } // namespace Render
  143. } // namespace AZ