2
0
Panagiotis Christopoulos Charitos 7 сар өмнө
parent
commit
308e300d06

+ 30 - 14
AnKi/Renderer/IndirectDiffuseClipmaps.cpp

@@ -274,7 +274,8 @@ void IndirectDiffuseClipmaps::populateRenderGraph(RenderingContext& ctx)
 			pass.newTextureDependency(irradianceVolumes[clipmap], TextureUsageBit::kSrvCompute);
 		}
 
-		pass.setWork([this, rtResultHandle, &ctx, sbtBuffer, irradianceVolumes](RenderPassWorkContext& rgraphCtx) {
+		pass.setWork([this, rtResultHandle, &ctx, sbtBuffer, irradianceVolumes, probeValidityVolumes,
+					  distanceMomentsVolumes](RenderPassWorkContext& rgraphCtx) {
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_libraryGrProg.get());
@@ -295,12 +296,8 @@ void IndirectDiffuseClipmaps::populateRenderGraph(RenderingContext& ctx)
 
 			cmdb.bindConstantBuffer(0, 2, ctx.m_globalRenderingConstantsBuffer);
 
-			rgraphCtx.bindSrv(0, 2, getRenderer().getAccelerationStructureBuilder().getAccelerationStructureHandle());
-
-			for(U32 clipmap = 0; clipmap < kIndirectDiffuseClipmapCount; ++clipmap)
-			{
-				rgraphCtx.bindSrv(1 + clipmap, 2, irradianceVolumes[clipmap]);
-			}
+			U32 srv = 0;
+			rgraphCtx.bindSrv(srv++, 2, getRenderer().getAccelerationStructureBuilder().getAccelerationStructureHandle());
 
 			const LightComponent* dirLight = SceneGraph::getSingleton().getDirectionalLight();
 			const SkyboxComponent* sky = SceneGraph::getSingleton().getSkybox();
@@ -308,20 +305,39 @@ void IndirectDiffuseClipmaps::populateRenderGraph(RenderingContext& ctx)
 				(!sky || sky->getSkyboxType() == SkyboxType::kSolidColor || (!dirLight && sky->getSkyboxType() == SkyboxType::kGenerated));
 			if(bSkySolidColor)
 			{
-				cmdb.bindSrv(4, 2, TextureView(getDummyGpuResources().m_texture2DSrv.get(), TextureSubresourceDesc::all()));
+				cmdb.bindSrv(srv++, 2, TextureView(getDummyGpuResources().m_texture2DSrv.get(), TextureSubresourceDesc::all()));
 			}
 			else if(sky->getSkyboxType() == SkyboxType::kImage2D)
 			{
-				cmdb.bindSrv(4, 2, TextureView(&sky->getImageResource().getTexture(), TextureSubresourceDesc::all()));
+				cmdb.bindSrv(srv++, 2, TextureView(&sky->getImageResource().getTexture(), TextureSubresourceDesc::all()));
 			}
 			else
 			{
-				rgraphCtx.bindSrv(4, 2, getRenderer().getGeneratedSky().getEnvironmentMapRt());
+				rgraphCtx.bindSrv(srv++, 2, getRenderer().getGeneratedSky().getEnvironmentMapRt());
+			}
+
+			rgraphCtx.bindSrv(srv++, 2, getRenderer().getShadowMapping().getShadowmapRt());
+
+			cmdb.bindSrv(srv++, 2, BufferView(getDummyGpuResources().m_buffer.get(), 0, sizeof(U32)));
+			cmdb.bindSrv(srv++, 2, BufferView(getDummyGpuResources().m_buffer.get(), 0, sizeof(U32)));
+
+			for(U32 clipmap = 0; clipmap < kIndirectDiffuseClipmapCount; ++clipmap)
+			{
+				rgraphCtx.bindSrv(srv++, 2, irradianceVolumes[clipmap]);
+			}
+			for(U32 clipmap = 0; clipmap < kIndirectDiffuseClipmapCount; ++clipmap)
+			{
+				rgraphCtx.bindSrv(srv++, 2, probeValidityVolumes[clipmap]);
+			}
+			for(U32 clipmap = 0; clipmap < kIndirectDiffuseClipmapCount; ++clipmap)
+			{
+				rgraphCtx.bindSrv(srv++, 2, distanceMomentsVolumes[clipmap]);
 			}
 
-			cmdb.bindSrv(5, 2, BufferView(getDummyGpuResources().m_buffer.get(), 0, sizeof(U32)));
-			cmdb.bindSrv(6, 2, BufferView(getDummyGpuResources().m_buffer.get(), 0, sizeof(U32)));
-			rgraphCtx.bindSrv(7, 2, getRenderer().getShadowMapping().getShadowmapRt());
+			for(U32 i = 0; i < 3; ++i)
+			{
+				cmdb.bindSrv(srv++, 2, TextureView(getDummyGpuResources().m_texture2DSrv.get(), TextureSubresourceDesc::all()));
+			}
 
 			cmdb.bindSampler(0, 2, getRenderer().getSamplers().m_trilinearClamp.get());
 			cmdb.bindSampler(1, 2, getRenderer().getSamplers().m_trilinearClampShadow.get());
@@ -338,7 +354,7 @@ void IndirectDiffuseClipmaps::populateRenderGraph(RenderingContext& ctx)
 				const UVec4 consts(clipmap, g_indirectDiffuseClipmapRadianceOctMapSize, 0, 0);
 				cmdb.setFastConstants(&consts, sizeof(consts));
 
-				const U32 probeCount = U32(m_clipmapInfo[0].m_probeCountTotal);
+				const U32 probeCount = m_clipmapInfo[0].m_probeCountTotal;
 				cmdb.traceRays(sbtBuffer, m_sbtRecordSize, GpuSceneArrays::RenderableBoundingVolumeRt::getSingleton().getElementCount(), 1,
 							   probeCount * raysPerProbePerFrame, 1, 1);
 			}

+ 20 - 14
AnKi/Renderer/Reflections.cpp

@@ -351,10 +351,8 @@ void Reflections::populateRenderGraph(RenderingContext& ctx)
 
 			cmdb.bindConstantBuffer(0, 2, ctx.m_globalRenderingConstantsBuffer);
 
-			rgraphCtx.bindSrv(0, 2, getRenderer().getAccelerationStructureBuilder().getAccelerationStructureHandle());
-			rgraphCtx.bindSrv(1, 2, getRenderer().getGBuffer().getDepthRt());
-			rgraphCtx.bindSrv(2, 2, getRenderer().getGBuffer().getColorRt(1));
-			rgraphCtx.bindSrv(3, 2, getRenderer().getGBuffer().getColorRt(2));
+			U32 srv = 0;
+			rgraphCtx.bindSrv(srv++, 2, getRenderer().getAccelerationStructureBuilder().getAccelerationStructureHandle());
 
 			const LightComponent* dirLight = SceneGraph::getSingleton().getDirectionalLight();
 			const SkyboxComponent* sky = SceneGraph::getSingleton().getSkybox();
@@ -362,24 +360,32 @@ void Reflections::populateRenderGraph(RenderingContext& ctx)
 				(!sky || sky->getSkyboxType() == SkyboxType::kSolidColor || (!dirLight && sky->getSkyboxType() == SkyboxType::kGenerated));
 			if(bSkySolidColor)
 			{
-				cmdb.bindSrv(4, 2, TextureView(getDummyGpuResources().m_texture2DSrv.get(), TextureSubresourceDesc::all()));
+				cmdb.bindSrv(srv++, 2, TextureView(getDummyGpuResources().m_texture2DSrv.get(), TextureSubresourceDesc::all()));
 			}
 			else if(sky->getSkyboxType() == SkyboxType::kImage2D)
 			{
-				cmdb.bindSrv(4, 2, TextureView(&sky->getImageResource().getTexture(), TextureSubresourceDesc::all()));
+				cmdb.bindSrv(srv++, 2, TextureView(&sky->getImageResource().getTexture(), TextureSubresourceDesc::all()));
 			}
 			else
 			{
-				rgraphCtx.bindSrv(4, 2, getRenderer().getGeneratedSky().getEnvironmentMapRt());
+				rgraphCtx.bindSrv(srv++, 2, getRenderer().getGeneratedSky().getEnvironmentMapRt());
 			}
 
-			cmdb.bindSrv(
-				5, 2,
-				(GpuSceneArrays::GlobalIlluminationProbe::getSingleton().getElementCount())
-					? GpuSceneArrays::GlobalIlluminationProbe::getSingleton().getBufferView()
-					: BufferView(getDummyGpuResources().m_buffer.get(), 0, GpuSceneArrays::GlobalIlluminationProbe::getSingleton().getElementSize()));
-			cmdb.bindSrv(6, 2, pixelsFailedSsrBuff);
-			rgraphCtx.bindSrv(7, 2, getRenderer().getShadowMapping().getShadowmapRt());
+			rgraphCtx.bindSrv(srv++, 2, getRenderer().getShadowMapping().getShadowmapRt());
+
+			const auto& arr = GpuSceneArrays::GlobalIlluminationProbe::getSingleton();
+			cmdb.bindSrv(srv++, 2,
+						 (arr.getElementCount()) ? arr.getBufferView() : BufferView(getDummyGpuResources().m_buffer.get(), 0, arr.getElementSize()));
+			cmdb.bindSrv(srv++, 2, pixelsFailedSsrBuff);
+
+			for(U32 clipmap = 0; clipmap < kIndirectDiffuseClipmapCount * 3; ++clipmap)
+			{
+				cmdb.bindSrv(srv++, 2, TextureView(getDummyGpuResources().m_texture3DSrv.get(), TextureSubresourceDesc::all()));
+			}
+
+			rgraphCtx.bindSrv(srv++, 2, getRenderer().getGBuffer().getDepthRt());
+			rgraphCtx.bindSrv(srv++, 2, getRenderer().getGBuffer().getColorRt(1));
+			rgraphCtx.bindSrv(srv++, 2, getRenderer().getGBuffer().getColorRt(2));
 
 			rgraphCtx.bindUav(0, 2, transientRt1);
 			rgraphCtx.bindUav(1, 2, hitPosAndDepthRt);

+ 2 - 1
AnKi/Shaders/IndirectDiffuseClipmaps.ankiprog

@@ -647,6 +647,7 @@ Vec3 decodeAtomicColor(U32 x, U32 y)
 		irradianceTexelCoord.y += y;
 
 		const Vec3 irradiance = decodeAtomicColor(x, y) * k2Pi;
+
 		TEX(g_irradianceVolumes[clipmapIdx], irradianceTexelCoord).xyz = irradiance;
 
 		// Write the borders
@@ -720,7 +721,7 @@ SamplerState g_linearAnyRepeatSampler : register(s0);
 														 g_linearAnyRepeatSampler);
 #	endif
 
-	g_outTex[svDispatchThreadId.xy].xyz = irradiance;
+	TEX(g_outTex, svDispatchThreadId.xy).xyz = irradiance;
 }
 #endif
 

+ 18 - 12
AnKi/Shaders/RtMaterialFetch.hlsl

@@ -27,25 +27,31 @@ ConstantBuffer<GlobalRendererConstants> g_globalRendererConstants : register(b0,
 
 // SRVs
 RaytracingAccelerationStructure g_tlas : register(t0, SPACE);
+
+Texture2D<Vec4> g_envMap : register(t1, SPACE);
+Texture2D<Vec4> g_shadowAtlasTex : register(t2, SPACE);
+
 #	if defined(CLIPMAP_VOLUME)
-Texture3D<Vec4> g_irradianceVolumes[kIndirectDiffuseClipmapCount] : register(t1, SPACE);
+StructuredBuffer<U32> g_dummyBuff1 : register(t3, SPACE);
+StructuredBuffer<U32> g_dummyBuff2 : register(t4, SPACE);
 #	else
-Texture2D<Vec4> g_gbufferTextures[kIndirectDiffuseClipmapCount] : register(t1, SPACE);
-#		define g_depthTex g_gbufferTextures[0]
-#		define g_gbufferRt1 g_gbufferTextures[1]
-#		define g_gbufferRt2 g_gbufferTextures[2]
+StructuredBuffer<GpuSceneGlobalIlluminationProbe> g_giProbes : register(t3, SPACE);
+StructuredBuffer<PixelFailedSsr> g_pixelsFailedSsr : register(t4, SPACE);
 #	endif
-Texture2D<Vec4> g_envMap : register(t4, SPACE);
 
 #	if defined(CLIPMAP_VOLUME)
-StructuredBuffer<U32> g_dummyBuff1 : register(t5, SPACE);
-StructuredBuffer<U32> g_dummyBuff2 : register(t6, SPACE);
-#	else
-StructuredBuffer<GpuSceneGlobalIlluminationProbe> g_giProbes : register(t5, SPACE);
-StructuredBuffer<PixelFailedSsr> g_pixelsFailedSsr : register(t6, SPACE);
+Texture3D<Vec4> g_irradianceVolumes[kIndirectDiffuseClipmapCount] : register(t5, SPACE);
+Texture3D<Vec4> g_probeValidityVolumes[kIndirectDiffuseClipmapCount] : register(t8, SPACE); // WARNING: Adjust if kIndirectDiffuseClipmapCount changed
+Texture3D<Vec4> g_distanceMomentsVolumes[kIndirectDiffuseClipmapCount] : register(t11, SPACE);
 #	endif
 
-Texture2D<Vec4> g_shadowAtlasTex : register(t7, SPACE);
+#	if defined(CLIPMAP_VOLUME)
+Texture2D<Vec4> g_dummyTex[3] : register(t14, SPACE);
+#	else
+Texture2D<Vec4> g_depthTex : register(t14, SPACE);
+Texture2D<Vec4> g_gbufferRt1 : register(t15, SPACE);
+Texture2D<Vec4> g_gbufferRt2 : register(t16, SPACE);
+#	endif
 
 // UAVs
 #	if defined(CLIPMAP_VOLUME)