Browse Source

Improve SSR a bit

Panagiotis Christopoulos Charitos 5 years ago
parent
commit
24c5bb166c
4 changed files with 8 additions and 5 deletions
  1. 2 2
      shaders/Ssr.ankiprog
  2. 1 0
      src/anki/renderer/ConfigDefs.h
  3. 4 3
      src/anki/renderer/Ssr.cpp
  4. 1 0
      src/anki/renderer/Ssr.h

+ 2 - 2
shaders/Ssr.ankiprog

@@ -81,7 +81,7 @@ void main()
 	// Do the heavy work
 	Vec3 hitPoint;
 	F32 hitAttenuation;
-	const U32 lod = 1;
+	const U32 lod = 0;
 	const U32 step = 16u;
 	const F32 stepf = step;
 	const F32 minStepf = 4.0;
@@ -94,7 +94,7 @@ void main()
 		u_depthRt,
 		u_trilinearClampSampler,
 		F32(lod),
-		u_unis.m_depthBufferSize >> lod,
+		u_unis.m_depthBufferSize,
 		step,
 		U32((stepf - minStepf) * noise + minStepf),
 		hitPoint,

+ 1 - 0
src/anki/renderer/ConfigDefs.h

@@ -17,6 +17,7 @@ ANKI_CONFIG_OPTION(r_volumetricLightingAccumulationClusterFractionZ, 4, 1, 16)
 ANKI_CONFIG_OPTION(r_volumetricLightingAccumulationFinalClusterInZ, 26, 1, 256)
 
 ANKI_CONFIG_OPTION(r_ssrMaxSteps, 64, 1, 2048)
+ANKI_CONFIG_OPTION(r_ssrDepthLod, 2, 0, 1000)
 
 ANKI_CONFIG_OPTION(r_ssgiMaxSteps, 32, 1, 2048)
 ANKI_CONFIG_OPTION(r_ssgiDepthLod, 2, 0, 1000)

+ 4 - 3
src/anki/renderer/Ssr.cpp

@@ -35,6 +35,7 @@ Error Ssr::initInternal(const ConfigSet& cfg)
 	const U32 height = m_r->getHeight();
 	ANKI_R_LOGI("Initializing SSR pass (%ux%u)", width, height);
 	m_maxSteps = cfg.getNumberU32("r_ssrMaxSteps");
+	m_depthLod = cfg.getNumberU32("r_ssrDepthLod");
 
 	ANKI_CHECK(getResourceManager().loadResource("engine_data/BlueNoiseRgb816x16.png", m_noiseTex));
 
@@ -84,7 +85,7 @@ void Ssr::populateRenderGraph(RenderingContext& ctx)
 	rpass.newDependency({m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_COMPUTE});
 
 	TextureSubresourceInfo hizSubresource;
-	hizSubresource.m_mipmapCount = m_r->getDepthDownscale().getMipmapCount();
+	hizSubresource.m_firstMipmap = m_depthLod;
 	rpass.newDependency({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_COMPUTE, hizSubresource});
 
 	rpass.newDependency({m_r->getDownscaleBlur().getRt(), TextureUsageBit::SAMPLED_COMPUTE});
@@ -100,7 +101,7 @@ void Ssr::run(RenderPassWorkContext& rgraphCtx)
 
 	// Bind uniforms
 	SsrUniforms* unis = allocateAndBindUniforms<SsrUniforms*>(sizeof(SsrUniforms), cmdb, 0, 1);
-	unis->m_depthBufferSize = UVec2(m_r->getWidth(), m_r->getHeight()) >> 2u;
+	unis->m_depthBufferSize = UVec2(m_r->getWidth(), m_r->getHeight()) >> (m_depthLod + 1);
 	unis->m_framebufferSize = UVec2(m_r->getWidth(), m_r->getHeight());
 	unis->m_frameCount = m_r->getFrameCount() & MAX_U32;
 	unis->m_depthMipCount = m_r->getDepthDownscale().getMipmapCount();
@@ -119,7 +120,7 @@ void Ssr::run(RenderPassWorkContext& rgraphCtx)
 	rgraphCtx.bindColorTexture(0, 4, m_r->getGBuffer().getColorRt(2));
 
 	TextureSubresourceInfo hizSubresource;
-	hizSubresource.m_mipmapCount = m_r->getDepthDownscale().getMipmapCount();
+	hizSubresource.m_firstMipmap = m_depthLod;
 	rgraphCtx.bindTexture(0, 5, m_r->getDepthDownscale().getHiZRt(), hizSubresource);
 
 	rgraphCtx.bindColorTexture(0, 6, m_r->getDownscaleBlur().getRt());

+ 1 - 0
src/anki/renderer/Ssr.h

@@ -44,6 +44,7 @@ private:
 
 	Array<U32, 2> m_workgroupSize = {};
 	U32 m_maxSteps = 32;
+	U32 m_depthLod = 0;
 
 	class
 	{