Browse Source

Add fog support

Panagiotis Christopoulos Charitos 10 years ago
parent
commit
a32f808ea4
6 changed files with 98 additions and 15 deletions
  1. 2 0
      .travis.yml
  2. 2 0
      include/anki/Renderer.h
  3. 12 0
      include/anki/renderer/Pps.h
  4. 45 15
      shaders/Pps.frag.glsl
  5. 36 0
      src/renderer/Pps.cpp
  6. 1 0
      testapp/Main.cpp

+ 2 - 0
.travis.yml

@@ -16,9 +16,11 @@ install:
 
 script:
   - cd build
+  - echo Build release
   - cmake .. -DANKI_OPTIMIZE=ON -DANKI_DEBUG=OFF -DANKI_DEBUG_SYMBOLS=OFF -DANKI_BUILD_TOOLS=ON -DANKI_BUILD_TESTS=ON -DANKI_ENABLE_COUNTERS=OFF
   - make
   - ./clean.sh
+  - echo Build debug
   - cmake .. -DANKI_OPTIMIZE=OFF -DANKI_DEBUG=ON -DANKI_DEBUG_SYMBOLS=ON -DANKI_BUILD_TOOLS=ON -DANKI_BUILD_TESTS=ON -DANKI_ENABLE_COUNTERS=ON
   - make
 

+ 2 - 0
include/anki/Renderer.h

@@ -6,6 +6,8 @@
 #pragma once
 
 #include "anki/renderer/MainRenderer.h"
+#include "anki/renderer/Renderer.h"
+#include "anki/renderer/Pps.h"
 #include "anki/renderer/Dbg.h"
 
 /// @defgroup renderer Renderering system

+ 12 - 0
include/anki/renderer/Pps.h

@@ -60,6 +60,13 @@ public:
 	/// Load the color grading texture.
 	Error loadColorGradingTexture(CString filename);
 
+	void setFog(const Vec3& color, F32 factor)
+	{
+		m_uniformsDirty = true;
+		m_fogColor = color;
+		m_fogFactor = factor;
+	}
+
 anki_internal:
 	static const PixelFormat RT_PIXEL_FORMAT;
 
@@ -94,6 +101,11 @@ private:
 
 	TextureResourcePtr m_lut; ///< Color grading lookup texture.
 
+	Bool8 m_uniformsDirty = true;
+	BufferPtr m_uniformsBuff;
+	Vec3 m_fogColor = Vec3(1.0);
+	F32 m_fogFactor = 1.0;
+
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& config);
 };
 /// @}

+ 45 - 15
shaders/Pps.frag.glsl

@@ -8,19 +8,35 @@
 #pragma anki include "shaders/Tonemapping.glsl"
 #pragma anki include "shaders/LinearDepth.glsl"
 
-layout(binding = 0) uniform lowp sampler2D u_isRt;
-layout(binding = 1) uniform lowp sampler2D u_ppsSsaoRt;
-layout(binding = 2) uniform lowp sampler2D u_ppsBloomLfRt;
-layout(binding = 3) uniform lowp sampler3D u_lut;
-layout(binding = 4) uniform lowp sampler2D u_ppsSslfRt;
+layout(binding = 0) uniform sampler2D u_isRt;
+layout(binding = 1) uniform sampler2D u_ppsSsaoRt;
+layout(binding = 2) uniform sampler2D u_ppsBloomLfRt;
+layout(binding = 3) uniform sampler3D u_lut;
+layout(binding = 4) uniform sampler2D u_ppsSslfRt;
+layout(binding = 5) uniform sampler2D u_msDepthRt;
+
+struct Luminance
+{
+	vec4 averageLuminancePad3;
+};
 
-layout(std140, binding = 0) readonly buffer _blk
+layout(std140, SS_BINDING(0, 0)) readonly buffer _s0
 {
-	vec4 u_averageLuminancePad3;
+	Luminance u_luminance;
 };
 
-layout(location = 0) in vec2 in_texCoords;
+struct Uniforms
+{
+	vec4 nearFarPad2;
+	vec4 fogColorFogFactor;
+};
+
+layout(std140, SS_BINDING(0, 1)) readonly buffer _s1
+{
+	Uniforms u_uniforms;
+};
 
+layout(location = 0) in vec2 in_uv;
 layout(location = 0) out vec3 out_color;
 
 const vec2 TEX_OFFSET = vec2(1.0 / float(FBO_WIDTH), 1.0 / float(FBO_HEIGHT));
@@ -108,29 +124,43 @@ vec3 colorGrading(in vec3 color)
 	return textureLod(u_lut, lutCoords, 0.0).rgb;
 }
 
+//==============================================================================
+vec3 fog(vec3 colorIn, vec2 uv)
+{
+	float depth = textureLod(u_msDepthRt, uv, 2.0).r;
+	float linearDepth = linearizeDepth(depth, u_uniforms.nearFarPad2.x,
+		u_uniforms.nearFarPad2.y);
+
+	linearDepth = pow(linearDepth, 1.0);
+	float t = linearDepth * u_uniforms.fogColorFogFactor.w;
+	return colorIn * (1.0 - t) + u_uniforms.fogColorFogFactor.rgb * t;
+}
+
 //==============================================================================
 void main()
 {
 #if SHARPEN_ENABLED
-	out_color = sharpen(u_isRt, in_texCoords);
+	out_color = sharpen(u_isRt, in_uv);
 #else
-	out_color = textureLod(u_isRt, in_texCoords, 0.0).rgb;
+	out_color = textureLod(u_isRt, in_uv, 0.0).rgb;
 #endif
 
 #if SSAO_ENABLED
-	float ssao = textureLod(u_ppsSsaoRt, in_texCoords, 0.0).r;
+	float ssao = textureLod(u_ppsSsaoRt, in_uv, 0.0).r;
 	out_color *= ssao;
 #endif
 
-	out_color = tonemap(out_color, u_averageLuminancePad3.x, 0.0);
+	out_color = tonemap(out_color, u_luminance.averageLuminancePad3.x, 0.0);
+
+	out_color = fog(out_color, in_uv);
 
 #if BLOOM_ENABLED
-	vec3 bloom = textureLod(u_ppsBloomLfRt, in_texCoords, 0.0).rgb;
+	vec3 bloom = textureLod(u_ppsBloomLfRt, in_uv, 0.0).rgb;
 	out_color += bloom;
 #endif
 
 #if SSLF_ENABLED
-	vec3 sslf = textureLod(u_ppsSslfRt, in_texCoords, 0.0).rgb;
+	vec3 sslf = textureLod(u_ppsSslfRt, in_uv, 0.0).rgb;
 	out_color += sslf;
 #endif
 
@@ -139,7 +169,7 @@ void main()
 #if 0
 	if(out_color.x != 0.0000001)
 	{
-		out_color = vec3(mip);
+		out_color = u_uniforms.fogColorFogFactor.rgb;
 	}
 #endif
 }

+ 36 - 0
src/renderer/Pps.cpp

@@ -11,12 +11,28 @@
 #include "anki/renderer/Sslr.h"
 #include "anki/renderer/Tm.h"
 #include "anki/renderer/Is.h"
+#include "anki/renderer/Ms.h"
 #include "anki/renderer/Dbg.h"
 #include "anki/util/Logger.h"
 #include "anki/misc/ConfigSet.h"
+#include "anki/scene/SceneNode.h"
+#include "anki/scene/FrustumComponent.h"
 
 namespace anki {
 
+//==============================================================================
+// Misc                                                                        =
+//==============================================================================
+struct Uniforms
+{
+	Vec4 m_nearFarPad2;
+	Vec4 m_fogColorFogFactor;
+};
+
+//==============================================================================
+// Pps                                                                         =
+//==============================================================================
+
 //==============================================================================
 const PixelFormat Pps::RT_PIXEL_FORMAT(
 	ComponentFormat::R8G8B8, TransformFormat::UNORM);
@@ -98,6 +114,10 @@ Error Pps::initInternal(const ConfigSet& config)
 	// LUT
 	ANKI_CHECK(loadColorGradingTexture("engine_data/default_lut.ankitex"));
 
+	// Uniforms
+	m_uniformsBuff = getGrManager().newInstance<Buffer>(sizeof(Uniforms),
+		BufferUsageBit::STORAGE, BufferAccessBit::CLIENT_WRITE);
+
 	// RC goup
 	ResourceGroupInitializer rcInit;
 	rcInit.m_textures[0].m_texture = m_r->getIs().getRt();
@@ -119,7 +139,10 @@ Error Pps::initInternal(const ConfigSet& config)
 		rcInit.m_textures[4].m_texture = m_sslf->getRt();
 	}
 
+	rcInit.m_textures[5].m_texture = m_r->getMs().getDepthRt();
+
 	rcInit.m_storageBuffers[0].m_buffer = m_tm->getAverageLuminanceBuffer();
+	rcInit.m_storageBuffers[1].m_buffer = m_uniformsBuff;
 
 	m_rcGroup = getGrManager().newInstance<ResourceGroup>(rcInit);
 
@@ -189,6 +212,19 @@ void Pps::run(CommandBufferPtr& cmdb)
 	cmdb->bindPipeline(m_ppline);
 	cmdb->bindResourceGroup(m_rcGroup, 0);
 
+	if(m_uniformsDirty)
+	{
+		m_uniformsDirty = false;
+		Uniforms* unis = nullptr;
+		cmdb->writeBuffer(m_uniformsBuff, 0, sizeof(*unis), unis);
+		unis->m_fogColorFogFactor = Vec4(m_fogColor, m_fogFactor);
+
+		const SceneNode& cam = m_r->getActiveCamera();
+		const FrustumComponent& frc = cam.getComponent<FrustumComponent>();
+		unis->m_nearFarPad2 = Vec4(frc.getFrustum().getNear(),
+			frc.getFrustum().getFar(), 0.0, 0.0);
+	}
+
 	m_r->drawQuad(cmdb);
 }
 

+ 1 - 0
testapp/Main.cpp

@@ -64,6 +64,7 @@ Error init()
 	ResourceManager& resources = app->getResourceManager();
 
 	scene.setAmbientColor(Vec4(1.0) * 0.05);
+	renderer.getOffscreenRenderer().getPps().setFog(Vec3(1.0, 0.9, 0.9), 0.5);
 
 	if(getenv("PROFILE"))
 	{