Browse Source

[FEATURE] Add sharpness in temporal AA resolve

Panagiotis Christopoulos Charitos 8 years ago
parent
commit
6cad24d2a7

+ 29 - 7
programs/TemporalAAResolve.ankiprog

@@ -5,6 +5,18 @@ Code licensed under the BSD License.
 http://www.anki3d.org/LICENSE
 -->
 <shaderProgram>
+	<mutators>
+		<mutator name="SHARPEN" values="0 1 2"/> <!-- 0: disabled, 1: vertical, 2: horizontal -->
+		<mutator name="VARIANCE_CLIPPING" values="0 1"/>
+		<mutator name="TONEMAP_FIX" values="0 1"/>
+		<mutator name="YCBCR" values="0 1"/>
+	</mutators>
+
+	<inputs>
+		<input name="VARIANCE_CLIPPING_GAMMA" type="float" const="1"/>
+		<input name="BLEND_FACTOR" type="float" const="1"/>
+	</inputs>
+
 	<shaders>
 		<shader type="vert">
 			<source><![CDATA[
@@ -18,13 +30,6 @@ http://www.anki3d.org/LICENSE
 #include "shaders/Pack.glsl"
 #include "shaders/Tonemapping.glsl"
 
-// Config
-#define VARIANCE_CLIPPING 1
-const float VARIANCE_CLIPPING_GAMMA = 1.75;
-#define YCBCR 0
-const float BLEND_FACTOR = 1.0 / 16.0; // Keep it low to have a better result
-#define TONEMAP_FIX 1
-
 layout(location = 0) in vec2 in_uv;
 
 layout(location = 0) out vec3 out_color;
@@ -52,6 +57,19 @@ layout(ANKI_UBO_BINDING(0, 0), std140, row_major) uniform u0_
 #define sampleOffset(s, uv, x, y) textureLodOffset(s, uv, 0.0, ivec2(x, y)).rgb
 #endif
 
+vec3 sharpen()
+{
+	vec3 center = sample(u_inputRt, in_uv);
+#if SHARPEN == 1
+	vec3 near = sampleOffset(u_inputRt, in_uv, 1, 0) + sampleOffset(u_inputRt, in_uv, -1, 0);
+#else
+	vec3 near = sampleOffset(u_inputRt, in_uv, 0, 1) + sampleOffset(u_inputRt, in_uv, 0, -1);
+#endif
+	near *= 0.5;
+	float sharpness = 1.0;
+	return center + (center - near) * sharpness;
+}
+
 void main()
 {
 	float depth = textureLod(u_depthRt, in_uv, 0.0).r;
@@ -62,7 +80,11 @@ void main()
 
 	// Read textures
 	vec3 historyCol = sample(u_historyRt, oldUv);
+#if SHARPEN > 0
+	vec3 crntCol = sharpen();
+#else
 	vec3 crntCol = sample(u_inputRt, in_uv);
+#endif
 
 	// Remove ghosting by clamping the history color to neighbour's AABB
 	vec3 near0 = sampleOffset(u_inputRt, in_uv, 1, 0);

+ 14 - 4
src/anki/renderer/TemporalAA.cpp

@@ -37,9 +37,19 @@ Error TemporalAA::init(const ConfigSet& config)
 Error TemporalAA::initInternal(const ConfigSet& config)
 {
 	ANKI_CHECK(m_r->getResourceManager().loadResource("programs/TemporalAAResolve.ankiprog", m_prog));
-	const ShaderProgramResourceVariant* variant;
-	m_prog->getOrCreateVariant(variant);
-	m_grProg = variant->getProgram();
+
+	for(U i = 0; i < 2; ++i)
+	{
+		ShaderProgramResourceConstantValueInitList<2> consts(m_prog);
+		consts.add("VARIANCE_CLIPPING_GAMMA", 1.7f).add("BLEND_FACTOR", 1.0f / 16.0f);
+
+		ShaderProgramResourceMutationInitList<4> mutations(m_prog);
+		mutations.add("SHARPEN", i + 1).add("VARIANCE_CLIPPING", 1).add("TONEMAP_FIX", 1).add("YCBCR", 0);
+
+		const ShaderProgramResourceVariant* variant;
+		m_prog->getOrCreateVariant(mutations.get(), consts.get(), variant);
+		m_grProgs[i] = variant->getProgram();
+	}
 
 	for(U i = 0; i < 2; ++i)
 	{
@@ -64,7 +74,7 @@ void TemporalAA::run(const RenderingContext& ctx, RenderPassWorkContext& rgraphC
 
 	cmdb->setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
 
-	cmdb->bindShaderProgram(m_grProg);
+	cmdb->bindShaderProgram(m_grProgs[m_r->getFrameCount() & 1]);
 	rgraphCtx.bindTextureAndSampler(0, 0, m_r->getGBuffer().getDepthRt(), m_r->getLinearSampler());
 	rgraphCtx.bindTextureAndSampler(0, 1, m_r->getLightShading().getRt(), m_r->getLinearSampler());
 	rgraphCtx.bindTextureAndSampler(0, 2, m_runCtx.m_historyRt, m_r->getLinearSampler());

+ 1 - 1
src/anki/renderer/TemporalAA.h

@@ -35,7 +35,7 @@ private:
 	FramebufferDescription m_fbDescr;
 
 	ShaderProgramResourcePtr m_prog;
-	ShaderProgramPtr m_grProg;
+	Array<ShaderProgramPtr, 2> m_grProgs;
 
 	class
 	{