Bläddra i källkod

Optimizing main renderer a bit

Panagiotis Christopoulos Charitos 13 år sedan
förälder
incheckning
542a74a763

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

@@ -53,6 +53,11 @@ public:
 	{
 		return fai;
 	}
+
+	Bool getDrawFinalToDefaultFbo() const
+	{
+		return drawFinalToDefaultFbo;
+	}
 	/// @}
 
 private:
@@ -66,6 +71,7 @@ private:
 	Fbo fbo;
 	ShaderProgramResourcePointer prog;
 	Texture fai;
+	Bool drawFinalToDefaultFbo;
 
 	void initInternal(const RendererInitializer& initializer);
 };

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

@@ -72,6 +72,8 @@ struct RendererInitializer
 			U blurringIterationsNum = 2;
 			F32 sideBlurFactor = 1.0;
 		} bl;
+
+		Bool drawFinalToDefaultFbo = false;
 	} pps;
 
 	// Dbg

+ 1 - 1
shaders/TfHwSkinningPos.glsl

@@ -1,2 +1,2 @@
-#pragma anki transformFeedbackVarying vPosition
+#pragma anki transformFeedbackVaryings interleaved vPosition
 #pragma anki include "shaders/TfHwSkinningGeneric.glsl"

+ 1 - 3
shaders/TfHwSkinningPosNormTan.glsl

@@ -1,6 +1,4 @@
-#pragma anki transformFeedbackVarying vPosition
-#pragma anki transformFeedbackVarying vNormal
-#pragma anki transformFeedbackVarying vTangent
+#pragma anki transformFeedbackVaryings interleaved vPosition vNormal vTangent
 #define NORMAL_ENABLED
 #define TANGENT_ENABLED
 #pragma anki include "shaders/TfHwSkinningGeneric.glsl"

+ 20 - 9
src/renderer/MainRenderer.cpp

@@ -31,9 +31,17 @@ void MainRenderer::init(const Renderer::Initializer& initializer_)
 	renderingQuality = initializer.mainRendererQuality;
 	initializer.width *= renderingQuality;
 	initializer.height *= renderingQuality;
+	initializer.pps.drawFinalToDefaultFbo = (renderingQuality == 1.0);
+
 	Renderer::init(initializer);
 	dbg.init(initializer);
 	deformer.reset(new Deformer);
+
+	if(!initializer.pps.drawFinalToDefaultFbo)
+	{
+		sProg.load("shaders/Final.glsl");
+	}
+
 	ANKI_LOGI("Main renderer initialized");
 }
 
@@ -89,19 +97,22 @@ void MainRenderer::render(Scene& scene)
 
 	// Render the PPS FAI to the framebuffer
 	//
-	glBindFramebuffer(GL_FRAMEBUFFER, 0); // Bind the window framebuffer
+	if(!pps.getDrawFinalToDefaultFbo())
+	{
+		Fbo::unbindAll(); // Bind the window framebuffer
 
-	GlStateSingleton::get().setViewport(0, 0, windowWidth, windowHeight);
-	GlStateSingleton::get().disable(GL_DEPTH_TEST);
-	GlStateSingleton::get().disable(GL_BLEND);
-	sProg->bind();
+		GlStateSingleton::get().setViewport(0, 0, windowWidth, windowHeight);
+		GlStateSingleton::get().disable(GL_DEPTH_TEST);
+		GlStateSingleton::get().disable(GL_BLEND);
+		sProg->bind();
 #if 0
-	const Texture& finalFai = ms.getFai0();
+		const Texture& finalFai = ms.getFai0();
 #else
-	const Texture& finalFai = pps.getFai();
+		const Texture& finalFai = pps.getFai();
 #endif
-	sProg->findUniformVariable("rasterImage").set(finalFai);
-	drawQuad();
+		sProg->findUniformVariable("rasterImage").set(finalFai);
+		drawQuad();
+	}
 }
 
 //==============================================================================

+ 19 - 8
src/renderer/Pps.cpp

@@ -19,16 +19,20 @@ void Pps::initInternal(const RendererInitializer& initializer)
 {
 	ssao.init(initializer);
 	hdr.init(initializer);
+	drawFinalToDefaultFbo = initializer.pps.drawFinalToDefaultFbo;
 
 	// FBO
-	Renderer::createFai(r->getWidth(), r->getHeight(), GL_RGB, GL_RGB,
-		GL_FLOAT, fai);
-
-	fbo.create();
-	fbo.setColorAttachments({&fai});
-	if(!fbo.isComplete())
+	if(!drawFinalToDefaultFbo)
 	{
-		throw ANKI_EXCEPTION("Fbo not complete");
+		Renderer::createFai(r->getWidth(), r->getHeight(), GL_RGB, GL_RGB,
+			GL_FLOAT, fai);
+
+		fbo.create();
+		fbo.setColorAttachments({&fai});
+		if(!fbo.isComplete())
+		{
+			throw ANKI_EXCEPTION("Fbo not complete");
+		}
 	}
 
 	// SProg
@@ -74,7 +78,14 @@ void Pps::run()
 		hdr.run();
 	}
 
-	fbo.bind();
+	if(drawFinalToDefaultFbo)
+	{
+		Fbo::unbindAll();
+	}
+	else
+	{
+		fbo.bind();
+	}
 
 	GlStateSingleton::get().enable(GL_DEPTH_TEST, false);
 	GlStateSingleton::get().enable(GL_BLEND, false);

+ 1 - 2
src/renderer/Renderer.cpp

@@ -7,8 +7,7 @@ namespace anki {
 
 //==============================================================================
 Renderer::Renderer()
-	: ms(this), is(this), pps(this), bs(this), width(640), height(480),
-		sceneDrawer(this)
+	: ms(this), is(this), pps(this), bs(this), sceneDrawer(this)
 {}
 
 //==============================================================================

+ 5 - 5
src/resource/ShaderProgramPrePreprocessor.cpp

@@ -58,7 +58,7 @@ void ShaderProgramPrePreprocessor::parseFileForPragmas(
 
 	for(const std::string& line : lines)
 	{
-		std::string::size_type npos;
+		std::string::size_type npos = 0;
 		Bool expectPragmaAnki = false;
 		Bool gotPragmaAnki = true;
 
@@ -94,15 +94,15 @@ void ShaderProgramPrePreprocessor::parseFileForPragmas(
 
 			parseFileForPragmas(filen, depth + 1);
 		}
-		else if(line.find(commands[6]) == 0)
+		else if((npos = line.find(commands[6])) == 0)
 		{
-			std::string slist = {line, npos, std::string::npos};
+			std::string slist = {line, strlen(commands[6]), std::string::npos};
 			trffbVaryings = StringList::splitString(slist.c_str(), ' ');
 			xfbBufferMode = XFBBM_SEPARATE;
 		}
-		else if(line.find(commands[7]) == 0)
+		else if((npos = line.find(commands[7])) == 0)
 		{
-			std::string slist = {line, npos, std::string::npos};
+			std::string slist = {line, strlen(commands[7]), std::string::npos};
 			trffbVaryings = StringList::splitString(slist.c_str(), ' ');
 			xfbBufferMode = XFBBM_INTERLEAVED;
 		}