Prechádzať zdrojové kódy

Renderer: Add some missing functionality to the indirect diffuse

Panagiotis Christopoulos Charitos 1 týždeň pred
rodič
commit
508e39c8d7

+ 24 - 7
AnKi/Renderer/IndirectDiffuseClipmaps.cpp

@@ -278,6 +278,7 @@ Error IndirectDiffuseClipmaps::init()
 	ANKI_CHECK(loadShaderProgram(kProgFname, mutation, m_prog, m_spatialReconstructGrProg, "SpatialReconstruct"));
 	ANKI_CHECK(loadShaderProgram(kProgFname, mutation, m_prog, m_bilateralDenoiseGrProg, "BilateralDenoise"));
 	ANKI_CHECK(loadShaderProgram(kProgFname, mutation, m_prog, m_rtMaterialFetchInlineRtGrProg, "RtMaterialFetchInlineRt"));
+	ANKI_CHECK(loadShaderProgram(kProgFname, mutation, m_prog, m_applyGiUsingInlineRtGrProg, "ApplyInlineRt"));
 
 	for(MutatorValue rtMaterialFetchClipmap = 0; rtMaterialFetchClipmap < 2; ++rtMaterialFetchClipmap)
 	{
@@ -673,12 +674,18 @@ void IndirectDiffuseClipmaps::populateRenderGraph(RenderingContext& ctx)
 	// Apply GI
 	if(firstBounceUsesRt)
 	{
-		patchShaderBindingTablePass("IndirectDiffuseClipmaps: Patch SBT", m_rtLibraryGrProg.get(), m_rayGenShaderGroupIndices[0],
-									m_missShaderGroupIdx, m_sbtRecordSize, rgraph, sbtHandle, sbtBuffer);
+		if(!g_cvarRenderIdcInlineRt)
+		{
+			patchShaderBindingTablePass("IndirectDiffuseClipmaps: Patch SBT", m_rtLibraryGrProg.get(), m_rayGenShaderGroupIndices[0],
+										m_missShaderGroupIdx, m_sbtRecordSize, rgraph, sbtHandle, sbtBuffer);
+		}
 
 		NonGraphicsRenderPass& pass = rgraph.newNonGraphicsRenderPass("IndirectDiffuseClipmaps: RTApply");
 
-		pass.newBufferDependency(sbtHandle, BufferUsageBit::kShaderBindingTable);
+		if(!g_cvarRenderIdcInlineRt)
+		{
+			pass.newBufferDependency(sbtHandle, BufferUsageBit::kShaderBindingTable);
+		}
 
 		for(U32 clipmap = 0; clipmap < kIndirectDiffuseClipmapCount; ++clipmap)
 		{
@@ -693,8 +700,6 @@ void IndirectDiffuseClipmaps::populateRenderGraph(RenderingContext& ctx)
 		pass.setWork([this, &ctx, sbtBuffer, lowRezRt](RenderPassWorkContext& rgraphCtx) {
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
-			cmdb.bindShaderProgram(m_rtLibraryGrProg.get());
-
 			// More globals
 			cmdb.bindSampler(ANKI_MATERIAL_REGISTER_TILINEAR_REPEAT_SAMPLER, 0, getRenderer().getSamplers().m_trilinearRepeat.get());
 			cmdb.bindSrv(ANKI_MATERIAL_REGISTER_GPU_SCENE, 0, GpuSceneBuffer::getSingleton().getBufferView());
@@ -718,8 +723,20 @@ void IndirectDiffuseClipmaps::populateRenderGraph(RenderingContext& ctx)
 
 			const U32 width = getRenderer().getInternalResolution().x() / 2;
 			const U32 height = getRenderer().getInternalResolution().y() / (!g_cvarRenderIdcApplyHighQuality + 1);
-			cmdb.dispatchRays(sbtBuffer, m_sbtRecordSize, GpuSceneArrays::RenderableBoundingVolumeRt::getSingleton().getElementCount(), 1, width,
-							  height, 1);
+
+			if(g_cvarRenderIdcInlineRt)
+			{
+				cmdb.bindShaderProgram(m_applyGiUsingInlineRtGrProg.get());
+
+				dispatchPPCompute(cmdb, 8, 8, width, height);
+			}
+			else
+			{
+				cmdb.bindShaderProgram(m_rtLibraryGrProg.get());
+
+				cmdb.dispatchRays(sbtBuffer, m_sbtRecordSize, GpuSceneArrays::RenderableBoundingVolumeRt::getSingleton().getElementCount(), 1, width,
+								  height, 1);
+			}
 
 			g_svarIdcRays.increment(width * height);
 		});

+ 2 - 1
AnKi/Renderer/IndirectDiffuseClipmaps.h

@@ -56,7 +56,7 @@ ANKI_CVAR2(
 	"Size of the octahedral for the light cache")
 ANKI_CVAR2(NumericCVar<U32>, Render, Idc, IrradianceOctMapSize, 5, 4, 20, "Size of the octahedral for the irradiance")
 
-ANKI_CVAR2(NumericCVar<F32>, Render, Idc, FirstBounceRayDistance, 0.0f, 0.0f, 10000.0f,
+ANKI_CVAR2(NumericCVar<F32>, Render, Idc, FirstBounceRayDistance, (ANKI_PLATFORM_MOBILE) ? 0.0f : 10.0f, 0.0f, 10000.0f,
 		   "For the 1st bounce shoot rays instead of sampling the clipmaps")
 ANKI_CVAR2(BoolCVar, Render, Idc, ApplyHighQuality, false, "If true use 1/2 resolution else use 1/4")
 ANKI_CVAR2(NumericCVar<U8>, Render, Idc, RayCountPerTexelOfNewProbe, kDefaultRayCountPerTexelOfNewProbe, 1, 16,
@@ -139,6 +139,7 @@ private:
 	ShaderProgramPtr m_populateCachesGrProg;
 	ShaderProgramPtr m_computeIrradianceGrProg;
 	ShaderProgramPtr m_applyGiGrProg;
+	ShaderProgramPtr m_applyGiUsingInlineRtGrProg;
 	ShaderProgramPtr m_visProbesGrProg;
 	ShaderProgramPtr m_temporalDenoiseGrProg;
 	ShaderProgramPtr m_spatialReconstructGrProg;

+ 30 - 6
AnKi/Shaders/IndirectDiffuseClipmaps.ankiprog

@@ -15,6 +15,7 @@
 #pragma anki technique PopulateCaches comp mutators RADIANCE_OCTAHEDRON_MAP_SIZE
 #pragma anki technique ComputeIrradiance comp mutators GPU_WAVE_SIZE RADIANCE_OCTAHEDRON_MAP_SIZE IRRADIANCE_OCTAHEDRON_MAP_SIZE IRRADIANCE_USE_SH_L2
 #pragma anki technique Apply comp mutators SPATIAL_RECONSTRUCT_TYPE
+#pragma anki technique ApplyInlineRt comp mutators SPATIAL_RECONSTRUCT_TYPE
 #pragma anki technique SpatialReconstruct comp mutators SPATIAL_RECONSTRUCT_TYPE
 #pragma anki technique TemporalDenoise comp mutators
 #pragma anki technique BilateralDenoise comp mutators
@@ -535,10 +536,13 @@ SamplerState g_linearAnyRepeatSampler : register(s0);
 // ===========================================================================
 // RtMaterialFetch (Apply)                                                   =
 // ===========================================================================
-#if NOT_ZERO(ANKI_TECHNIQUE_RtMaterialFetch) && !RT_MATERIAL_FETCH_CLIPMAP
+#if(ANKI_TECHNIQUE_RtMaterialFetch && !RT_MATERIAL_FETCH_CLIPMAP) || ANKI_TECHNIQUE_ApplyInlineRt
 
+#	define INCLUDE_ALL
 #	include <AnKi/Shaders/RtMaterialFetch.hlsl>
 
+#	define INLINE_RT ANKI_TECHNIQUE_ApplyInlineRt
+
 struct Consts
 {
 	F32 m_rayMax;
@@ -550,14 +554,30 @@ struct Consts
 };
 ANKI_FAST_CONSTANTS(Consts, g_consts)
 
+#	if INLINE_RT
+[numthreads(8, 8, 1)] void main(COMPUTE_ARGS)
+#	else
 [Shader("raygeneration")] void main()
+#	endif
 {
+#	if INLINE_RT
+	UVec2 texSize;
+	g_colorAndPdfTex.GetDimensions(texSize.x, texSize.y);
+	if(any(svDispatchThreadId.xy >= texSize))
+	{
+		return;
+	}
+#	else
+	const UVec2 svDispatchThreadId = DispatchRaysIndex();
+	const UVec2 texSize = DispatchRaysDimensions().xy;
+#	endif
+
 #	if SPATIAL_RECONSTRUCT_TYPE == 0
-	const UVec2 fullCoord = UVec2(DispatchRaysIndex().x * 2u + (DispatchRaysIndex().y & 1u), DispatchRaysIndex().y);
-	const Vec2 uv = (fullCoord + 0.5) / (DispatchRaysDimensions().xy * UVec2(2, 1));
+	const UVec2 fullCoord = UVec2(svDispatchThreadId.x * 2u + (svDispatchThreadId.y & 1u), svDispatchThreadId.y);
+	const Vec2 uv = (fullCoord + 0.5) / (texSize * UVec2(2, 1));
 #	else
-	const UVec2 fullCoord = DispatchRaysIndex().xy * 2u;
-	const Vec2 uv = (fullCoord + 0.5) / (DispatchRaysDimensions().xy * 2);
+	const UVec2 fullCoord = svDispatchThreadId.xy * 2u;
+	const Vec2 uv = (fullCoord + 0.5) / (texSize * 2);
 #	endif
 
 	const F32 depth = TEX(g_depthTex, fullCoord).x;
@@ -583,7 +603,11 @@ ANKI_FAST_CONSTANTS(Consts, g_consts)
 	GBufferLight<F16> gbuffer = (GBufferLight<F16>)0;
 	F32 rayT = 0.0;
 	Bool backfacing = false;
+#	if INLINE_RT
+	const Bool hit = materialRayTraceInlineRt<F16>(biasedWorldPos, rayDir, 0.01, tMax, 1000.0, gbuffer, rayT, backfacing);
+#	else
 	const Bool hit = materialRayTrace<F16>(biasedWorldPos, rayDir, 0.01, tMax, 1000.0, gbuffer, rayT, backfacing, traceFlags);
+#	endif
 
 	HVec3 radiance = 0.0;
 	Vec3 hitPos = 0.0;
@@ -621,7 +645,7 @@ ANKI_FAST_CONSTANTS(Consts, g_consts)
 		final = irradiance;
 	}
 
-	TEX(g_colorAndPdfTex, DispatchRaysIndex().xy) = Vec4(final, 0.0);
+	TEX(g_colorAndPdfTex, svDispatchThreadId.xy) = Vec4(final, 0.0);
 	// TEX(g_colorAndPdfTex, DispatchRaysIndex().xy) = lerp(TEX(g_colorAndPdfTex, DispatchRaysIndex().xy), Vec4(final, 0.0), 0.05);
 }
 #endif

+ 1 - 2
Samples/Common/SampleApp.cpp

@@ -59,8 +59,7 @@ Error SampleApp::userMainLoop(Bool& quit, Second elapsedTime)
 
 	if(in.getKey(KeyCode::kY) == 1)
 	{
-		renderer.setCurrentDebugRenderTarget(
-			(renderer.getCurrentDebugRenderTarget() == "IndirectDiffuseClipmapsTest") ? "" : "IndirectDiffuseClipmapsTest");
+		renderer.setCurrentDebugRenderTarget((renderer.getCurrentDebugRenderTarget() == "IndirectDiffuseClipmaps") ? "" : "IndirectDiffuseClipmaps");
 		// g_shadowMappingPcssCVar = !g_shadowMappingPcssCVar;
 	}