Browse Source

[BUGFIX] Workaround avg luminance when it becomes nan

Panagiotis Christopoulos Charitos 8 years ago
parent
commit
0914752be4

+ 1 - 1
programs/FinalComposite.ankiprog

@@ -43,7 +43,7 @@ layout(std140, ANKI_UBO_BINDING(0, 0)) uniform u0_
 	vec4 u_blueNoiseLayerPad3;
 	vec4 u_blueNoiseLayerPad3;
 };
 };
 
 
-#define TONEMAPPING_RESOURCE readonly buffer
+#define TONEMAPPING_BINDING 1
 #include "shaders/TonemappingResources.glsl"
 #include "shaders/TonemappingResources.glsl"
 
 
 layout(location = 0) in vec2 in_uv;
 layout(location = 0) in vec2 in_uv;

+ 2 - 1
programs/TemporalAAResolve.ankiprog

@@ -39,7 +39,8 @@ layout(ANKI_UBO_BINDING(0, 0), std140, row_major) uniform u0_
 };
 };
 
 
 #if TONEMAP_FIX
 #if TONEMAP_FIX
-#define TONEMAPPING_RESOURCE readonly buffer
+#define TONEMAPPING_SET 0
+#define TONEMAPPING_BINDING 1
 #include "shaders/TonemappingResources.glsl"
 #include "shaders/TonemappingResources.glsl"
 #endif
 #endif
 
 

+ 8 - 3
programs/TonemappingAverageLuminance.ankiprog

@@ -28,6 +28,7 @@ const uint PIXEL_READ_Y = INPUT_TEX_SIZE.y / WORKGROUP_SIZE_Y;
 
 
 layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D u_tex;
 layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D u_tex;
 
 
+#define TONEMAPPING_RESOURCE_AS_BUFFER 1
 #include "shaders/TonemappingResources.glsl"
 #include "shaders/TonemappingResources.glsl"
 
 
 shared float g_avgLum[WORKGROUP_SIZE];
 shared float g_avgLum[WORKGROUP_SIZE];
@@ -78,17 +79,21 @@ void main()
 #else
 #else
 		float crntLum = g_avgLum[0] / float(INPUT_TEX_SIZE.x * INPUT_TEX_SIZE.y);
 		float crntLum = g_avgLum[0] / float(INPUT_TEX_SIZE.x * INPUT_TEX_SIZE.y);
 #endif
 #endif
-		crntLum = max(crntLum, 0.04);
 
 
 #if 1
 #if 1
 		float prevLum = u_averageLuminance;
 		float prevLum = u_averageLuminance;
 
 
 		// Lerp between previous and new L value
 		// Lerp between previous and new L value
 		const float INTERPOLATION_FACTOR = 0.05;
 		const float INTERPOLATION_FACTOR = 0.05;
-		u_averageLuminance = mix(prevLum, crntLum, INTERPOLATION_FACTOR);
+		float finalAvgLum = mix(prevLum, crntLum, INTERPOLATION_FACTOR);
 #else
 #else
-		u_averageLuminance = crntLum;
+		float finalAvgLum = crntLum;
 #endif
 #endif
+
+		// This is a workaround because sometimes the avg lum becomes nan
+		float finalAvgLum = clamp(finalAvgLum, EPSILON, FLT_MAX);
+
+		u_averageLuminance = finalAvgLum;
 		u_exposureThreshold0 = computeExposure(u_averageLuminance, 0.0);
 		u_exposureThreshold0 = computeExposure(u_averageLuminance, 0.0);
 	}
 	}
 }
 }

+ 1 - 0
shaders/Common.glsl

@@ -28,6 +28,7 @@ precision DEFAULT_FLOAT_PRECISION float;
 precision DEFAULT_INT_PRECISION int;
 precision DEFAULT_INT_PRECISION int;
 
 
 const float EPSILON = 0.000001;
 const float EPSILON = 0.000001;
+const float FLT_MAX = 3.402823e+38;
 const float PI = 3.14159265358979323846;
 const float PI = 3.14159265358979323846;
 const uint UBO_MAX_SIZE = 16384u;
 const uint UBO_MAX_SIZE = 16384u;
 
 

+ 9 - 5
shaders/TonemappingResources.glsl

@@ -14,15 +14,19 @@
 #define TONEMAPPING_SET 0
 #define TONEMAPPING_SET 0
 #endif
 #endif
 
 
-#ifndef TONEMAPPING_LOCATION
-#define TONEMAPPING_LOCATION 0
+#ifndef TONEMAPPING_BINDING
+#define TONEMAPPING_BINDING 0
 #endif
 #endif
 
 
-#ifndef TONEMAPPING_RESOURCE
-#define TONEMAPPING_RESOURCE buffer
+#ifndef TONEMAPPING_RESOURCE_AS_BUFFER
+#define TONEMAPPING_RESOURCE_AS_BUFFER 0
 #endif
 #endif
 
 
-layout(std140, ANKI_SS_BINDING(TONEMAPPING_SET, TONEMAPPING_LOCATION)) TONEMAPPING_RESOURCE tmrss0_
+#if TONEMAPPING_RESOURCE_AS_BUFFER
+layout(std140, ANKI_SS_BINDING(TONEMAPPING_SET, TONEMAPPING_BINDING)) buffer tmss0_
+#else
+layout(std140, ANKI_UBO_BINDING(TONEMAPPING_SET, TONEMAPPING_BINDING)) uniform tmu0_
+#endif
 {
 {
 	vec4 u_averageLuminanceExposurePad2;
 	vec4 u_averageLuminanceExposurePad2;
 };
 };

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

@@ -122,7 +122,7 @@ void FinalComposite::run(const RenderingContext& ctx, const RenderGraph& rgraph,
 		cmdb->bindTexture(0, 5, rgraph.getTexture(m_r->getDbg().getRt()));
 		cmdb->bindTexture(0, 5, rgraph.getTexture(m_r->getDbg().getRt()));
 	}
 	}
 
 
-	cmdb->bindStorageBuffer(0, 0, rgraph.getBuffer(m_r->getTonemapping().getAverageLuminanceBuffer()), 0, MAX_PTR_SIZE);
+	cmdb->bindUniformBuffer(0, 1, rgraph.getBuffer(m_r->getTonemapping().getAverageLuminanceBuffer()), 0, MAX_PTR_SIZE);
 
 
 	Vec4* uniforms = allocateAndBindUniforms<Vec4*>(sizeof(Vec4), cmdb, 0, 0);
 	Vec4* uniforms = allocateAndBindUniforms<Vec4*>(sizeof(Vec4), cmdb, 0, 0);
 	uniforms->x() = F32(m_r->getFrameCount() % m_blueNoise->getLayerCount());
 	uniforms->x() = F32(m_r->getFrameCount() % m_blueNoise->getLayerCount());
@@ -183,7 +183,7 @@ void FinalComposite::populateRenderGraph(RenderingContext& ctx)
 	}
 	}
 	pass.newConsumer({m_r->getTemporalAA().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 	pass.newConsumer({m_r->getTemporalAA().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 	pass.newConsumer({m_r->getBloom().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 	pass.newConsumer({m_r->getBloom().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
-	pass.newConsumer({m_r->getTonemapping().getAverageLuminanceBuffer(), BufferUsageBit::STORAGE_FRAGMENT_READ});
+	pass.newConsumer({m_r->getTonemapping().getAverageLuminanceBuffer(), BufferUsageBit::UNIFORM_FRAGMENT});
 }
 }
 
 
 } // end namespace anki
 } // end namespace anki

+ 2 - 1
src/anki/renderer/TemporalAA.cpp

@@ -66,11 +66,12 @@ void TemporalAA::run(const RenderingContext& ctx, const RenderGraph& rgraph, Com
 	cmdb->bindTextureAndSampler(0, 0, rgraph.getTexture(m_r->getGBuffer().getDepthRt()), m_r->getLinearSampler());
 	cmdb->bindTextureAndSampler(0, 0, rgraph.getTexture(m_r->getGBuffer().getDepthRt()), m_r->getLinearSampler());
 	cmdb->bindTextureAndSampler(0, 1, rgraph.getTexture(m_r->getLightShading().getRt()), m_r->getLinearSampler());
 	cmdb->bindTextureAndSampler(0, 1, rgraph.getTexture(m_r->getLightShading().getRt()), m_r->getLinearSampler());
 	cmdb->bindTextureAndSampler(0, 2, rgraph.getTexture(m_runCtx.m_historyRt), m_r->getLinearSampler());
 	cmdb->bindTextureAndSampler(0, 2, rgraph.getTexture(m_runCtx.m_historyRt), m_r->getLinearSampler());
-	cmdb->bindStorageBuffer(0, 0, rgraph.getBuffer(m_r->getTonemapping().getAverageLuminanceBuffer()), 0, MAX_PTR_SIZE);
 
 
 	Mat4* unis = allocateAndBindUniforms<Mat4*>(sizeof(Mat4), cmdb, 0, 0);
 	Mat4* unis = allocateAndBindUniforms<Mat4*>(sizeof(Mat4), cmdb, 0, 0);
 	*unis = ctx.m_jitterMat * ctx.m_prevViewProjMat * ctx.m_viewProjMatJitter.getInverse();
 	*unis = ctx.m_jitterMat * ctx.m_prevViewProjMat * ctx.m_viewProjMatJitter.getInverse();
 
 
+	cmdb->bindUniformBuffer(0, 1, rgraph.getBuffer(m_r->getTonemapping().getAverageLuminanceBuffer()), 0, MAX_PTR_SIZE);
+
 	drawQuad(cmdb);
 	drawQuad(cmdb);
 }
 }