Browse Source

Renderer: Control the volumetric modulation using camera rotation

Panagiotis Christopoulos Charitos 8 years ago
parent
commit
50234c4f90

+ 2 - 1
shaders/Ssao.frag.glsl

@@ -10,6 +10,7 @@
 
 const vec2 KERNEL[SAMPLES] = KERNEL_ARRAY; // This will be appended in C++
 const float BIAS = 0.3;
+const float STRENGTH = 1.5;
 
 layout(location = 0) in vec2 in_uv;
 
@@ -100,5 +101,5 @@ void main(void)
 		factor += f;
 	}
 
-	out_color = 1.0 - factor / float(SAMPLES);
+	out_color = 1.0 - factor / float(SAMPLES) * STRENGTH;
 }

+ 4 - 3
shaders/Volumetric.frag.glsl

@@ -21,13 +21,14 @@ layout(ANKI_TEX_BINDING(0, 1)) uniform sampler2DArray u_noiseTex;
 layout(std140, ANKI_UBO_BINDING(0, 3)) uniform ubo0_
 {
 	vec4 u_linearizeNoiseTexOffsetLayer;
-	vec4 u_fogParticleColorPad1;
+	vec4 u_fogParticleColorBlendFactor;
 };
 
 #define u_linearize u_linearizeNoiseTexOffsetLayer.xy
 #define u_noiseYOffset u_linearizeNoiseTexOffsetLayer.z
 #define u_noiseLayer u_linearizeNoiseTexOffsetLayer.w
-#define u_fogParticleColor u_fogParticleColorPad1.rgb
+#define u_fogParticleColor u_fogParticleColorBlendFactor.rgb
+#define u_blendFactor u_fogParticleColorBlendFactor.w
 
 layout(location = 0) out vec4 out_color;
 
@@ -154,5 +155,5 @@ void main()
 	}
 
 	newCol *= u_fogParticleColor;
-	out_color = vec4(newCol, 1.0 / 3.0);
+	out_color = vec4(newCol, u_blendFactor);
 }

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

@@ -87,13 +87,8 @@ void BloomExposure::run(RenderingContext& ctx)
 
 	cmdb->bindStorageBuffer(0, 0, m_r->getTm().m_luminanceBuff, 0, MAX_PTR_SIZE);
 
-	cmdb->setBlendFactors(0, BlendFactor::SRC_ALPHA, BlendFactor::ONE_MINUS_SRC_ALPHA);
-
 	m_r->drawQuad(cmdb);
 	cmdb->endRenderPass();
-
-	// Restore state
-	cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::ZERO);
 }
 
 BloomUpscale::~BloomUpscale()

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

@@ -161,6 +161,7 @@ Error Renderer::render(RenderingContext& ctx)
 	ANKI_ASSERT(ctx.m_frustumComponent->getFrustum().getType() == FrustumType::PERSPECTIVE);
 
 	ctx.m_prevViewProjMat = m_prevViewProjMat;
+	ctx.m_prevCamTransform = m_prevCamTransform;
 
 	// Check if resources got loaded
 	if(m_prevLoadRequestCount != m_resources->getLoadingRequestCount()
@@ -273,6 +274,7 @@ Error Renderer::render(RenderingContext& ctx)
 
 	++m_frameCount;
 	m_prevViewProjMat = ctx.m_frustumComponent->getViewProjectionMatrix();
+	m_prevCamTransform = Mat4(ctx.m_frustumComponent->getFrustum().getTransform());
 
 	return ErrorCode::NONE;
 }

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

@@ -35,6 +35,7 @@ public:
 	/// Active frustum.
 	FrustumComponent* m_frustumComponent ANKI_DBG_NULLIFY;
 	Mat4 m_prevViewProjMat;
+	Mat4 m_prevCamTransform;
 
 	CommandBufferPtr m_commandBuffer; ///< Primary command buffer.
 
@@ -408,6 +409,7 @@ private:
 	Bool8 m_willDrawToDefaultFbo = false;
 
 	Mat4 m_prevViewProjMat = Mat4::getIdentity();
+	Mat4 m_prevCamTransform = Mat4::getIdentity();
 
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& initializer);
 

+ 18 - 1
src/anki/renderer/Volumetric.cpp

@@ -159,7 +159,24 @@ void Volumetric::run(RenderingContext& ctx)
 	uniforms[0].z() = m_r->getFrameCount() * texelOffset;
 	uniforms[0].w() = m_r->getFrameCount() & (m_noiseTex->getLayerCount() - 1);
 
-	uniforms[1] = Vec4(m_fogParticleColor, 0.0);
+	// compute the blend factor. If the camera rotated don't blend with previous frames
+	F32 dotZ = ctx.m_frustumComponent->getFrustum().getTransform().getRotation().getZAxis().xyz().dot(
+		ctx.m_prevCamTransform.getZAxis().xyz());
+	F32 dotY = ctx.m_frustumComponent->getFrustum().getTransform().getRotation().getYAxis().xyz().dot(
+		ctx.m_prevCamTransform.getYAxis().xyz());
+
+	const F32 TOLERANCE = cos(toRad(1.0f / 8.0f));
+	F32 blendFactor;
+	if(clamp(dotZ, 0.0f, 1.0f) > TOLERANCE && clamp(dotY, 0.0f, 1.0f) > TOLERANCE)
+	{
+		blendFactor = 1.0 / 4.0;
+	}
+	else
+	{
+		blendFactor = 1.0 / 2.0;
+	}
+
+	uniforms[1] = Vec4(m_fogParticleColor, blendFactor);
 
 	bindStorage(cmdb, 0, 0, ctx.m_is.m_clustersToken);
 	bindStorage(cmdb, 0, 1, ctx.m_is.m_lightIndicesToken);