Panagiotis Christopoulos Charitos 12 years ago
parent
commit
47f4bfb92d

+ 1 - 3
bench/Main.cpp

@@ -121,8 +121,7 @@ void initSubsystems()
 	initializer.get("pps.hdr.exposure") = 8.0;
 	initializer.get("pps.hdr.exposure") = 8.0;
 	initializer.get("pps.ssao.blurringIterationsNum") = 1;
 	initializer.get("pps.ssao.blurringIterationsNum") = 1;
 	initializer.get("pps.ssao.enabled") = true;
 	initializer.get("pps.ssao.enabled") = true;
-	initializer.get("pps.ssao.mainPassRenderingQuality") = 0.35;
-	initializer.get("pps.ssao.blurringRenderingQuality") = 0.35;
+	initializer.get("pps.ssao.renderingQuality") = 0.25;
 	initializer.get("pps.bl.enabled") = true;
 	initializer.get("pps.bl.enabled") = true;
 	initializer.get("pps.bl.blurringIterationsNum") = 2;
 	initializer.get("pps.bl.blurringIterationsNum") = 2;
 	initializer.get("pps.bl.sideBlurFactor") = 1.0;
 	initializer.get("pps.bl.sideBlurFactor") = 1.0;
@@ -141,7 +140,6 @@ void initSubsystems()
 	initializer.get("is.maxPointLightsPerTile") = 4;
 	initializer.get("is.maxPointLightsPerTile") = 4;
 	initializer.get("is.maxSpotLightsPerTile") = 4;
 	initializer.get("is.maxSpotLightsPerTile") = 4;
 	initializer.get("is.maxSpotTexLightsPerTile") = 4;
 	initializer.get("is.maxSpotTexLightsPerTile") = 4;
-	initializer.get("pps.enabled") = false;
 	initializer.get("renderingQuality") = 0.25;
 	initializer.get("renderingQuality") = 0.25;
 	initializer.get("maxTextureSize") = 256;
 	initializer.get("maxTextureSize") = 256;
 	initializer.get("mrt") = false;
 	initializer.get("mrt") = false;

+ 5 - 0
include/anki/renderer/Is.h

@@ -38,6 +38,11 @@ public:
 	{
 	{
 		return fai;
 		return fai;
 	}
 	}
+
+	Texture& getFai()
+	{
+		return fai;
+	}
 	/// @}
 	/// @}
 
 
 private:
 private:

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

@@ -63,6 +63,10 @@ public:
 	{
 	{
 		return fai;
 		return fai;
 	}
 	}
+	Texture& getFai()
+	{
+		return fai;
+	}
 	/// @}
 	/// @}
 
 
 private:
 private:

+ 2 - 11
include/anki/renderer/Ssao.h

@@ -38,30 +38,21 @@ public:
 	/// @}
 	/// @}
 
 
 private:
 private:
-	Texture mpFai; ///< Main pass FAI. Not used if on non blit
+	U32 width, height; ///< Blur passes size
 	Texture vblurFai;
 	Texture vblurFai;
 	Texture hblurFai;
 	Texture hblurFai;
 	U32 blurringIterationsCount;
 	U32 blurringIterationsCount;
-	Fbo mpFbo; ///< Main pass FBO. Not used if on non blit
 	Fbo vblurFbo;
 	Fbo vblurFbo;
 	Fbo hblurFbo;
 	Fbo hblurFbo;
 	Texture noiseTex;
 	Texture noiseTex;
 	ShaderProgramResourcePointer ssaoSProg;
 	ShaderProgramResourcePointer ssaoSProg;
 	ShaderProgramResourcePointer hblurSProg;
 	ShaderProgramResourcePointer hblurSProg;
 	ShaderProgramResourcePointer vblurSProg;
 	ShaderProgramResourcePointer vblurSProg;
-	U32 bWidth, bHeight; ///< Blur passes size
-	U32 mpWidth, mpHeight; ///< Main pass size
 	Timestamp commonUboUpdateTimestamp = getGlobTimestamp();
 	Timestamp commonUboUpdateTimestamp = getGlobTimestamp();
 	Ubo commonUbo;
 	Ubo commonUbo;
 
 
-	static void createFbo(Fbo& fbo, Texture& fai, F32 width, F32 height);
+	static void createFbo(Fbo& fbo, Texture& fai, U width, U height);
 	void initInternal(const RendererInitializer& initializer);
 	void initInternal(const RendererInitializer& initializer);
-
-	/// This means that a bliting rendering will happen
-	Bool blit() const
-	{
-		return mpWidth != bWidth;
-	}
 };
 };
 
 
 } // end namespace anki
 } // end namespace anki

+ 9 - 0
include/anki/util/Functions.h

@@ -6,6 +6,7 @@
 
 
 #include "anki/util/StdTypes.h"
 #include "anki/util/StdTypes.h"
 #include <string>
 #include <string>
+#include <cmath>
 
 
 namespace anki {
 namespace anki {
 
 
@@ -62,6 +63,14 @@ inline Bool isPowerOfTwo(U64 x)
 	return (x == 1);
 	return (x == 1);
 }
 }
 
 
+/// Get the next power of two number. For example if x is 130 this will return
+/// 256
+template<typename Int>
+inline Int nextPowerOfTwo(Int x)
+{
+	return pow(2, ceil(log(x) / log(2)));
+}
+
 /// Replace substring. Substitute occurances of @a from into @a to inside the
 /// Replace substring. Substitute occurances of @a from into @a to inside the
 /// @a str string
 /// @a str string
 extern std::string replaceAllString(const std::string& str, 
 extern std::string replaceAllString(const std::string& str, 

+ 1 - 1
shaders/MsCommonFrag.glsl

@@ -1,4 +1,4 @@
-#define DEFAULT_FLOAT_PRECISION mediump
+#define DEFAULT_FLOAT_PRECISION highp
 #pragma anki include "shaders/CommonFrag.glsl"
 #pragma anki include "shaders/CommonFrag.glsl"
 
 
 #pragma anki include "shaders/Pack.glsl"
 #pragma anki include "shaders/Pack.glsl"

+ 1 - 0
shaders/PpsLfPseudoPass.glsl

@@ -6,6 +6,7 @@
 #pragma anki include "shaders/SimpleVert.glsl"
 #pragma anki include "shaders/SimpleVert.glsl"
 
 
 #pragma anki start fragmentShader
 #pragma anki start fragmentShader
+#pragma anki include "shaders/CommonFrag.glsl"
 
 
 #define MAX_GHOSTS 4
 #define MAX_GHOSTS 4
 #define GHOST_DISPERSAL (0.7)
 #define GHOST_DISPERSAL (0.7)

+ 7 - 3
shaders/PpsLfSpritePass.glsl

@@ -18,7 +18,7 @@ layout(std140) uniform flaresBlock
 layout(location = 0) in vec2 position;
 layout(location = 0) in vec2 position;
 
 
 out vec3 vTexCoords;
 out vec3 vTexCoords;
-out flat float vAlpha;
+flat out float vAlpha;
 
 
 void main()
 void main()
 {
 {
@@ -33,15 +33,19 @@ void main()
 }
 }
 
 
 #pragma anki start fragmentShader
 #pragma anki start fragmentShader
+#define DEFAULT_FLOAT_PRECISION mediump
+#pragma anki include "shaders/CommonFrag.glsl"
+
+#define SINGLE_FLARE 0
 
 
 #if SINGLE_FLARE
 #if SINGLE_FLARE
 uniform sampler2D image;
 uniform sampler2D image;
 #else
 #else
-uniform sampler2DArray images;
+uniform DEFAULT_FLOAT_PRECISION sampler2DArray images;
 #endif
 #endif
 
 
 in vec3 vTexCoords;
 in vec3 vTexCoords;
-in flat float vAlpha;
+flat in float vAlpha;
 
 
 out vec3 fColor;
 out vec3 fColor;
 
 

+ 2 - 1
src/gl/Texture.cpp

@@ -1,6 +1,7 @@
 #include "anki/gl/Texture.h"
 #include "anki/gl/Texture.h"
 #include "anki/gl/GlException.h"
 #include "anki/gl/GlException.h"
 #include "anki/util/Exception.h"
 #include "anki/util/Exception.h"
+#include "anki/core/Logger.h"
 
 
 namespace anki {
 namespace anki {
 
 
@@ -420,7 +421,7 @@ void Texture::create(const Initializer& init)
 //==============================================================================
 //==============================================================================
 void Texture::create2dFai(U w, U h, 
 void Texture::create2dFai(U w, U h, 
 	GLenum internalFormat_, GLenum format_, GLenum type_, U samples_)
 	GLenum internalFormat_, GLenum format_, GLenum type_, U samples_)
-{
+{		
 	Initializer init;
 	Initializer init;
 
 
 	init.width = w;
 	init.width = w;

+ 3 - 1
src/renderer/MainRenderer.cpp

@@ -53,7 +53,7 @@ void MainRenderer::render(SceneGraph& scene)
 		GlStateSingleton::get().disable(GL_BLEND);
 		GlStateSingleton::get().disable(GL_BLEND);
 		blitProg->bind();
 		blitProg->bind();
 
 
-		const Texture* fai;
+		Texture* fai;
 
 
 		if(getPps().getEnabled())
 		if(getPps().getEnabled())
 		{
 		{
@@ -64,6 +64,8 @@ void MainRenderer::render(SceneGraph& scene)
 			fai = &getIs().getFai();
 			fai = &getIs().getFai();
 		}
 		}
 
 
+		fai->setFiltering(Texture::TFT_LINEAR);
+
 		blitProg->findUniformVariable("rasterImage").set(*fai);
 		blitProg->findUniformVariable("rasterImage").set(*fai);
 		drawQuad();
 		drawQuad();
 	}
 	}

+ 1 - 2
src/renderer/Renderer.cpp

@@ -40,8 +40,7 @@ RendererInitializer::RendererInitializer()
 	newOption("pps.hdr.exposure", 4.0);
 	newOption("pps.hdr.exposure", 4.0);
 
 
 	newOption("pps.ssao.enabled", true);
 	newOption("pps.ssao.enabled", true);
-	newOption("pps.ssao.mainPassRenderingQuality", 0.3);
-	newOption("pps.ssao.blurringRenderingQuality", 0.3);
+	newOption("pps.ssao.renderingQuality", 0.3);
 	newOption("pps.ssao.blurringIterationsNum", 2);
 	newOption("pps.ssao.blurringIterationsNum", 2);
 
 
 	newOption("pps.bl.enabled", true);
 	newOption("pps.bl.enabled", true);

+ 16 - 59
src/renderer/Ssao.cpp

@@ -61,7 +61,7 @@ struct ShaderCommonUniforms
 //==============================================================================
 //==============================================================================
 
 
 //==============================================================================
 //==============================================================================
-void Ssao::createFbo(Fbo& fbo, Texture& fai, F32 width, F32 height)
+void Ssao::createFbo(Fbo& fbo, Texture& fai, U width, U height)
 {
 {
 	fai.create2dFai(width, height, GL_RED, GL_RED, GL_UNSIGNED_BYTE);
 	fai.create2dFai(width, height, GL_RED, GL_RED, GL_UNSIGNED_BYTE);
 
 
@@ -92,30 +92,16 @@ void Ssao::initInternal(const RendererInitializer& initializer)
 	//
 	//
 	// Init the widths/heights
 	// Init the widths/heights
 	//
 	//
-	const F32 bQuality = initializer.get("pps.ssao.blurringRenderingQuality");
-	const F32 mpQuality = initializer.get("pps.ssao.mainPassRenderingQuality");
+	const F32 quality = initializer.get("pps.ssao.renderingQuality");
 
 
-	if(mpQuality > bQuality)
-	{
-		throw ANKI_EXCEPTION("SSAO blur quality shouldn't be less than "
-			"main pass SSAO quality");
-	}
-
-	bWidth = bQuality * (F32)r->getWidth();
-	bHeight = bQuality * (F32)r->getHeight();
-	mpWidth =  mpQuality * (F32)r->getWidth();
-	mpHeight =  mpQuality * (F32)r->getHeight();
+	width = quality * (F32)r->getWidth();
+	height = quality * (F32)r->getHeight();
 
 
 	//
 	//
 	// create FBOs
 	// create FBOs
 	//
 	//
-	createFbo(hblurFbo, hblurFai, bWidth, bHeight);
-	createFbo(vblurFbo, vblurFai, bWidth, bHeight);
-
-	if(blit())
-	{
-		createFbo(mpFbo, mpFai, mpWidth, mpHeight);
-	}
+	createFbo(hblurFbo, hblurFai, width, height);
+	createFbo(vblurFbo, vblurFai, width, height);
 
 
 	//
 	//
 	// noise texture
 	// noise texture
@@ -169,8 +155,8 @@ void Ssao::initInternal(const RendererInitializer& initializer)
 
 
 	// main pass prog
 	// main pass prog
 	pps << "#define NOISE_MAP_SIZE " << NOISE_TEX_SIZE
 	pps << "#define NOISE_MAP_SIZE " << NOISE_TEX_SIZE
-		<< "\n#define WIDTH " << mpWidth
-		<< "\n#define HEIGHT " << mpHeight
+		<< "\n#define WIDTH " << width
+		<< "\n#define HEIGHT " << height
 		<< "\n#define USE_MRT " << r->getUseMrt()
 		<< "\n#define USE_MRT " << r->getUseMrt()
 		<< "\n#define KERNEL_SIZE " << KERNEL_SIZE
 		<< "\n#define KERNEL_SIZE " << KERNEL_SIZE
 		<< "\n" << kernelStr.str() 
 		<< "\n" << kernelStr.str() 
@@ -186,7 +172,7 @@ void Ssao::initInternal(const RendererInitializer& initializer)
 	pps.clear();
 	pps.clear();
 	pps << "#define HPASS\n"
 	pps << "#define HPASS\n"
 		"#define COL_R\n"
 		"#define COL_R\n"
-		"#define IMG_DIMENSION " << bHeight << "\n"
+		"#define IMG_DIMENSION " << height << "\n"
 		"#define SAMPLES 7\n";
 		"#define SAMPLES 7\n";
 	hblurSProg.load(ShaderProgramResource::createSrcCodeToCache(
 	hblurSProg.load(ShaderProgramResource::createSrcCodeToCache(
 		SHADER_FILENAME, pps.str().c_str(), "r_").c_str());
 		SHADER_FILENAME, pps.str().c_str(), "r_").c_str());
@@ -194,7 +180,7 @@ void Ssao::initInternal(const RendererInitializer& initializer)
 	pps.clear();
 	pps.clear();
 	pps << "#define VPASS\n"
 	pps << "#define VPASS\n"
 		"#define COL_R\n"
 		"#define COL_R\n"
-		"#define IMG_DIMENSION " << bWidth << "\n"
+		"#define IMG_DIMENSION " << width << "\n"
 		"#define SAMPLES 7\n";
 		"#define SAMPLES 7\n";
 	vblurSProg.load(ShaderProgramResource::createSrcCodeToCache(
 	vblurSProg.load(ShaderProgramResource::createSrcCodeToCache(
 		SHADER_FILENAME, pps.str().c_str(), "r_").c_str());
 		SHADER_FILENAME, pps.str().c_str(), "r_").c_str());
@@ -225,17 +211,8 @@ void Ssao::run()
 
 
 	// 1st pass
 	// 1st pass
 	//
 	//
-	if(blit())
-	{
-		mpFbo.bind();
-		GlStateSingleton::get().setViewport(0, 0, mpWidth, mpHeight);
-	}
-	else
-	{
-		vblurFbo.bind();
-		GlStateSingleton::get().setViewport(0, 0, bWidth, bHeight);
-	}
-	r->clearAfterBindingFbo(GL_COLOR_BUFFER_BIT);
+	vblurFbo.bind(Fbo::FT_ALL, true);
+	GlStateSingleton::get().setViewport(0, 0, width, height);
 	ssaoSProg->bind();
 	ssaoSProg->bind();
 	commonUbo.setBinding(0);
 	commonUbo.setBinding(0);
 
 
@@ -278,40 +255,20 @@ void Ssao::run()
 	// Draw
 	// Draw
 	r->drawQuad();
 	r->drawQuad();
 
 
-	// Blit from main pass FBO to vertical pass FBO
-	if(blit())
-	{
-		vblurFbo.blit(mpFbo,
-			0, 0, mpWidth, mpHeight,
-			0, 0, bWidth, bHeight,
-			GL_COLOR_BUFFER_BIT, GL_LINEAR);
-
-		// Set the correct viewport
-		GlStateSingleton::get().setViewport(0, 0, bWidth, bHeight);
-	}
-
 	// Blurring passes
 	// Blurring passes
 	//
 	//
 	for(U32 i = 0; i < blurringIterationsCount; i++)
 	for(U32 i = 0; i < blurringIterationsCount; i++)
 	{
 	{
 		// hpass
 		// hpass
-		hblurFbo.bind();
-		r->clearAfterBindingFbo(GL_COLOR_BUFFER_BIT);
+		hblurFbo.bind(Fbo::FT_ALL, true);
 		hblurSProg->bind();
 		hblurSProg->bind();
-		if(i == 0)
-		{
-			hblurSProg->findUniformVariable("img").set(vblurFai);
-		}
+		hblurSProg->findUniformVariable("img").set(vblurFai);
 		r->drawQuad();
 		r->drawQuad();
 
 
 		// vpass
 		// vpass
-		vblurFbo.bind();
-		r->clearAfterBindingFbo(GL_COLOR_BUFFER_BIT);
+		vblurFbo.bind(Fbo::FT_ALL, true);
 		vblurSProg->bind();
 		vblurSProg->bind();
-		if(i == 0)
-		{
-			vblurSProg->findUniformVariable("img").set(hblurFai);
-		}
+		vblurSProg->findUniformVariable("img").set(hblurFai);
 		r->drawQuad();
 		r->drawQuad();
 	}
 	}
 }
 }