Browse Source

Merge the motion blur with the final composite

Panagiotis Christopoulos Charitos 7 years ago
parent
commit
fc46ca3cfd

+ 1 - 0
samples/simple_scene/assets/room-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	
 	<inputs>
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 		
 	
 	

+ 10 - 10
samples/simple_scene/assets/scene.lua

@@ -5,34 +5,34 @@ local node
 local inst
 local inst
 local lcomp
 local lcomp
 
 
-node = scene:newSectorNode("sector0", "assets/sector.ankimesh")
+node = scene:newModelNode("roomroom-materialnone0", "assets/roomroom-material.ankimdl")
 trf = Transform.new()
 trf = Transform.new()
 trf:setOrigin(Vec4.new(0, 0, 0, 0))
 trf:setOrigin(Vec4.new(0, 0, 0, 0))
 rot = Mat3x4.new()
 rot = Mat3x4.new()
 rot:setAll(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0)
 rot:setAll(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0)
 trf:setRotation(rot)
 trf:setRotation(rot)
-trf:setScale(1.16458)
+trf:setScale(1)
 node:getSceneNodeBase():getMoveComponent():setLocalTransform(trf)
 node:getSceneNodeBase():getMoveComponent():setLocalTransform(trf)
 
 
-node = scene:newModelNode("roomroom-materialnone0", "assets/roomroom-material.ankimdl")
+node = scene:newModelNode("columnroom-materialnone1", "assets/columnroom-material.ankimdl")
 trf = Transform.new()
 trf = Transform.new()
-trf:setOrigin(Vec4.new(0, 0, 0, 0))
+trf:setOrigin(Vec4.new(4.90187, 5.43441, -4.52919, 0))
 rot = Mat3x4.new()
 rot = Mat3x4.new()
 rot:setAll(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0)
 rot:setAll(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0)
 trf:setRotation(rot)
 trf:setRotation(rot)
 trf:setScale(1)
 trf:setScale(1)
 node:getSceneNodeBase():getMoveComponent():setLocalTransform(trf)
 node:getSceneNodeBase():getMoveComponent():setLocalTransform(trf)
 
 
-node = scene:newModelNode("columnroom-materialnone1", "assets/columnroom-material.ankimdl")
+node = scene:newModelNode("sectorportal-materialnone2", "assets/sectorportal-material.ankimdl")
 trf = Transform.new()
 trf = Transform.new()
-trf:setOrigin(Vec4.new(4.90187, 5.43441, -4.52919, 0))
+trf:setOrigin(Vec4.new(0, 0, 0, 0))
 rot = Mat3x4.new()
 rot = Mat3x4.new()
 rot:setAll(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0)
 rot:setAll(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0)
 trf:setRotation(rot)
 trf:setRotation(rot)
-trf:setScale(1)
+trf:setScale(1.16458)
 node:getSceneNodeBase():getMoveComponent():setLocalTransform(trf)
 node:getSceneNodeBase():getMoveComponent():setLocalTransform(trf)
 
 
-node = scene:newModelNode("columnroom-materialnone2", "assets/columnroom-material.ankimdl")
+node = scene:newModelNode("columnroom-materialnone3", "assets/columnroom-material.ankimdl")
 trf = Transform.new()
 trf = Transform.new()
 trf:setOrigin(Vec4.new(-4.59369, 5.43441, -4.49454, 0))
 trf:setOrigin(Vec4.new(-4.59369, 5.43441, -4.49454, 0))
 rot = Mat3x4.new()
 rot = Mat3x4.new()
@@ -41,7 +41,7 @@ trf:setRotation(rot)
 trf:setScale(1)
 trf:setScale(1)
 node:getSceneNodeBase():getMoveComponent():setLocalTransform(trf)
 node:getSceneNodeBase():getMoveComponent():setLocalTransform(trf)
 
 
-node = scene:newModelNode("columnroom-materialnone3", "assets/columnroom-material.ankimdl")
+node = scene:newModelNode("columnroom-materialnone4", "assets/columnroom-material.ankimdl")
 trf = Transform.new()
 trf = Transform.new()
 trf:setOrigin(Vec4.new(-4.61101, 5.43441, 4.79029, 0))
 trf:setOrigin(Vec4.new(-4.61101, 5.43441, 4.79029, 0))
 rot = Mat3x4.new()
 rot = Mat3x4.new()
@@ -50,7 +50,7 @@ trf:setRotation(rot)
 trf:setScale(1)
 trf:setScale(1)
 node:getSceneNodeBase():getMoveComponent():setLocalTransform(trf)
 node:getSceneNodeBase():getMoveComponent():setLocalTransform(trf)
 
 
-node = scene:newModelNode("columnroom-materialnone4", "assets/columnroom-material.ankimdl")
+node = scene:newModelNode("columnroom-materialnone5", "assets/columnroom-material.ankimdl")
 trf = Transform.new()
 trf = Transform.new()
 trf:setOrigin(Vec4.new(4.95098, 5.43441, 4.79029, 0))
 trf:setOrigin(Vec4.new(4.95098, 5.43441, 4.79029, 0))
 rot = Mat3x4.new()
 rot = Mat3x4.new()

+ 14 - 12
shaders/FinalComposite.glslp

@@ -4,7 +4,6 @@
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
 #pragma anki mutator BLUE_NOISE 0 1
 #pragma anki mutator BLUE_NOISE 0 1
-#pragma anki mutator SHARPEN_ENABLED 0 1
 #pragma anki mutator BLOOM_ENABLED 0 1
 #pragma anki mutator BLOOM_ENABLED 0 1
 #pragma anki mutator DBG_ENABLED 0 1
 #pragma anki mutator DBG_ENABLED 0 1
 
 
@@ -19,20 +18,26 @@
 #include <shaders/Common.glsl>
 #include <shaders/Common.glsl>
 #include <shaders/Tonemapping.glsl>
 #include <shaders/Tonemapping.glsl>
 #include <shaders/Functions.glsl>
 #include <shaders/Functions.glsl>
+#include <shaders/MotionBlur.glsl>
 
 
-layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D u_isRt;
+layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D u_lightShadingRt;
 layout(ANKI_TEX_BINDING(0, 1)) uniform sampler2D u_ppsBloomLfRt;
 layout(ANKI_TEX_BINDING(0, 1)) uniform sampler2D u_ppsBloomLfRt;
 layout(ANKI_TEX_BINDING(0, 2)) uniform sampler3D u_lut;
 layout(ANKI_TEX_BINDING(0, 2)) uniform sampler3D u_lut;
 layout(ANKI_TEX_BINDING(0, 3)) uniform sampler2DArray u_blueNoise;
 layout(ANKI_TEX_BINDING(0, 3)) uniform sampler2DArray u_blueNoise;
+layout(ANKI_TEX_BINDING(0, 4)) uniform sampler2D u_velocityRt;
+layout(ANKI_TEX_BINDING(0, 5)) uniform sampler2D u_depthRt;
 #if DBG_ENABLED
 #if DBG_ENABLED
-layout(ANKI_TEX_BINDING(0, 5)) uniform sampler2D u_dbgRt;
+layout(ANKI_TEX_BINDING(0, 6)) uniform sampler2D u_dbgRt;
 #endif
 #endif
 
 
-layout(std140, ANKI_UBO_BINDING(0, 0)) uniform u0_
+struct PushConsts
 {
 {
-	Vec4 u_blueNoiseLayerPad3;
+	Vec4 m_blueNoiseLayerPad3;
+	Mat4 m_prevViewProjMatMulInvViewProjMat;
 };
 };
 
 
+ANKI_PUSH_CONSTANTS(PushConsts, u_regs);
+
 #define TONEMAPPING_BINDING 1
 #define TONEMAPPING_BINDING 1
 #include <shaders/TonemappingResources.glsl>
 #include <shaders/TonemappingResources.glsl>
 
 
@@ -53,11 +58,8 @@ void main()
 {
 {
 	Vec2 uv = in_uv.xy;
 	Vec2 uv = in_uv.xy;
 
 
-#if SHARPEN_ENABLED
-	out_color = readSharpen(u_isRt, uv, 0.15, true);
-#else
-	out_color = textureLod(u_isRt, uv, 0.0).rgb;
-#endif
+	out_color =
+		motionBlur(u_velocityRt, u_lightShadingRt, u_depthRt, uv, u_regs.m_prevViewProjMatMulInvViewProjMat, 32u);
 
 
 	out_color = tonemap(out_color, UNIFORM(u_exposureThreshold0));
 	out_color = tonemap(out_color, UNIFORM(u_exposureThreshold0));
 
 
@@ -69,7 +71,7 @@ void main()
 	out_color = colorGrading(out_color);
 	out_color = colorGrading(out_color);
 
 
 #if BLUE_NOISE
 #if BLUE_NOISE
-	Vec3 blueNoise = textureLod(u_blueNoise, Vec3(FB_SIZE / Vec2(64.0) * uv, u_blueNoiseLayerPad3.x), 0.0).rgb;
+	Vec3 blueNoise = textureLod(u_blueNoise, Vec3(FB_SIZE / Vec2(64.0) * uv, u_regs.m_blueNoiseLayerPad3.x), 0.0).rgb;
 	blueNoise = blueNoise * 2.0 - 1.0;
 	blueNoise = blueNoise * 2.0 - 1.0;
 	blueNoise = sign(blueNoise) * (1.0 - sqrt(1.0 - abs(blueNoise)));
 	blueNoise = sign(blueNoise) * (1.0 - sqrt(1.0 - abs(blueNoise)));
 
 
@@ -78,7 +80,7 @@ void main()
 
 
 #if 0
 #if 0
 	{
 	{
-		out_color = textureLod(u_isRt, uv, 0.0).rgb;
+		out_color = textureLod(u_lightShadingRt, uv, 0.0).rgb;
 	}
 	}
 #endif
 #endif
 
 

+ 53 - 0
shaders/MotionBlur.glsl

@@ -0,0 +1,53 @@
+// Copyright (C) 2009-2018, Panagiotis Christopoulos Charitos and contributors.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#pragma once
+
+#include <shaders/Common.glsl>
+
+// Perform motion blur.
+Vec3 motionBlur(sampler2D velocityTex,
+	sampler2D toBlurTex,
+	sampler2D depthTex,
+	Vec2 nowUv,
+	Mat4 prevViewProjMatMulInvViewProjMat,
+	U32 maxSamples)
+{
+	// Compute previous UV
+	Vec2 pastUv = textureLod(velocityTex, nowUv, 0.0).rg;
+
+	ANKI_BRANCH if(pastUv.x < 0.0)
+	{
+		F32 depth = textureLod(depthTex, nowUv, 0.0).r;
+
+		Vec4 v4 = prevViewProjMatMulInvViewProjMat * Vec4(UV_TO_NDC(nowUv), depth, 1.0);
+		pastUv = NDC_TO_UV(v4.xy / v4.w);
+	}
+
+	// March direction
+	Vec2 dir = pastUv - nowUv;
+
+	Vec2 slopes = abs(dir);
+
+	// Compute the sample count
+	Vec2 sampleCount2D = slopes * Vec2(FB_SIZE);
+	F32 sampleCountf = max(sampleCount2D.x, sampleCount2D.y);
+	sampleCountf = clamp(sampleCountf, 1.0, F32(maxSamples));
+	sampleCountf = round(sampleCountf);
+
+	// Loop
+	Vec3 outColor = Vec3(0.0);
+	ANKI_LOOP for(F32 s = 0.0; s < sampleCountf; s += 1.0)
+	{
+		F32 f = s / sampleCountf;
+		Vec2 sampleUv = nowUv + dir * f;
+
+		outColor += textureLod(toBlurTex, sampleUv, 0.0).rgb;
+	}
+
+	outColor /= sampleCountf;
+
+	return outColor;
+}

+ 0 - 74
shaders/MotionBlur.glslp

@@ -1,74 +0,0 @@
-// Copyright (C) 2009-2018, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki input const UVec2 WORKGROUP_SIZE
-#pragma anki input const UVec2 FB_SIZE
-#pragma anki input const U32 MAX_SAMPLES
-
-#pragma anki start comp
-#include <shaders/Functions.glsl>
-
-layout(local_size_x = WORKGROUP_SIZE.x, local_size_y = WORKGROUP_SIZE.y, local_size_z = 1) in;
-
-layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D u_velocityRt;
-layout(ANKI_TEX_BINDING(0, 1)) uniform sampler2D u_toBlurRt;
-layout(ANKI_TEX_BINDING(0, 2)) uniform sampler2D u_depthRt;
-
-layout(ANKI_IMAGE_BINDING(0, 0)) writeonly uniform image2D out_img;
-
-struct PushConsts
-{
-	Mat4 m_prevViewProjMatMulInvViewProjMat;
-};
-ANKI_PUSH_CONSTANTS(PushConsts, u_regs);
-
-const Vec2 TEXEL_SIZE = 1.0 / Vec2(FB_SIZE);
-
-void main()
-{
-	SKIP_OUT_OF_BOUNDS_INVOCATIONS();
-
-	// Crnt UV
-	Vec2 nowUv = (Vec2(gl_GlobalInvocationID.xy) + 0.5) / Vec2(FB_SIZE);
-
-	// Compute previous UV
-	Vec2 pastUv = textureLod(u_velocityRt, nowUv, 0.0).rg;
-
-	ANKI_BRANCH if(pastUv.x < 0.0)
-	{
-		F32 depth = textureLod(u_depthRt, nowUv, 0.0).r;
-
-		Vec4 v4 = u_regs.m_prevViewProjMatMulInvViewProjMat * Vec4(UV_TO_NDC(nowUv), depth, 1.0);
-		pastUv = NDC_TO_UV(v4.xy / v4.w);
-	}
-
-	// March direction
-	Vec2 dir = pastUv - nowUv;
-
-	Vec2 slopes = abs(dir);
-
-	// Compute the sample count
-	Vec2 sampleCount2D = slopes * Vec2(FB_SIZE);
-	F32 sampleCountf = max(sampleCount2D.x, sampleCount2D.y);
-	sampleCountf = clamp(sampleCountf, 1.0, F32(MAX_SAMPLES));
-	sampleCountf = round(sampleCountf);
-
-	// Loop
-	Vec3 outColor = Vec3(0.0);
-	ANKI_LOOP for(F32 s = 0.0; s < sampleCountf; s += 1.0)
-	{
-		F32 f = s / sampleCountf;
-		Vec2 sampleUv = nowUv + dir * f;
-
-		outColor += textureLod(u_toBlurRt, sampleUv, 0.0).rgb;
-	}
-
-	outColor /= sampleCountf;
-
-	// Write the result
-	imageStore(out_img, IVec2(gl_GlobalInvocationID.xy), Vec4(outColor, 0.0));
-}
-
-#pragma anki end

+ 0 - 2
src/anki/core/Config.cpp

@@ -31,8 +31,6 @@ Config::Config()
 	newOption("r.bloom.threshold", 2.5);
 	newOption("r.bloom.threshold", 2.5);
 	newOption("r.bloom.scale", 2.5);
 	newOption("r.bloom.scale", 2.5);
 
 
-	newOption("r.finalComposite.sharpen", false);
-
 	newOption("r.indirect.reflectionResolution", 128);
 	newOption("r.indirect.reflectionResolution", 128);
 	newOption("r.indirect.maxSimultaneousProbeCount", 32);
 	newOption("r.indirect.maxSimultaneousProbeCount", 32);
 
 

+ 5 - 0
src/anki/gr/gl/Common.cpp

@@ -367,6 +367,11 @@ void convertTextureInformation(
 		internalFormat = GL_RG16;
 		internalFormat = GL_RG16;
 		type = GL_UNSIGNED_SHORT;
 		type = GL_UNSIGNED_SHORT;
 		break;
 		break;
+	case Format::R16G16_SNORM:
+		format = GL_RG;
+		internalFormat = GL_RG16_SNORM;
+		type = GL_SHORT;
+		break;
 	case Format::R16G16B16_SFLOAT:
 	case Format::R16G16B16_SFLOAT:
 		format = GL_RGB;
 		format = GL_RGB;
 		internalFormat = GL_RGB16F;
 		internalFormat = GL_RGB16F;

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

@@ -37,7 +37,6 @@ class DepthDownscale;
 class TemporalAA;
 class TemporalAA;
 class UiStage;
 class UiStage;
 class Ssr;
 class Ssr;
-class MotionBlur;
 
 
 class RenderingContext;
 class RenderingContext;
 class DebugDrawer;
 class DebugDrawer;

+ 26 - 15
src/anki/renderer/FinalComposite.cpp

@@ -7,7 +7,6 @@
 #include <anki/renderer/Renderer.h>
 #include <anki/renderer/Renderer.h>
 #include <anki/renderer/Bloom.h>
 #include <anki/renderer/Bloom.h>
 #include <anki/renderer/TemporalAA.h>
 #include <anki/renderer/TemporalAA.h>
-#include <anki/renderer/MotionBlur.h>
 #include <anki/renderer/Tonemapping.h>
 #include <anki/renderer/Tonemapping.h>
 #include <anki/renderer/LightShading.h>
 #include <anki/renderer/LightShading.h>
 #include <anki/renderer/GBuffer.h>
 #include <anki/renderer/GBuffer.h>
@@ -36,7 +35,6 @@ Error FinalComposite::initInternal(const ConfigSet& config)
 	ANKI_ASSERT("Initializing PPS");
 	ANKI_ASSERT("Initializing PPS");
 
 
 	ANKI_CHECK(loadColorGradingTexture("engine_data/DefaultLut.ankitex"));
 	ANKI_CHECK(loadColorGradingTexture("engine_data/DefaultLut.ankitex"));
-	m_sharpenEnabled = config.getNumber("r.finalComposite.sharpen");
 
 
 	if(!m_r->getDrawToDefaultFramebuffer())
 	if(!m_r->getDrawToDefaultFramebuffer())
 	{
 	{
@@ -59,11 +57,8 @@ Error FinalComposite::initInternal(const ConfigSet& config)
 	// Progs
 	// Progs
 	ANKI_CHECK(getResourceManager().loadResource("shaders/FinalComposite.glslp", m_prog));
 	ANKI_CHECK(getResourceManager().loadResource("shaders/FinalComposite.glslp", m_prog));
 
 
-	ShaderProgramResourceMutationInitList<4> mutations(m_prog);
-	mutations.add("BLUE_NOISE", 1)
-		.add("SHARPEN_ENABLED", m_sharpenEnabled)
-		.add("BLOOM_ENABLED", 1)
-		.add("DBG_ENABLED", 0);
+	ShaderProgramResourceMutationInitList<3> mutations(m_prog);
+	mutations.add("BLUE_NOISE", 1).add("BLOOM_ENABLED", 1).add("DBG_ENABLED", 0);
 
 
 	ShaderProgramResourceConstantValueInitList<2> consts(m_prog);
 	ShaderProgramResourceConstantValueInitList<2> consts(m_prog);
 	consts.add("LUT_SIZE", U32(LUT_SIZE)).add("FB_SIZE", UVec2(m_r->getWidth(), m_r->getHeight()));
 	consts.add("LUT_SIZE", U32(LUT_SIZE)).add("FB_SIZE", UVec2(m_r->getWidth(), m_r->getHeight()));
@@ -72,7 +67,7 @@ Error FinalComposite::initInternal(const ConfigSet& config)
 	m_prog->getOrCreateVariant(mutations.get(), consts.get(), variant);
 	m_prog->getOrCreateVariant(mutations.get(), consts.get(), variant);
 	m_grProgs[0] = variant->getProgram();
 	m_grProgs[0] = variant->getProgram();
 
 
-	mutations[3].m_value = 1;
+	mutations[2].m_value = 1;
 	m_prog->getOrCreateVariant(mutations.get(), consts.get(), variant);
 	m_prog->getOrCreateVariant(mutations.get(), consts.get(), variant);
 	m_grProgs[1] = variant->getProgram();
 	m_grProgs[1] = variant->getProgram();
 
 
@@ -108,24 +103,39 @@ void FinalComposite::run(RenderingContext& ctx, RenderPassWorkContext& rgraphCtx
 	const Bool dbgEnabled = m_r->getDbg().getEnabled();
 	const Bool dbgEnabled = m_r->getDbg().getEnabled();
 	const Bool drawToDefaultFb = m_r->getDrawToDefaultFramebuffer();
 	const Bool drawToDefaultFb = m_r->getDrawToDefaultFramebuffer();
 
 
+	cmdb->bindShaderProgram(m_grProgs[dbgEnabled]);
+
 	// Bind stuff
 	// Bind stuff
-	rgraphCtx.bindColorTextureAndSampler(
-		0, 0, m_r->getMotionBlur().getRt(), (drawToDefaultFb) ? m_r->getNearestSampler() : m_r->getLinearSampler());
+	rgraphCtx.bindColorTextureAndSampler(0, 0, m_r->getTemporalAA().getRt(), m_r->getLinearSampler());
 
 
 	rgraphCtx.bindColorTextureAndSampler(0, 1, m_r->getBloom().getRt(), m_r->getLinearSampler());
 	rgraphCtx.bindColorTextureAndSampler(0, 1, m_r->getBloom().getRt(), m_r->getLinearSampler());
 	cmdb->bindTextureAndSampler(
 	cmdb->bindTextureAndSampler(
 		0, 2, m_lut->getGrTextureView(), m_r->getLinearSampler(), TextureUsageBit::SAMPLED_FRAGMENT);
 		0, 2, m_lut->getGrTextureView(), m_r->getLinearSampler(), TextureUsageBit::SAMPLED_FRAGMENT);
 	cmdb->bindTextureAndSampler(
 	cmdb->bindTextureAndSampler(
 		0, 3, m_blueNoise->getGrTextureView(), m_blueNoise->getSampler(), TextureUsageBit::SAMPLED_FRAGMENT);
 		0, 3, m_blueNoise->getGrTextureView(), m_blueNoise->getSampler(), TextureUsageBit::SAMPLED_FRAGMENT);
+	rgraphCtx.bindColorTextureAndSampler(0, 4, m_r->getGBuffer().getColorRt(3), m_r->getNearestSampler());
+	rgraphCtx.bindTextureAndSampler(0,
+		5,
+		m_r->getGBuffer().getDepthRt(),
+		TextureSubresourceInfo(DepthStencilAspectBit::DEPTH),
+		m_r->getNearestSampler());
+
 	if(dbgEnabled)
 	if(dbgEnabled)
 	{
 	{
-		rgraphCtx.bindColorTextureAndSampler(0, 5, m_r->getDbg().getRt(), m_r->getLinearSampler());
+		rgraphCtx.bindColorTextureAndSampler(0, 6, m_r->getDbg().getRt(), m_r->getLinearSampler());
 	}
 	}
 
 
 	rgraphCtx.bindUniformBuffer(0, 1, m_r->getTonemapping().getAverageLuminanceBuffer());
 	rgraphCtx.bindUniformBuffer(0, 1, m_r->getTonemapping().getAverageLuminanceBuffer());
 
 
-	Vec4* uniforms = allocateAndBindUniforms<Vec4*>(sizeof(Vec4), cmdb, 0, 0);
-	uniforms->x() = F32(m_r->getFrameCount() % m_blueNoise->getLayerCount());
+	struct PushConsts
+	{
+		Vec4 m_blueNoiseLayerPad3;
+		Mat4 m_prevViewProjMatMulInvViewProjMat;
+	} pconsts;
+	pconsts.m_blueNoiseLayerPad3.x() = F32(m_r->getFrameCount() % m_blueNoise->getLayerCount());
+	pconsts.m_prevViewProjMatMulInvViewProjMat = ctx.m_matrices.m_jitter * ctx.m_prevMatrices.m_viewProjection
+												 * ctx.m_matrices.m_viewProjectionJitter.getInverse();
+	cmdb->setPushConstants(&pconsts, sizeof(pconsts));
 
 
 	U width, height;
 	U width, height;
 	if(drawToDefaultFb)
 	if(drawToDefaultFb)
@@ -140,7 +150,6 @@ void FinalComposite::run(RenderingContext& ctx, RenderPassWorkContext& rgraphCtx
 	}
 	}
 	cmdb->setViewport(0, 0, width, height);
 	cmdb->setViewport(0, 0, width, height);
 
 
-	cmdb->bindShaderProgram(m_grProgs[dbgEnabled]);
 	drawQuad(cmdb);
 	drawQuad(cmdb);
 
 
 	// Draw UI
 	// Draw UI
@@ -184,8 +193,10 @@ void FinalComposite::populateRenderGraph(RenderingContext& ctx)
 	{
 	{
 		pass.newConsumer({m_r->getDbg().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 		pass.newConsumer({m_r->getDbg().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 	}
 	}
-	pass.newConsumer({m_r->getMotionBlur().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->getGBuffer().getColorRt(3), TextureUsageBit::SAMPLED_FRAGMENT});
+	pass.newConsumer({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 }
 }
 
 
 } // end namespace anki
 } // end namespace anki

+ 0 - 2
src/anki/renderer/FinalComposite.h

@@ -49,8 +49,6 @@ private:
 	TextureResourcePtr m_lut; ///< Color grading lookup texture.
 	TextureResourcePtr m_lut; ///< Color grading lookup texture.
 	TextureResourcePtr m_blueNoise;
 	TextureResourcePtr m_blueNoise;
 
 
-	Bool8 m_sharpenEnabled = false;
-
 	class
 	class
 	{
 	{
 	public:
 	public:

+ 0 - 95
src/anki/renderer/MotionBlur.cpp

@@ -1,95 +0,0 @@
-// Copyright (C) 2009-2018, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#include <anki/renderer/MotionBlur.h>
-#include <anki/renderer/Renderer.h>
-#include <anki/renderer/TemporalAA.h>
-#include <anki/renderer/GBuffer.h>
-#include <anki/misc/ConfigSet.h>
-
-namespace anki
-{
-
-MotionBlur::~MotionBlur()
-{
-}
-
-Error MotionBlur::init(const ConfigSet& config)
-{
-	ANKI_R_LOGI("Initializing motion blur");
-
-	Error err = initInternal(config);
-	if(err)
-	{
-		ANKI_R_LOGE("Failed to init motion blur");
-	}
-
-	return err;
-}
-
-Error MotionBlur::initInternal(const ConfigSet& config)
-{
-	// RT
-	m_rtDescr = m_r->create2DRenderTargetDescription(
-		m_r->getWidth(), m_r->getHeight(), LIGHT_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT, "MBlur");
-	m_rtDescr.bake();
-
-	// Prog
-	ANKI_CHECK(getResourceManager().loadResource("shaders/MotionBlur.glslp", m_prog));
-
-	ShaderProgramResourceConstantValueInitList<3> consts(m_prog);
-	consts.add("WORKGROUP_SIZE", UVec2(m_workgroupSize[0], m_workgroupSize[1]))
-		.add("FB_SIZE", UVec2(m_r->getWidth(), m_r->getHeight()))
-		.add("MAX_SAMPLES", U32(config.getNumber("r.motionBlur.maxSamples")));
-
-	const ShaderProgramResourceVariant* variant;
-	m_prog->getOrCreateVariant(consts.get(), variant);
-	m_grProg = variant->getProgram();
-
-	return Error::NONE;
-}
-
-void MotionBlur::populateRenderGraph(RenderingContext& ctx)
-{
-	m_runCtx.m_ctx = &ctx;
-	RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
-
-	m_runCtx.m_rt = rgraph.newRenderTarget(m_rtDescr);
-
-	ComputeRenderPassDescription& pass = rgraph.newComputeRenderPass("Motion blur");
-
-	pass.newConsumer({m_r->getTemporalAA().getRt(), TextureUsageBit::SAMPLED_COMPUTE});
-	pass.newConsumer({m_r->getGBuffer().getColorRt(3), TextureUsageBit::SAMPLED_COMPUTE});
-	pass.newConsumer({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_COMPUTE});
-	pass.newConsumerAndProducer({m_runCtx.m_rt, TextureUsageBit::IMAGE_COMPUTE_WRITE});
-
-	pass.setWork(runCallback, this, 0);
-}
-
-void MotionBlur::run(RenderPassWorkContext& rgraphCtx)
-{
-	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
-	const RenderingContext& ctx = *m_runCtx.m_ctx;
-
-	cmdb->bindShaderProgram(m_grProg);
-
-	rgraphCtx.bindColorTextureAndSampler(0, 0, m_r->getGBuffer().getColorRt(3), m_r->getNearestSampler());
-	rgraphCtx.bindColorTextureAndSampler(0, 1, m_r->getTemporalAA().getRt(), m_r->getNearestSampler());
-	rgraphCtx.bindTextureAndSampler(0,
-		2,
-		m_r->getGBuffer().getDepthRt(),
-		TextureSubresourceInfo(DepthStencilAspectBit::DEPTH),
-		m_r->getNearestSampler());
-
-	rgraphCtx.bindImage(0, 0, m_runCtx.m_rt, TextureSubresourceInfo());
-
-	Mat4 prevViewProjMatMulInvViewProjMat = ctx.m_matrices.m_jitter * ctx.m_prevMatrices.m_viewProjection
-											* ctx.m_matrices.m_viewProjectionJitter.getInverse();
-	cmdb->setPushConstants(&prevViewProjMatMulInvViewProjMat, sizeof(prevViewProjMatMulInvViewProjMat));
-
-	dispatchPPCompute(cmdb, m_workgroupSize[0], m_workgroupSize[1], m_r->getWidth(), m_r->getHeight());
-}
-
-} // end namespace anki

+ 0 - 67
src/anki/renderer/MotionBlur.h

@@ -1,67 +0,0 @@
-// Copyright (C) 2009-2018, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma once
-
-#include <anki/renderer/RendererObject.h>
-#include <anki/resource/TextureResource.h>
-#include <anki/Gr.h>
-
-namespace anki
-{
-
-/// @addtogroup renderer
-/// @{
-
-/// Motion blur pass.
-class MotionBlur : public RendererObject
-{
-anki_internal:
-	MotionBlur(Renderer* r)
-		: RendererObject(r)
-	{
-	}
-
-	~MotionBlur();
-
-	ANKI_USE_RESULT Error init(const ConfigSet& config);
-
-	/// Populate the rendergraph.
-	void populateRenderGraph(RenderingContext& ctx);
-
-	RenderTargetHandle getRt() const
-	{
-		return m_runCtx.m_rt;
-	}
-
-private:
-	Array<U16, 2> m_workgroupSize = {{16, 16}};
-
-	ShaderProgramResourcePtr m_prog;
-	ShaderProgramPtr m_grProg;
-
-	RenderTargetDescription m_rtDescr;
-
-	class
-	{
-	public:
-		RenderTargetHandle m_rt;
-		const RenderingContext* m_ctx = nullptr;
-	} m_runCtx; ///< Runtime context.
-
-	Error initInternal(const ConfigSet& config);
-
-	void run(RenderPassWorkContext& rgraphCtx);
-
-	/// A RenderPassWorkCallback.
-	static void runCallback(RenderPassWorkContext& rgraphCtx)
-	{
-		MotionBlur* const self = scast<MotionBlur*>(rgraphCtx.m_userData);
-		self->run(rgraphCtx);
-	}
-};
-/// @}
-
-} // end namespace anki

+ 0 - 5
src/anki/renderer/Renderer.cpp

@@ -27,7 +27,6 @@
 #include <anki/renderer/TemporalAA.h>
 #include <anki/renderer/TemporalAA.h>
 #include <anki/renderer/UiStage.h>
 #include <anki/renderer/UiStage.h>
 #include <anki/renderer/Ssr.h>
 #include <anki/renderer/Ssr.h>
-#include <anki/renderer/MotionBlur.h>
 
 
 namespace anki
 namespace anki
 {
 {
@@ -150,9 +149,6 @@ Error Renderer::initInternal(const ConfigSet& config)
 	m_temporalAA.reset(getAllocator().newInstance<TemporalAA>(this));
 	m_temporalAA.reset(getAllocator().newInstance<TemporalAA>(this));
 	ANKI_CHECK(m_temporalAA->init(config));
 	ANKI_CHECK(m_temporalAA->init(config));
 
 
-	m_motionBlur.reset(getAllocator().newInstance<MotionBlur>(this));
-	ANKI_CHECK(m_motionBlur->init(config));
-
 	m_bloom.reset(m_alloc.newInstance<Bloom>(this));
 	m_bloom.reset(m_alloc.newInstance<Bloom>(this));
 	ANKI_CHECK(m_bloom->init(config));
 	ANKI_CHECK(m_bloom->init(config));
 
 
@@ -287,7 +283,6 @@ Error Renderer::populateRenderGraph(RenderingContext& ctx)
 	m_ssr->populateRenderGraph(ctx);
 	m_ssr->populateRenderGraph(ctx);
 	m_lightShading->populateRenderGraph(ctx);
 	m_lightShading->populateRenderGraph(ctx);
 	m_temporalAA->populateRenderGraph(ctx);
 	m_temporalAA->populateRenderGraph(ctx);
-	m_motionBlur->populateRenderGraph(ctx);
 	m_downscale->populateRenderGraph(ctx);
 	m_downscale->populateRenderGraph(ctx);
 	m_tonemapping->populateRenderGraph(ctx);
 	m_tonemapping->populateRenderGraph(ctx);
 	m_bloom->populateRenderGraph(ctx);
 	m_bloom->populateRenderGraph(ctx);

+ 0 - 6
src/anki/renderer/Renderer.h

@@ -147,11 +147,6 @@ public:
 		return *m_temporalAA;
 		return *m_temporalAA;
 	}
 	}
 
 
-	MotionBlur& getMotionBlur()
-	{
-		return *m_motionBlur;
-	}
-
 	DownscaleBlur& getDownscaleBlur()
 	DownscaleBlur& getDownscaleBlur()
 	{
 	{
 		return *m_downscale;
 		return *m_downscale;
@@ -372,7 +367,6 @@ private:
 	UniquePtr<LensFlare> m_lensFlare; ///< Forward shading lens flares.
 	UniquePtr<LensFlare> m_lensFlare; ///< Forward shading lens flares.
 	UniquePtr<DownscaleBlur> m_downscale;
 	UniquePtr<DownscaleBlur> m_downscale;
 	UniquePtr<TemporalAA> m_temporalAA;
 	UniquePtr<TemporalAA> m_temporalAA;
-	UniquePtr<MotionBlur> m_motionBlur;
 	UniquePtr<Tonemapping> m_tonemapping;
 	UniquePtr<Tonemapping> m_tonemapping;
 	UniquePtr<Ssao> m_ssao;
 	UniquePtr<Ssao> m_ssao;
 	UniquePtr<Bloom> m_bloom;
 	UniquePtr<Bloom> m_bloom;