Răsfoiți Sursa

Make the depth aware blur a bit more stage agnostic

Panagiotis Christopoulos Charitos 7 ani în urmă
părinte
comite
35cfb33288
2 a modificat fișierele cu 8 adăugiri și 71 ștergeri
  1. 6 69
      programs/DepthAwareBlur.ankiprog
  2. 2 2
      src/anki/renderer/Ssao.cpp

+ 6 - 69
programs/DepthAwareBlur.ankiprog

@@ -6,8 +6,8 @@ http://www.anki3d.org/LICENSE
 -->
 <shaderProgram>
 	<mutators>
-		<mutator name="HORIZONTAL" values="0 1"/>
-		<mutator name="KERNEL_SIZE" values="3 5 7 9 11 13 15"/>
+		<mutator name="ORIENTATION" values="0 1"/> <!-- 0: VERTICAL, 1: HORIZONTAL -->
+		<mutator name="SAMPLE_COUNT" values="3 5 7 9 11 13 15"/>
 		<mutator name="COLOR_COMPONENTS" values="4 3 1"/>
 	</mutators>
 
@@ -24,76 +24,13 @@ http://www.anki3d.org/LICENSE
 			</inputs>
 
 			<source><![CDATA[
-#include "shaders/GaussianBlurCommon.glsl"
-#include "shaders/Tonemapping.glsl"
-#include "shaders/Functions.glsl"
-
-// Determine color type
-#if COLOR_COMPONENTS == 4
-#	define COL_TYPE vec4
-#	define TEX_FETCH rgba
-#elif COLOR_COMPONENTS == 3
-#	define COL_TYPE vec3
-#	define TEX_FETCH rgb
-#elif COLOR_COMPONENTS == 1
-#	define COL_TYPE float
-#	define TEX_FETCH r
-#else
-#	error See file
-#endif
-
-layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D u_tex; 
-layout(ANKI_TEX_BINDING(0, 1)) uniform sampler2D u_depthRt;
-
-layout(location = 0) in vec2 in_uv;
-
-layout(location = 0) out COL_TYPE out_color;
-
-float computeDepthWeight(float refDepth, float depth)
-{
-	float diff = abs(refDepth - depth);
-	float weight = 1.0 / (EPSILON + diff);
-	return sqrt(weight);
-}
-
-float readDepth(vec2 uv)
-{
-	return textureLod(u_depthRt, uv, 0.0).r;
-}
-
-void main()
-{
-#if HORIZONTAL
-	const vec2 TEXEL_SIZE = vec2(1.0 / float(TEXTURE_SIZE.x), 0.0);
+#if ORIENTATION == 0
+#	define VERTICAL 1
 #else
-	const vec2 TEXEL_SIZE = vec2(0.0, 1.0 / float(TEXTURE_SIZE.y));
+#	define HORIZONTAL 1
 #endif
 
-	out_color = texture(u_tex, in_uv).TEX_FETCH;
-	float refDepth = readDepth(in_uv);
-	float weight = 1.0;
-	vec2 texCoordOffset = 1.5 * TEXEL_SIZE;
-
-	for(uint i = 0u; i < STEP_COUNT; ++i)
-	{
-		vec2 uv = in_uv + texCoordOffset;
-		COL_TYPE col = texture(u_tex, uv).TEX_FETCH;
-		float w = computeDepthWeight(refDepth, readDepth(uv));
-		out_color += col * w;
-		weight += w;
-
-		uv = in_uv - texCoordOffset;
-		col = texture(u_tex, uv).TEX_FETCH;
-		w = computeDepthWeight(refDepth, readDepth(uv));
-		out_color += col * w;
-		weight += w;
-
-		texCoordOffset += 2.0 * TEXEL_SIZE;
-	}
-
-	out_color = out_color / weight;
-
-}
+#include "shaders/DepthAwareBlur.glsl"
 			]]></source>
 		</shader>
 	</shaders>

+ 2 - 2
src/anki/renderer/Ssao.cpp

@@ -57,7 +57,7 @@ Error Ssao::initHBlur(const ConfigSet& config)
 	ANKI_CHECK(m_r->getResourceManager().loadResource("programs/DepthAwareBlur.ankiprog", m_hblur.m_prog));
 
 	ShaderProgramResourceMutationInitList<3> mutators(m_hblur.m_prog);
-	mutators.add("HORIZONTAL", 1).add("KERNEL_SIZE", 9).add("COLOR_COMPONENTS", 1);
+	mutators.add("ORIENTATION", 1).add("SAMPLE_COUNT", 9).add("COLOR_COMPONENTS", 1);
 	ShaderProgramResourceConstantValueInitList<1> consts(m_hblur.m_prog);
 	consts.add("TEXTURE_SIZE", UVec2(m_width, m_height));
 
@@ -75,7 +75,7 @@ Error Ssao::initVBlur(const ConfigSet& config)
 	ANKI_CHECK(m_r->getResourceManager().loadResource("programs/DepthAwareBlur.ankiprog", m_vblur.m_prog));
 
 	ShaderProgramResourceMutationInitList<3> mutators(m_vblur.m_prog);
-	mutators.add("HORIZONTAL", 0).add("KERNEL_SIZE", 9).add("COLOR_COMPONENTS", 1);
+	mutators.add("ORIENTATION", 0).add("SAMPLE_COUNT", 9).add("COLOR_COMPONENTS", 1);
 	ShaderProgramResourceConstantValueInitList<1> consts(m_vblur.m_prog);
 	consts.add("TEXTURE_SIZE", UVec2(m_width, m_height));