Panagiotis Christopoulos Charitos 5 سال پیش
والد
کامیت
5bd9f57cf1
2فایلهای تغییر یافته به همراه119 افزوده شده و 30 حذف شده
  1. 110 30
      src/anki/renderer/Ssgi.cpp
  2. 9 0
      src/anki/renderer/Ssgi.h

+ 110 - 30
src/anki/renderer/Ssgi.cpp

@@ -49,19 +49,40 @@ Error Ssgi::initInternal(const ConfigSet& cfg)
 	m_main.m_rts[0] = m_r->createAndClearRenderTarget(texinit);
 	m_main.m_rts[1] = m_r->createAndClearRenderTarget(texinit);
 
-	// Create shader
-	ANKI_CHECK(getResourceManager().loadResource("shaders/Ssgi.ankiprog", m_main.m_prog));
+	// Create main shaders
+	{
+		ANKI_CHECK(getResourceManager().loadResource("shaders/Ssgi.ankiprog", m_main.m_prog));
+
+		ShaderProgramResourceVariantInitInfo variantInitInfo(m_main.m_prog);
+		variantInitInfo.addMutation("VARIANT", 0);
+
+		const ShaderProgramResourceVariant* variant;
+		m_main.m_prog->getOrCreateVariant(variantInitInfo, variant);
+		m_main.m_grProg[0] = variant->getProgram();
+
+		variantInitInfo.addMutation("VARIANT", 1);
+		m_main.m_prog->getOrCreateVariant(variantInitInfo, variant);
+		m_main.m_grProg[1] = variant->getProgram();
+	}
+
+	// Init denoise
+	{
+		ANKI_CHECK(getResourceManager().loadResource("shaders/DepthAwareBlurCompute.ankiprog", m_denoise.m_prog));
+		ShaderProgramResourceVariantInitInfo variantInitInfo(m_denoise.m_prog);
+		const ShaderProgramResourceVariant* variant;
 
-	ShaderProgramResourceVariantInitInfo variantInitInfo(m_main.m_prog);
-	variantInitInfo.addMutation("VARIANT", 0);
+		variantInitInfo.addConstant("TEXTURE_SIZE", UVec2(m_r->getWidth(), m_r->getHeight()));
 
-	const ShaderProgramResourceVariant* variant;
-	m_main.m_prog->getOrCreateVariant(variantInitInfo, variant);
-	m_main.m_grProg[0] = variant->getProgram();
+		variantInitInfo.addMutation("SAMPLE_COUNT", 15);
+		variantInitInfo.addMutation("COLOR_COMPONENTS", 4);
+		variantInitInfo.addMutation("ORIENTATION", 0);
+		m_denoise.m_prog->getOrCreateVariant(variantInitInfo, variant);
+		m_denoise.m_grProg[0] = variant->getProgram();
 
-	variantInitInfo.addMutation("VARIANT", 1);
-	m_main.m_prog->getOrCreateVariant(variantInitInfo, variant);
-	m_main.m_grProg[1] = variant->getProgram();
+		variantInitInfo.addMutation("ORIENTATION", 1);
+		m_denoise.m_prog->getOrCreateVariant(variantInitInfo, variant);
+		m_denoise.m_grProg[1] = variant->getProgram();
+	}
 
 	return Error::NONE;
 }
@@ -72,34 +93,65 @@ void Ssgi::populateRenderGraph(RenderingContext& ctx)
 	m_runCtx.m_ctx = &ctx;
 	m_main.m_writeRtIdx = (m_main.m_writeRtIdx + 1) % 2;
 
-	// Create RTs
-	if(ANKI_LIKELY(m_main.m_rtImportedOnce))
+	// Main pass
 	{
-		m_runCtx.m_rts[0] = rgraph.importRenderTarget(m_main.m_rts[0]);
-		m_runCtx.m_rts[1] = rgraph.importRenderTarget(m_main.m_rts[1]);
+		// Create RTs
+		if(ANKI_LIKELY(m_main.m_rtImportedOnce))
+		{
+			m_runCtx.m_rts[0] = rgraph.importRenderTarget(m_main.m_rts[0]);
+			m_runCtx.m_rts[1] = rgraph.importRenderTarget(m_main.m_rts[1]);
+		}
+		else
+		{
+			m_runCtx.m_rts[0] = rgraph.importRenderTarget(m_main.m_rts[0], TextureUsageBit::SAMPLED_FRAGMENT);
+			m_runCtx.m_rts[1] = rgraph.importRenderTarget(m_main.m_rts[1], TextureUsageBit::SAMPLED_FRAGMENT);
+			m_main.m_rtImportedOnce = true;
+		}
+
+		// Create pass
+		ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("SSGI");
+		rpass.setWork(
+			[](RenderPassWorkContext& rgraphCtx) { static_cast<Ssgi*>(rgraphCtx.m_userData)->run(rgraphCtx); },
+			this,
+			0);
+
+		rpass.newDependency({m_runCtx.m_rts[m_main.m_writeRtIdx], TextureUsageBit::IMAGE_COMPUTE_WRITE});
+		rpass.newDependency({m_runCtx.m_rts[!m_main.m_writeRtIdx], TextureUsageBit::SAMPLED_COMPUTE});
+
+		TextureSubresourceInfo hizSubresource;
+		hizSubresource.m_firstMipmap = m_main.m_depthLod;
+		rpass.newDependency({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_COMPUTE, hizSubresource});
+		rpass.newDependency({m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_COMPUTE});
+		rpass.newDependency({m_r->getDownscaleBlur().getRt(), TextureUsageBit::SAMPLED_COMPUTE});
 	}
-	else
+
+	// Blur vertical
 	{
-		m_runCtx.m_rts[0] = rgraph.importRenderTarget(m_main.m_rts[0], TextureUsageBit::SAMPLED_FRAGMENT);
-		m_runCtx.m_rts[1] = rgraph.importRenderTarget(m_main.m_rts[1], TextureUsageBit::SAMPLED_FRAGMENT);
-		m_main.m_rtImportedOnce = true;
-	}
+		ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("SSGIBlurV");
 
-	// Create pass
-	ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("SSGI");
-	rpass.setWork(
-		[](RenderPassWorkContext& rgraphCtx) { static_cast<Ssgi*>(rgraphCtx.m_userData)->run(rgraphCtx); }, this, 0);
+		rpass.newDependency({m_runCtx.m_rts[m_main.m_writeRtIdx], TextureUsageBit::SAMPLED_COMPUTE});
+		rpass.newDependency({m_runCtx.m_rts[!m_main.m_writeRtIdx], TextureUsageBit::IMAGE_COMPUTE_WRITE});
+		rpass.newDependency({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_COMPUTE});
 
-	rpass.newDependency({m_runCtx.m_rts[m_main.m_writeRtIdx], TextureUsageBit::IMAGE_COMPUTE_WRITE});
-	rpass.newDependency({m_runCtx.m_rts[!m_main.m_writeRtIdx], TextureUsageBit::SAMPLED_COMPUTE});
+		rpass.setWork(
+			[](RenderPassWorkContext& rgraphCtx) { static_cast<Ssgi*>(rgraphCtx.m_userData)->runVBlur(rgraphCtx); },
+			this,
+			0);
+	}
 
-	TextureSubresourceInfo hizSubresource;
-	hizSubresource.m_firstMipmap = m_main.m_depthLod;
-	rpass.newDependency({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_COMPUTE, hizSubresource});
+	// Blur horizontal
+	{
+		ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("SSGIBlurH");
 
-	rpass.newDependency({m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_COMPUTE});
+		rpass.newDependency({m_runCtx.m_rts[!m_main.m_writeRtIdx], TextureUsageBit::SAMPLED_COMPUTE});
+		rpass.newDependency({m_runCtx.m_rts[m_main.m_writeRtIdx], TextureUsageBit::IMAGE_COMPUTE_WRITE});
+		rpass.newDependency({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_COMPUTE});
 
-	rpass.newDependency({m_r->getDownscaleBlur().getRt(), TextureUsageBit::SAMPLED_COMPUTE});
+		rpass.setWork(
+			[](RenderPassWorkContext& rgraphCtx) { static_cast<Ssgi*>(rgraphCtx.m_userData)->runHBlur(rgraphCtx); },
+			this,
+			0);
+	}
 }
 
 void Ssgi::run(RenderPassWorkContext& rgraphCtx)
@@ -138,4 +190,32 @@ void Ssgi::run(RenderPassWorkContext& rgraphCtx)
 	dispatchPPCompute(cmdb, 16, 16, m_r->getWidth() / 2, m_r->getHeight());
 }
 
+void Ssgi::runVBlur(RenderPassWorkContext& rgraphCtx)
+{
+	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
+	cmdb->bindShaderProgram(m_denoise.m_grProg[0]);
+
+	cmdb->bindSampler(0, 0, m_r->getSamplers().m_trilinearClamp);
+	rgraphCtx.bindColorTexture(0, 1, m_runCtx.m_rts[m_main.m_writeRtIdx]);
+	rgraphCtx.bindTexture(0, 2, m_r->getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
+
+	rgraphCtx.bindImage(0, 3, m_runCtx.m_rts[!m_main.m_writeRtIdx], TextureSubresourceInfo());
+
+	dispatchPPCompute(cmdb, 8, 8, m_r->getWidth(), m_r->getHeight());
+}
+
+void Ssgi::runHBlur(RenderPassWorkContext& rgraphCtx)
+{
+	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
+	cmdb->bindShaderProgram(m_denoise.m_grProg[1]);
+
+	cmdb->bindSampler(0, 0, m_r->getSamplers().m_trilinearClamp);
+	rgraphCtx.bindColorTexture(0, 1, m_runCtx.m_rts[!m_main.m_writeRtIdx]);
+	rgraphCtx.bindTexture(0, 2, m_r->getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
+
+	rgraphCtx.bindImage(0, 3, m_runCtx.m_rts[m_main.m_writeRtIdx], TextureSubresourceInfo());
+
+	dispatchPPCompute(cmdb, 8, 8, m_r->getWidth(), m_r->getHeight());
+}
+
 } // end namespace anki

+ 9 - 0
src/anki/renderer/Ssgi.h

@@ -58,6 +58,13 @@ private:
 		U8 m_writeRtIdx = 1;
 	} m_main;
 
+	class
+	{
+	public:
+		ShaderProgramResourcePtr m_prog;
+		Array<ShaderProgramPtr, 2> m_grProg;
+	} m_denoise;
+
 	class
 	{
 	public:
@@ -68,6 +75,8 @@ private:
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& cfg);
 
 	void run(RenderPassWorkContext& rgraphCtx);
+	void runVBlur(RenderPassWorkContext& rgraphCtx);
+	void runHBlur(RenderPassWorkContext& rgraphCtx);
 };
 /// @}