Bläddra i källkod

Tonemapping: Minor improvements

Panagiotis Christopoulos Charitos 8 år sedan
förälder
incheckning
6787499eb8

+ 12 - 5
programs/TonemappingAverageLuminance.ankiprog

@@ -12,6 +12,8 @@ http://www.anki3d.org/LICENSE
 			</inputs>
 			</inputs>
 
 
 			<source><![CDATA[
 			<source><![CDATA[
+#define LOG_AVG 0
+
 #include "shaders/Common.glsl"
 #include "shaders/Common.glsl"
 #include "shaders/Tonemapping.glsl"
 #include "shaders/Tonemapping.glsl"
 
 
@@ -46,12 +48,14 @@ void main()
 			ivec2 uv = ivec2(xStart, yStart) + ivec2(x, y);
 			ivec2 uv = ivec2(xStart, yStart) + ivec2(x, y);
 			vec3 color = texelFetch(u_tex, uv, 0).rgb;
 			vec3 color = texelFetch(u_tex, uv, 0).rgb;
 			float lum = computeLuminance(color);
 			float lum = computeLuminance(color);
-			// avgLum += log(lum);
-			avgLum += lum / float(INPUT_TEX_SIZE.x * INPUT_TEX_SIZE.y);
+#if LOG_AVG
+			avgLum += log(max(EPSILON, lum));
+#else
+			avgLum += lum;
+#endif
 		}
 		}
 	}
 	}
 
 
-	// avgLum *= 1.0 / float(PIXEL_READ_X * PIXEL_READ_Y);
 	g_avgLum[gl_LocalInvocationIndex] = avgLum;
 	g_avgLum[gl_LocalInvocationIndex] = avgLum;
 
 
 	memoryBarrierShared();
 	memoryBarrierShared();
@@ -72,8 +76,11 @@ void main()
 	// Write the result
 	// Write the result
 	if(gl_LocalInvocationIndex == 0)
 	if(gl_LocalInvocationIndex == 0)
 	{
 	{
-		float crntLum = g_avgLum[0];
-		// crntLum = exp(crntLum / float(WORKGROUP_SIZE));
+#if LOG_AVG
+		float crntLum = exp(g_avgLum[0] / float(INPUT_TEX_SIZE.x * INPUT_TEX_SIZE.y));
+#else
+		float crntLum = g_avgLum[0] / float(INPUT_TEX_SIZE.x * INPUT_TEX_SIZE.y);
+#endif
 		crntLum = max(crntLum, 0.04);
 		crntLum = max(crntLum, 0.04);
 
 
 #if 1
 #if 1

+ 4 - 4
src/anki/renderer/Bloom.cpp

@@ -21,8 +21,8 @@ Error BloomExposure::init(const ConfigSet& config)
 {
 {
 	GrManager& gr = getGrManager();
 	GrManager& gr = getGrManager();
 
 
-	m_width = m_r->getDownscaleBlur().getSmallPassWidth() * 2;
-	m_height = m_r->getDownscaleBlur().getSmallPassHeight() * 2;
+	m_width = m_r->getDownscaleBlur().getPassWidth(MAX_U) * 2;
+	m_height = m_r->getDownscaleBlur().getPassHeight(MAX_U) * 2;
 
 
 	m_threshold = config.getNumber("r.bloom.threshold");
 	m_threshold = config.getNumber("r.bloom.threshold");
 	m_scale = config.getNumber("r.bloom.scale");
 	m_scale = config.getNumber("r.bloom.scale");
@@ -48,7 +48,7 @@ Error BloomExposure::init(const ConfigSet& config)
 
 
 	ShaderProgramResourceConstantValueInitList<1> consts(m_prog);
 	ShaderProgramResourceConstantValueInitList<1> consts(m_prog);
 	consts.add(
 	consts.add(
-		"TEX_SIZE", Vec2(m_r->getDownscaleBlur().getSmallPassWidth(), m_r->getDownscaleBlur().getSmallPassHeight()));
+		"TEX_SIZE", Vec2(m_r->getDownscaleBlur().getPassWidth(MAX_U), m_r->getDownscaleBlur().getPassHeight(MAX_U)));
 
 
 	const ShaderProgramResourceVariant* variant;
 	const ShaderProgramResourceVariant* variant;
 	m_prog->getOrCreateVariant(consts.get(), variant);
 	m_prog->getOrCreateVariant(consts.get(), variant);
@@ -78,7 +78,7 @@ void BloomExposure::run(RenderingContext& ctx)
 	cmdb->beginRenderPass(m_fb);
 	cmdb->beginRenderPass(m_fb);
 	cmdb->setViewport(0, 0, m_width, m_height);
 	cmdb->setViewport(0, 0, m_width, m_height);
 	cmdb->bindShaderProgram(m_grProg);
 	cmdb->bindShaderProgram(m_grProg);
-	cmdb->bindTexture(0, 0, m_r->getDownscaleBlur().getSmallPassTexture());
+	cmdb->bindTexture(0, 0, m_r->getDownscaleBlur().getPassTexture(MAX_U));
 
 
 	Vec4* uniforms = allocateAndBindUniforms<Vec4*>(sizeof(Vec4), cmdb, 0, 0);
 	Vec4* uniforms = allocateAndBindUniforms<Vec4*>(sizeof(Vec4), cmdb, 0, 0);
 	*uniforms = Vec4(m_threshold, m_scale, 0.0, 0.0);
 	*uniforms = Vec4(m_threshold, m_scale, 0.0, 0.0);

+ 3 - 0
src/anki/renderer/Common.h

@@ -76,6 +76,9 @@ const U GBUFFER_COLOR_ATTACHMENT_COUNT = 3;
 /// Downsample and blur down to a texture with size DOWNSCALE_BLUR_DOWN_TO
 /// Downsample and blur down to a texture with size DOWNSCALE_BLUR_DOWN_TO
 const U DOWNSCALE_BLUR_DOWN_TO = 32;
 const U DOWNSCALE_BLUR_DOWN_TO = 32;
 
 
+/// Use this size of render target for the avg lum calculation.
+const U AVERAGE_LUMINANCE_RENDER_TARGET_SIZE = 128;
+
 extern const Array<PixelFormat, GBUFFER_COLOR_ATTACHMENT_COUNT> MS_COLOR_ATTACHMENT_PIXEL_FORMATS;
 extern const Array<PixelFormat, GBUFFER_COLOR_ATTACHMENT_COUNT> MS_COLOR_ATTACHMENT_PIXEL_FORMATS;
 
 
 const PixelFormat GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT(ComponentFormat::D24S8, TransformFormat::UNORM);
 const PixelFormat GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT(ComponentFormat::D24S8, TransformFormat::UNORM);

+ 6 - 6
src/anki/renderer/DownscaleBlur.h

@@ -30,19 +30,19 @@ anki_internal:
 	void run(RenderingContext& ctx);
 	void run(RenderingContext& ctx);
 	void setPostRunBarriers(RenderingContext& ctx);
 	void setPostRunBarriers(RenderingContext& ctx);
 
 
-	U getSmallPassWidth() const
+	U getPassWidth(U pass) const
 	{
 	{
-		return m_passes.getBack().m_width;
+		return m_passes[min(pass, m_passes.getSize() - 1)].m_width;
 	}
 	}
 
 
-	U getSmallPassHeight() const
+	U getPassHeight(U pass) const
 	{
 	{
-		return m_passes.getBack().m_height;
+		return m_passes[min(pass, m_passes.getSize() - 1)].m_height;
 	}
 	}
 
 
-	TexturePtr getSmallPassTexture() const
+	TexturePtr getPassTexture(U pass) const
 	{
 	{
-		return m_passes.getBack().m_rt;
+		return m_passes[min(pass, m_passes.getSize() - 1)].m_rt;
 	}
 	}
 
 
 private:
 private:

+ 4 - 2
src/anki/renderer/Tonemapping.cpp

@@ -24,12 +24,14 @@ Error Tonemapping::init(const ConfigSet& cfg)
 
 
 Error Tonemapping::initInternal(const ConfigSet& initializer)
 Error Tonemapping::initInternal(const ConfigSet& initializer)
 {
 {
+	m_rtIdx = computeMaxMipmapCount2d(m_r->getWidth(), m_r->getHeight(), AVERAGE_LUMINANCE_RENDER_TARGET_SIZE) - 1;
+
 	// Create program
 	// Create program
 	ANKI_CHECK(getResourceManager().loadResource("programs/TonemappingAverageLuminance.ankiprog", m_prog));
 	ANKI_CHECK(getResourceManager().loadResource("programs/TonemappingAverageLuminance.ankiprog", m_prog));
 
 
 	ShaderProgramResourceConstantValueInitList<1> consts(m_prog);
 	ShaderProgramResourceConstantValueInitList<1> consts(m_prog);
 	consts.add("INPUT_TEX_SIZE",
 	consts.add("INPUT_TEX_SIZE",
-		UVec2(m_r->getDownscaleBlur().getSmallPassWidth(), m_r->getDownscaleBlur().getSmallPassHeight()));
+		UVec2(m_r->getDownscaleBlur().getPassWidth(m_rtIdx), m_r->getDownscaleBlur().getPassHeight(m_rtIdx)));
 
 
 	const ShaderProgramResourceVariant* variant;
 	const ShaderProgramResourceVariant* variant;
 	m_prog->getOrCreateVariant(consts.get(), variant);
 	m_prog->getOrCreateVariant(consts.get(), variant);
@@ -64,7 +66,7 @@ void Tonemapping::run(RenderingContext& ctx)
 	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
 	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
 	cmdb->bindShaderProgram(m_grProg);
 	cmdb->bindShaderProgram(m_grProg);
 	cmdb->bindStorageBuffer(0, 0, m_luminanceBuff, 0, MAX_PTR_SIZE);
 	cmdb->bindStorageBuffer(0, 0, m_luminanceBuff, 0, MAX_PTR_SIZE);
-	cmdb->bindTexture(0, 0, m_r->getDownscaleBlur().getSmallPassTexture());
+	cmdb->bindTexture(0, 0, m_r->getDownscaleBlur().getPassTexture(m_rtIdx));
 
 
 	cmdb->dispatchCompute(1, 1, 1);
 	cmdb->dispatchCompute(1, 1, 1);
 }
 }

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

@@ -31,6 +31,7 @@ anki_internal:
 private:
 private:
 	ShaderProgramResourcePtr m_prog;
 	ShaderProgramResourcePtr m_prog;
 	ShaderProgramPtr m_grProg;
 	ShaderProgramPtr m_grProg;
+	U8 m_rtIdx;
 
 
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& cfg);
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& cfg);
 };
 };