ソースを参照

Feed tonemapped input to FSR

Panagiotis Christopoulos Charitos 4 年 前
コミット
97b02abaae

+ 4 - 4
AnKi/Renderer/DownscaleBlur.cpp

@@ -5,7 +5,7 @@
 
 #include <AnKi/Renderer/DownscaleBlur.h>
 #include <AnKi/Renderer/Renderer.h>
-#include <AnKi/Renderer/Scale.h>
+#include <AnKi/Renderer/TemporalAA.h>
 
 namespace anki
 {
@@ -124,7 +124,7 @@ void DownscaleBlur::populateRenderGraph(RenderingContext& ctx)
 				TextureSubresourceInfo renderSubresource;
 
 				pass.newDependency({m_runCtx.m_rt, TextureUsageBit::IMAGE_COMPUTE_WRITE, renderSubresource});
-				pass.newDependency({m_r->getScale().getRt(), TextureUsageBit::SAMPLED_COMPUTE});
+				pass.newDependency({m_r->getTemporalAA().getHdrRt(), TextureUsageBit::SAMPLED_COMPUTE});
 			}
 		}
 	}
@@ -156,7 +156,7 @@ void DownscaleBlur::populateRenderGraph(RenderingContext& ctx)
 				TextureSubresourceInfo renderSubresource;
 
 				pass.newDependency({m_runCtx.m_rt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, renderSubresource});
-				pass.newDependency({m_r->getScale().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+				pass.newDependency({m_r->getTemporalAA().getHdrRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 			}
 		}
 	}
@@ -182,7 +182,7 @@ void DownscaleBlur::run(RenderPassWorkContext& rgraphCtx)
 	}
 	else
 	{
-		rgraphCtx.bindColorTexture(0, 1, m_r->getScale().getRt());
+		rgraphCtx.bindColorTexture(0, 1, m_r->getTemporalAA().getHdrRt());
 	}
 
 	if(m_useCompute)

+ 51 - 60
AnKi/Renderer/FinalComposite.cpp

@@ -92,6 +92,44 @@ Error FinalComposite::loadColorGradingTextureImage(CString filename)
 	return Error::NONE;
 }
 
+void FinalComposite::populateRenderGraph(RenderingContext& ctx)
+{
+	RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
+	m_runCtx.m_ctx = &ctx;
+
+	// Create the pass
+	GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("Final Composite");
+
+	pass.setWork(
+		[](RenderPassWorkContext& rgraphCtx) {
+			FinalComposite* self = static_cast<FinalComposite*>(rgraphCtx.m_userData);
+			self->run(*self->m_runCtx.m_ctx, rgraphCtx);
+		},
+		this, 0);
+	pass.setFramebufferInfo(m_fbDescr, {ctx.m_outRenderTarget}, {});
+
+	pass.newDependency({ctx.m_outRenderTarget, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
+
+	if(m_r->getDbg().getEnabled())
+	{
+		pass.newDependency({m_r->getDbg().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+	}
+
+	pass.newDependency({m_r->getScale().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+	pass.newDependency({m_r->getBloom().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+	pass.newDependency({m_r->getMotionVectors().getMotionVectorsRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+	pass.newDependency({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+
+	RenderTargetHandle dbgRt;
+	Bool dbgRtValid;
+	ShaderProgramPtr debugProgram;
+	m_r->getCurrentDebugRenderTarget(dbgRt, dbgRtValid, debugProgram);
+	if(dbgRtValid)
+	{
+		pass.newDependency({dbgRt, TextureUsageBit::SAMPLED_FRAGMENT});
+	}
+}
+
 void FinalComposite::run(RenderingContext& ctx, RenderPassWorkContext& rgraphCtx)
 {
 	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
@@ -118,36 +156,27 @@ void FinalComposite::run(RenderingContext& ctx, RenderPassWorkContext& rgraphCtx
 	// Bind stuff
 	if(!dbgRtValid)
 	{
-		rgraphCtx.bindUniformBuffer(0, 0, m_r->getTonemapping().getAverageLuminanceBuffer());
-
-		cmdb->bindSampler(0, 1, m_r->getSamplers().m_nearestNearestClamp);
-		cmdb->bindSampler(0, 2, m_r->getSamplers().m_trilinearClamp);
-		cmdb->bindSampler(0, 3, m_r->getSamplers().m_trilinearRepeat);
+		cmdb->bindSampler(0, 0, m_r->getSamplers().m_nearestNearestClamp);
+		cmdb->bindSampler(0, 1, m_r->getSamplers().m_trilinearClamp);
+		cmdb->bindSampler(0, 2, m_r->getSamplers().m_trilinearRepeat);
 
-		rgraphCtx.bindColorTexture(0, 4, m_r->getScale().getRt());
+		rgraphCtx.bindColorTexture(0, 3, m_r->getScale().getRt());
 
-		rgraphCtx.bindColorTexture(0, 5, m_r->getBloom().getRt());
-		cmdb->bindTexture(0, 6, m_lut->getTextureView());
-		cmdb->bindTexture(0, 7, m_blueNoise->getTextureView());
-		rgraphCtx.bindColorTexture(0, 8, m_r->getMotionVectors().getMotionVectorsRt());
-		rgraphCtx.bindTexture(0, 9, m_r->getGBuffer().getDepthRt(),
+		rgraphCtx.bindColorTexture(0, 4, m_r->getBloom().getRt());
+		cmdb->bindTexture(0, 5, m_lut->getTextureView());
+		cmdb->bindTexture(0, 6, m_blueNoise->getTextureView());
+		rgraphCtx.bindColorTexture(0, 7, m_r->getMotionVectors().getMotionVectorsRt());
+		rgraphCtx.bindTexture(0, 8, m_r->getGBuffer().getDepthRt(),
 							  TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
 
 		if(dbgEnabled)
 		{
-			rgraphCtx.bindColorTexture(0, 10, m_r->getDbg().getRt());
+			rgraphCtx.bindColorTexture(0, 9, m_r->getDbg().getRt());
 		}
 
-		class PushConsts
-		{
-		public:
-			UVec4 m_frameCountPad3;
-			Mat4 m_prevViewProjMatMulInvViewProjMat;
-		} pconsts;
-		pconsts.m_frameCountPad3.x() = m_r->getFrameCount() & MAX_U32;
-		pconsts.m_prevViewProjMatMulInvViewProjMat = ctx.m_matrices.m_jitter * ctx.m_prevMatrices.m_viewProjection
-													 * ctx.m_matrices.m_viewProjectionJitter.getInverse();
-		cmdb->setPushConstants(&pconsts, sizeof(pconsts));
+		UVec4 frameCountPad3;
+		frameCountPad3.x() = m_r->getFrameCount() & MAX_U32;
+		cmdb->setPushConstants(&frameCountPad3, sizeof(frameCountPad3));
 	}
 	else
 	{
@@ -162,42 +191,4 @@ void FinalComposite::run(RenderingContext& ctx, RenderPassWorkContext& rgraphCtx
 	m_r->getUiStage().draw(ctx.m_outRenderTargetWidth, ctx.m_outRenderTargetHeight, ctx, cmdb);
 }
 
-void FinalComposite::populateRenderGraph(RenderingContext& ctx)
-{
-	RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
-	m_runCtx.m_ctx = &ctx;
-
-	// Create the pass
-	GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("Final Composite");
-
-	pass.setWork(
-		[](RenderPassWorkContext& rgraphCtx) {
-			FinalComposite* self = static_cast<FinalComposite*>(rgraphCtx.m_userData);
-			self->run(*self->m_runCtx.m_ctx, rgraphCtx);
-		},
-		this, 0);
-	pass.setFramebufferInfo(m_fbDescr, {ctx.m_outRenderTarget}, {});
-
-	pass.newDependency({ctx.m_outRenderTarget, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
-
-	if(m_r->getDbg().getEnabled())
-	{
-		pass.newDependency({m_r->getDbg().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
-	}
-
-	pass.newDependency({m_r->getScale().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
-	pass.newDependency({m_r->getBloom().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
-	pass.newDependency({m_r->getMotionVectors().getMotionVectorsRt(), TextureUsageBit::SAMPLED_FRAGMENT});
-	pass.newDependency({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_FRAGMENT});
-
-	RenderTargetHandle dbgRt;
-	Bool dbgRtValid;
-	ShaderProgramPtr debugProgram;
-	m_r->getCurrentDebugRenderTarget(dbgRt, dbgRtValid, debugProgram);
-	if(dbgRtValid)
-	{
-		pass.newDependency({dbgRt, TextureUsageBit::SAMPLED_FRAGMENT});
-	}
-}
-
 } // end namespace anki

+ 4 - 3
AnKi/Renderer/Scale.cpp

@@ -60,7 +60,7 @@ void Scale::populateRenderGraph(RenderingContext& ctx)
 	const Bool needsScale = m_grProg.isCreated();
 	if(!needsScale)
 	{
-		m_runCtx.m_upscaledRt = m_r->getTemporalAA().getRt();
+		m_runCtx.m_upscaledRt = m_r->getTemporalAA().getTonemappedRt();
 	}
 	else
 	{
@@ -69,7 +69,8 @@ void Scale::populateRenderGraph(RenderingContext& ctx)
 		m_runCtx.m_upscaledRt = rgraph.newRenderTarget(m_rtDesc);
 
 		ComputeRenderPassDescription& pass = ctx.m_renderGraphDescr.newComputeRenderPass("Scale");
-		pass.newDependency(RenderPassDependency(m_r->getTemporalAA().getRt(), TextureUsageBit::SAMPLED_COMPUTE));
+		pass.newDependency(
+			RenderPassDependency(m_r->getTemporalAA().getTonemappedRt(), TextureUsageBit::SAMPLED_COMPUTE));
 		pass.newDependency(RenderPassDependency(m_runCtx.m_upscaledRt, TextureUsageBit::IMAGE_COMPUTE_WRITE));
 
 		pass.setWork(
@@ -88,7 +89,7 @@ void Scale::run(RenderPassWorkContext& rgraphCtx)
 	cmdb->bindShaderProgram(m_grProg);
 
 	cmdb->bindSampler(0, 0, m_r->getSamplers().m_trilinearClamp);
-	rgraphCtx.bindColorTexture(0, 1, m_r->getTemporalAA().getRt());
+	rgraphCtx.bindColorTexture(0, 1, m_r->getTemporalAA().getTonemappedRt());
 	rgraphCtx.bindImage(0, 2, m_runCtx.m_upscaledRt);
 
 	if(m_fsr)

+ 25 - 17
AnKi/Renderer/TemporalAA.cpp

@@ -46,7 +46,6 @@ Error TemporalAA::initInternal(const ConfigSet& config)
 		variantInitInfo.addConstant("BLEND_FACTOR", 1.0f / 16.0f);
 		variantInitInfo.addConstant("FB_SIZE",
 									UVec2(m_r->getInternalResolution().x(), m_r->getInternalResolution().y()));
-		variantInitInfo.addMutation("SHARPEN", i + 1);
 		variantInitInfo.addMutation("VARIANCE_CLIPPING", 1);
 		variantInitInfo.addMutation("YCBCR", 0);
 
@@ -68,23 +67,12 @@ Error TemporalAA::initInternal(const ConfigSet& config)
 		m_rtTextures[i] = m_r->createAndClearRenderTarget(texinit);
 	}
 
-	return Error::NONE;
-}
+	m_tonemappedRtDescr =
+		m_r->create2DRenderTargetDescription(m_r->getInternalResolution().x(), m_r->getInternalResolution().y(),
+											 Format::R8G8B8A8_UNORM, "TemporalAA Tonemapped");
+	m_tonemappedRtDescr.bake();
 
-void TemporalAA::run(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx)
-{
-	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
-
-	cmdb->bindShaderProgram(m_grProgs[m_r->getFrameCount() & 1]);
-
-	cmdb->bindSampler(0, 0, m_r->getSamplers().m_trilinearClamp);
-	rgraphCtx.bindTexture(0, 1, m_r->getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
-	rgraphCtx.bindColorTexture(0, 2, m_r->getLightShading().getRt());
-	rgraphCtx.bindColorTexture(0, 3, m_runCtx.m_historyRt);
-	rgraphCtx.bindColorTexture(0, 4, m_r->getMotionVectors().getMotionVectorsRt());
-	rgraphCtx.bindImage(0, 5, m_runCtx.m_renderRt, TextureSubresourceInfo());
-
-	dispatchPPCompute(cmdb, 8, 8, m_r->getInternalResolution().x(), m_r->getInternalResolution().y());
+	return Error::NONE;
 }
 
 void TemporalAA::populateRenderGraph(RenderingContext& ctx)
@@ -107,6 +95,7 @@ void TemporalAA::populateRenderGraph(RenderingContext& ctx)
 	}
 
 	m_runCtx.m_renderRt = rgraph.importRenderTarget(m_rtTextures[renderRtIdx], TextureUsageBit::NONE);
+	m_runCtx.m_tonemappedRt = rgraph.newRenderTarget(m_tonemappedRtDescr);
 
 	// Create pass
 	ComputeRenderPassDescription& pass = rgraph.newComputeRenderPass("TemporalAA");
@@ -119,6 +108,7 @@ void TemporalAA::populateRenderGraph(RenderingContext& ctx)
 		this, 0);
 
 	pass.newDependency({m_runCtx.m_renderRt, TextureUsageBit::IMAGE_COMPUTE_WRITE});
+	pass.newDependency({m_runCtx.m_tonemappedRt, TextureUsageBit::IMAGE_COMPUTE_WRITE});
 	pass.newDependency({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_COMPUTE,
 						TextureSubresourceInfo(DepthStencilAspectBit::DEPTH)});
 	pass.newDependency({m_r->getLightShading().getRt(), TextureUsageBit::SAMPLED_COMPUTE});
@@ -126,4 +116,22 @@ void TemporalAA::populateRenderGraph(RenderingContext& ctx)
 	pass.newDependency({m_r->getMotionVectors().getMotionVectorsRt(), TextureUsageBit::SAMPLED_COMPUTE});
 }
 
+void TemporalAA::run(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx)
+{
+	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
+
+	cmdb->bindShaderProgram(m_grProgs[m_r->getFrameCount() & 1]);
+
+	cmdb->bindSampler(0, 0, m_r->getSamplers().m_trilinearClamp);
+	rgraphCtx.bindTexture(0, 1, m_r->getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
+	rgraphCtx.bindColorTexture(0, 2, m_r->getLightShading().getRt());
+	rgraphCtx.bindColorTexture(0, 3, m_runCtx.m_historyRt);
+	rgraphCtx.bindColorTexture(0, 4, m_r->getMotionVectors().getMotionVectorsRt());
+	rgraphCtx.bindImage(0, 5, m_runCtx.m_renderRt, TextureSubresourceInfo());
+	rgraphCtx.bindImage(0, 6, m_runCtx.m_tonemappedRt, TextureSubresourceInfo());
+	rgraphCtx.bindUniformBuffer(0, 7, m_r->getTonemapping().getAverageLuminanceBuffer());
+
+	dispatchPPCompute(cmdb, 8, 8, m_r->getInternalResolution().x(), m_r->getInternalResolution().y());
+}
+
 } // end namespace anki

+ 9 - 1
AnKi/Renderer/TemporalAA.h

@@ -25,11 +25,16 @@ public:
 
 	void populateRenderGraph(RenderingContext& ctx);
 
-	RenderTargetHandle getRt() const
+	RenderTargetHandle getHdrRt() const
 	{
 		return m_runCtx.m_renderRt;
 	}
 
+	RenderTargetHandle getTonemappedRt() const
+	{
+		return m_runCtx.m_tonemappedRt;
+	}
+
 private:
 	Array<TexturePtr, 2> m_rtTextures;
 	Array<Bool, 2> m_rtTexturesImportedOnce = {};
@@ -37,12 +42,15 @@ private:
 	ShaderProgramResourcePtr m_prog;
 	Array<ShaderProgramPtr, 2> m_grProgs;
 
+	RenderTargetDescription m_tonemappedRtDescr;
+
 	class
 	{
 	public:
 		RenderingContext* m_ctx = nullptr;
 		RenderTargetHandle m_renderRt;
 		RenderTargetHandle m_historyRt;
+		RenderTargetHandle m_tonemappedRt;
 	} m_runCtx;
 
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& cfg);

+ 10 - 18
AnKi/Shaders/FinalComposite.ankiprog

@@ -17,32 +17,26 @@ ANKI_SPECIALIZATION_CONSTANT_U32(MOTION_BLUR_SAMPLES, 3u);
 
 #pragma anki start frag
 #include <AnKi/Shaders/Common.glsl>
-#include <AnKi/Shaders/TonemappingFunctions.glsl>
 #include <AnKi/Shaders/Functions.glsl>
 #include <AnKi/Shaders/MotionBlur.glsl>
 
-#define TONEMAPPING_BINDING 0
-#define TONEMAPPING_SET 0
-#include <AnKi/Shaders/TonemappingResources.glsl>
+layout(set = 0, binding = 0) uniform sampler u_nearestAnyClampSampler;
+layout(set = 0, binding = 1) uniform sampler u_linearAnyClampSampler;
+layout(set = 0, binding = 2) uniform sampler u_trilinearRepeatSampler;
 
-layout(set = 0, binding = 1) uniform sampler u_nearestAnyClampSampler;
-layout(set = 0, binding = 2) uniform sampler u_linearAnyClampSampler;
-layout(set = 0, binding = 3) uniform sampler u_trilinearRepeatSampler;
-
-layout(set = 0, binding = 4) uniform texture2D u_lightShadingRt;
-layout(set = 0, binding = 5) uniform texture2D u_ppsBloomLfRt;
-layout(set = 0, binding = 6) uniform texture3D u_lut;
-layout(set = 0, binding = 7) uniform texture2D u_blueNoise;
-layout(set = 0, binding = 8) uniform texture2D u_motionVectorsRt;
-layout(set = 0, binding = 9) uniform texture2D u_depthRt;
+layout(set = 0, binding = 3) uniform texture2D u_lightShadingRt;
+layout(set = 0, binding = 4) uniform texture2D u_ppsBloomLfRt;
+layout(set = 0, binding = 5) uniform texture3D u_lut;
+layout(set = 0, binding = 6) uniform texture2D u_blueNoise;
+layout(set = 0, binding = 7) uniform texture2D u_motionVectorsRt;
+layout(set = 0, binding = 8) uniform texture2D u_depthRt;
 #if DBG_ENABLED
-layout(set = 0, binding = 10) uniform texture2D u_dbgOutlineRt;
+layout(set = 0, binding = 9) uniform texture2D u_dbgOutlineRt;
 #endif
 
 layout(push_constant, row_major, std430) uniform pc_
 {
 	UVec4 u_frameCountPad3;
-	Mat4 u_prevViewProjMatMulInvViewProjMat;
 };
 
 layout(location = 0) in Vec2 in_uv;
@@ -72,8 +66,6 @@ void main()
 		out_color = textureLod(u_lightShadingRt, u_linearAnyClampSampler, uv, 0.0).rgb;
 	}
 
-	out_color = tonemap(out_color, u_exposureThreshold0);
-
 #if BLOOM_ENABLED
 	const Vec3 bloom = textureLod(u_ppsBloomLfRt, u_linearAnyClampSampler, uv, 0.0).rgb;
 	out_color += bloom;

+ 7 - 20
AnKi/Shaders/TemporalAAResolve.ankiprog

@@ -3,7 +3,6 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#pragma anki mutator SHARPEN 0 1 2 // 0: disabled, 1: vertical, 2: horizontal
 #pragma anki mutator VARIANCE_CLIPPING 0 1
 #pragma anki mutator YCBCR 0 1
 
@@ -25,6 +24,11 @@ layout(set = 0, binding = 2) uniform texture2D u_inputRt;
 layout(set = 0, binding = 3) uniform texture2D u_historyRt;
 layout(set = 0, binding = 4) uniform texture2D u_motionVectorsTex;
 layout(set = 0, binding = 5) writeonly uniform image2D u_outImg;
+layout(set = 0, binding = 6) writeonly uniform image2D u_tonemappedImg;
+
+const U32 TONEMAPPING_SET = 0u;
+const U32 TONEMAPPING_BINDING = 7u;
+#include <AnKi/Shaders/TonemappingResources.glsl>
 
 #if YCBCR
 #	define sample(s, uv) rgbToYCbCr(textureLod(s, u_linearAnyClampSampler, uv, 0.0).rgb)
@@ -35,21 +39,6 @@ layout(set = 0, binding = 5) writeonly uniform image2D u_outImg;
 #	define sampleOffset(s, uv, x, y) textureLodOffset(sampler2D(s, u_linearAnyClampSampler), uv, 0.0, IVec2(x, y)).rgb
 #endif
 
-#define VELOCITY 0
-
-Vec3 sharpen(Vec2 uv)
-{
-	const Vec3 center = sample(u_inputRt, uv);
-#if SHARPEN == 1
-	Vec3 near = sampleOffset(u_inputRt, uv, 1, 0) + sampleOffset(u_inputRt, uv, -1, 0);
-#else
-	Vec3 near = sampleOffset(u_inputRt, uv, 0, 1) + sampleOffset(u_inputRt, uv, 0, -1);
-#endif
-	near *= 0.5;
-	const F32 sharpness = 1.0;
-	return center + max(Vec3(0.0), center - near) * sharpness;
-}
-
 void main()
 {
 	if(skipOutOfBoundsInvocations(WORKGROUP_SIZE, FB_SIZE))
@@ -65,11 +54,7 @@ void main()
 
 	// Read textures
 	Vec3 historyCol = sample(u_historyRt, oldUv);
-#if SHARPEN > 0
-	const Vec3 crntCol = sharpen(uv);
-#else
 	const Vec3 crntCol = sample(u_inputRt, uv);
-#endif
 
 	// Remove ghosting by clamping the history color to neighbour's AABB
 	const Vec3 near0 = sampleOffset(u_inputRt, uv, 1, 0);
@@ -115,6 +100,8 @@ void main()
 	outColor = yCbCrToRgb(outColor);
 #endif
 	imageStore(u_outImg, IVec2(gl_GlobalInvocationID.xy), Vec4(outColor, 0.0));
+
+	imageStore(u_tonemappedImg, IVec2(gl_GlobalInvocationID.xy), Vec4(tonemap(outColor, u_exposureThreshold0), 0.0));
 }
 
 #pragma anki end

+ 2 - 2
AnKi/Shaders/TonemappingResources.glsl

@@ -14,9 +14,9 @@
 #endif
 
 #if TONEMAPPING_RESOURCE_AS_BUFFER
-layout(std140, set = TONEMAPPING_SET, binding = TONEMAPPING_BINDING) buffer tmss0_
+layout(std140, set = TONEMAPPING_SET, binding = TONEMAPPING_BINDING) buffer b_tonemapping
 #else
-layout(std140, set = TONEMAPPING_SET, binding = TONEMAPPING_BINDING) uniform tmu0_
+layout(std140, set = TONEMAPPING_SET, binding = TONEMAPPING_BINDING) uniform b_tonemapping
 #endif
 {
 	Vec4 u_averageLuminanceExposurePad2;