Integrating latest 47acbe8

This commit is contained in:
alexpete
2021-03-25 13:57:57 -07:00
parent 448c549698
commit 75dc720198
10312 changed files with 2711566 additions and 671451 deletions
@@ -30,6 +30,7 @@ namespace AZ
ReflectionProbe::~ReflectionProbe()
{
m_scene->GetCullingSystem()->UnregisterCullable(m_cullable);
m_meshFeatureProcessor->ReleaseMesh(m_visualizationMeshHandle);
}
@@ -37,10 +38,11 @@ namespace AZ
{
AZ_Assert(scene, "ReflectionProbe::Init called with a null Scene pointer");
m_scene = scene;
m_reflectionRenderData = reflectionRenderData;
// load visualization sphere model and material
m_meshFeatureProcessor = scene->GetFeatureProcessor<Render::MeshFeatureProcessorInterface>();
m_meshFeatureProcessor = m_scene->GetFeatureProcessor<Render::MeshFeatureProcessorInterface>();
m_visualizationModelAsset = AZ::RPI::AssetUtils::GetAssetByProductPath<AZ::RPI::ModelAsset>(
"Models/ReflectionProbeSphere.azmodel",
@@ -67,24 +69,29 @@ namespace AZ
m_renderInnerSrg = RPI::ShaderResourceGroup::Create(m_reflectionRenderData->m_renderInnerSrgAsset);
AZ_Error("ReflectionProbeFeatureProcessor", m_renderInnerSrg.get(), "Failed to create render inner reflection shader resource group");
// setup culling
m_cullable.m_cullData.m_scene = m_scene;
m_cullable.SetDebugName(AZ::Name("ReflectionProbe Volume"));
}
void ReflectionProbe::Simulate(RPI::Scene* scene, [[maybe_unused]] ReflectionProbeFeatureProcessor* featureProcessor, uint32_t probeIndex)
void ReflectionProbe::Simulate(uint32_t probeIndex)
{
AZ_Assert(scene, "ReflectionProbe::Simulate called with a null Scene pointer");
if (m_buildingCubeMap && m_environmentCubeMapPass->IsFinished())
{
// all faces of the cubemap have been rendered, invoke the callback
m_callback(m_environmentCubeMapPass->GetTextureData(), m_environmentCubeMapPass->GetTextureFormat());
// remove the pipeline
scene->RemoveRenderPipeline(m_environmentCubeMapPipelineId);
m_scene->RemoveRenderPipeline(m_environmentCubeMapPipelineId);
m_environmentCubeMapPass = nullptr;
m_buildingCubeMap = false;
}
// track if we need to update culling based on changes to the draw packets or Srg
bool updateCulling = false;
if (m_updateSrg)
{
// stencil Srg
@@ -130,6 +137,7 @@ namespace AZ
m_renderInnerSrg->Compile();
m_updateSrg = false;
updateCulling = true;
}
// the list index passed in from the feature processor is the index of this probe in the sorted probe list.
@@ -150,44 +158,26 @@ namespace AZ
m_blendWeightSrg,
m_reflectionRenderData->m_blendWeightPipelineState,
m_reflectionRenderData->m_blendWeightDrawListTag,
Render::StencilRefs::UseSpecularIBLPass);
Render::StencilRefs::UseIBLSpecularPass);
m_renderOuterDrawPacket = BuildDrawPacket(
m_renderOuterSrg,
m_reflectionRenderData->m_renderOuterPipelineState,
m_reflectionRenderData->m_renderOuterDrawListTag,
Render::StencilRefs::UseSpecularIBLPass);
Render::StencilRefs::UseIBLSpecularPass);
m_renderInnerDrawPacket = BuildDrawPacket(
m_renderInnerSrg,
m_reflectionRenderData->m_renderInnerPipelineState,
m_reflectionRenderData->m_renderInnerDrawListTag,
Render::StencilRefs::UseSpecularIBLPass);
}
}
Render::StencilRefs::UseIBLSpecularPass);
void ReflectionProbe::RenderReflections(RPI::ViewPtr view)
{
// [GFX TODO][ATOM-4364] Add culling for reflection probe volumes
updateCulling = true;
}
if (view->HasDrawListTag(m_reflectionRenderData->m_stencilDrawListTag))
if (updateCulling)
{
view->AddDrawPacket(m_stencilDrawPacket.get());
}
if (view->HasDrawListTag(m_reflectionRenderData->m_blendWeightDrawListTag))
{
view->AddDrawPacket(m_blendWeightDrawPacket.get());
}
if (view->HasDrawListTag(m_reflectionRenderData->m_renderOuterDrawListTag))
{
view->AddDrawPacket(m_renderOuterDrawPacket.get());
}
if (view->HasDrawListTag(m_reflectionRenderData->m_renderInnerDrawListTag))
{
view->AddDrawPacket(m_renderInnerDrawPacket.get());
UpdateCulling();
}
}
@@ -220,7 +210,7 @@ namespace AZ
m_updateSrg = true;
}
void ReflectionProbe::BuildCubeMap(RPI::Scene* scene, BuildCubeMapCallback callback)
void ReflectionProbe::BuildCubeMap(BuildCubeMapCallback callback)
{
AZ_Assert(m_buildingCubeMap == false, "ReflectionProbe::BuildCubeMap called while a cubemap build was already in progress");
if (m_buildingCubeMap)
@@ -254,7 +244,7 @@ namespace AZ
const RPI::Ptr<RPI::ParentPass>& rootPass = environmentCubeMapPipeline->GetRootPass();
rootPass->AddChild(m_environmentCubeMapPass);
scene->AddRenderPipeline(environmentCubeMapPipeline);
m_scene->AddRenderPipeline(environmentCubeMapPipeline);
}
void ReflectionProbe::OnRenderPipelinePassesChanged(RPI::RenderPipeline* renderPipeline)
@@ -308,5 +298,47 @@ namespace AZ
return drawPacketBuilder.End();
}
void ReflectionProbe::UpdateCulling()
{
// set draw list mask
m_cullable.m_cullData.m_drawListMask.reset();
m_cullable.m_cullData.m_drawListMask =
m_stencilDrawPacket->GetDrawListMask() |
m_blendWeightDrawPacket->GetDrawListMask() |
m_renderOuterDrawPacket->GetDrawListMask() |
m_renderInnerDrawPacket->GetDrawListMask();
// setup the Lod entry, using one entry for all four draw packets
m_cullable.m_lodData.m_lods.clear();
m_cullable.m_lodData.m_lods.resize(1);
RPI::Cullable::LodData::Lod& lod = m_cullable.m_lodData.m_lods.back();
// add draw packets
lod.m_drawPackets.push_back(m_stencilDrawPacket.get());
lod.m_drawPackets.push_back(m_blendWeightDrawPacket.get());
lod.m_drawPackets.push_back(m_renderOuterDrawPacket.get());
lod.m_drawPackets.push_back(m_renderInnerDrawPacket.get());
// set screen coverage
// probe volume should cover at least a screen pixel at 1080p to be drawn
static const float MinimumScreenCoverage = 1.0f / 1080.0f;
lod.m_screenCoverageMin = MinimumScreenCoverage;
lod.m_screenCoverageMax = 1.0f;
// update cullable bounds
Vector3 center;
float radius;
m_outerAabbWs.GetAsSphere(center, radius);
m_cullable.m_cullData.m_boundingSphere = Sphere(center, radius);
m_cullable.m_cullData.m_boundingObb = m_outerAabbWs.GetTransformedObb(AZ::Transform::CreateIdentity());
m_cullable.m_cullData.m_visibilityEntry.m_boundingVolume = m_outerAabbWs;
m_cullable.m_cullData.m_visibilityEntry.m_userData = &m_cullable;
m_cullable.m_cullData.m_visibilityEntry.m_typeFlags = AzFramework::VisibilityEntry::TYPE_RPI_Cullable;
// register with culling system
m_scene->GetCullingSystem()->RegisterOrUpdateCullable(m_cullable);
}
} // namespace Render
} // namespace AZ