소스 검색

Renderer potential opts

Panagiotis Christopoulos Charitos 13 년 전
부모
커밋
34b94f87fb
7개의 변경된 파일50개의 추가작업 그리고 46개의 파일을 삭제
  1. 3 3
      docs/todo
  2. 7 2
      include/anki/gl/Texture.h
  3. 8 8
      include/anki/renderer/Hdr.h
  4. 3 5
      include/anki/renderer/Ssao.h
  5. 6 1
      src/gl/Texture.cpp
  6. 14 13
      src/renderer/Hdr.cpp
  7. 9 14
      src/renderer/Ssao.cpp

+ 3 - 3
docs/todo

@@ -3,9 +3,6 @@
 Pending
 =======
 
-- For the main renderer dont use final stage. Just make PPS to write to the FB
-  Maybe though do that only when the rendering quality is 1.0 else you will have
-  more blending ops to do
 - Interleaved geometry
 - See if you can have 2 FAIs instead of 3 on SSAO and HDR
 
@@ -13,6 +10,9 @@ Pending
 Done
 ====
 
+- For the main renderer dont use final stage. Just make PPS to write to the FB
+  Maybe though do that only when the rendering quality is 1.0 else you will have
+  more blending ops to do
 - Put uniform buffers everywhere
 - Move to GLES3
 	- Remove all boost

+ 7 - 2
include/anki/gl/Texture.h

@@ -246,11 +246,15 @@ public:
 	U bind() const;
 
 	/// Change the filtering type
-	void setFiltering(TextureFilteringType filterType)
+	void setFiltering(const TextureFilteringType filterType)
 	{
 		TextureUnitsSingleton::get().bindTextureAndActivateUnit(*this);
 		setFilteringNoBind(filterType);
 	}
+	TextureFilteringType getFiltering() const
+	{
+		return filtering;
+	}
 
 	/// Set texture parameter
 	void setParameter(GLenum param, GLint value)
@@ -272,13 +276,14 @@ private:
 	GLenum format = GL_NONE; ///< GL_RED, GL_RG, GL_RGB etc
 	GLenum type = GL_NONE; ///< GL_UNSIGNED_BYTE, GL_BYTE etc
 	GLuint width = 0, height = 0, depth = 0;
+	TextureFilteringType filtering;
 
 	Bool isCreated() const
 	{
 		return glId != 0;
 	}
 
-	void setFilteringNoBind(TextureFilteringType filterType) const;
+	void setFilteringNoBind(TextureFilteringType filterType);
 };
 /// @}
 

+ 8 - 8
include/anki/renderer/Hdr.h

@@ -38,18 +38,18 @@ public:
 		parameterUpdateTimestamp = Timestamp::getTimestamp();
 	}
 
-	uint getBlurringIterationsCount() const
+	U32 getBlurringIterationsCount() const
 	{
 		return blurringIterationsCount;
 	}
-	void setBlurringIterationsCount(const uint x)
+	void setBlurringIterationsCount(const U32 x)
 	{
 		blurringIterationsCount = x;
 	}
 
 	const Texture& getFai() const
 	{
-		return fai;
+		return vblurFai;
 	}
 	/// @}
 
@@ -57,19 +57,19 @@ private:
 	U32 width;
 	U32 height;
 	F32 exposure = 4.0; ///< How bright is the HDR
-	U32 blurringIterationsCount = 2; ///< The blurring iterations of the tone map
+	U32 blurringIterationsCount = 2; ///< The blurring iterations
 	F32 blurringDist = 1.0; ///< Distance in blurring
 	F32 renderingQuality = 0.5;
-	Fbo toneFbo;
 	Fbo hblurFbo;
 	Fbo vblurFbo;
 	ShaderProgramResourcePointer toneSProg;
 	ShaderProgramResourcePointer hblurSProg;
 	ShaderProgramResourcePointer vblurSProg;
-	Texture toneFai; ///< Vertical blur pass FAI
 	Texture hblurFai; ///< pass0Fai with the horizontal blur FAI
-	Texture fai; ///< The final FAI
+	Texture vblurFai; ///< The final FAI
+	/// When a parameter changed by the setters
 	U32 parameterUpdateTimestamp = Timestamp::getTimestamp();
+	/// When the commonUbo got updated
 	U32 commonUboUpdateTimestamp = Timestamp::getTimestamp();
 	Ubo commonUbo;
 
@@ -77,6 +77,6 @@ private:
 	void initInternal(const RendererInitializer& initializer);
 };
 
-} // end namespace
+} // end namespace anki
 
 #endif

+ 3 - 5
include/anki/renderer/Ssao.h

@@ -38,19 +38,17 @@ public:
 
 	const Texture& getFai() const
 	{
-		return fai;
+		return vblurFai;
 	}
 	/// @}
 
 private:
-	Texture ssaoFai; ///< It contains the unblurred SSAO factor
+	Texture vblurFai;
 	Texture hblurFai;
-	Texture fai;  ///< AKA vblurFai The final FAI
 	F32 renderingQuality;
 	U32 blurringIterationsCount;
-	Fbo ssaoFbo;
-	Fbo hblurFbo;
 	Fbo vblurFbo;
+	Fbo hblurFbo;
 	TextureResourcePointer noiseMap;
 	ShaderProgramResourcePointer ssaoSProg;
 	ShaderProgramResourcePointer hblurSProg;

+ 6 - 1
src/gl/Texture.cpp

@@ -340,7 +340,7 @@ void Texture::genMipmap()
 }
 
 //==============================================================================
-void Texture::setFilteringNoBind(TextureFilteringType filterType) const
+void Texture::setFilteringNoBind(TextureFilteringType filterType)
 {
 	switch(filterType)
 	{
@@ -355,7 +355,12 @@ void Texture::setFilteringNoBind(TextureFilteringType filterType) const
 	case TFT_TRILINEAR:
 		glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
 		glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+	default:
+		ANKI_ASSERT(0);
+		break;
 	}
+
+	filtering = filterType;
 }
 
 //==============================================================================

+ 14 - 13
src/renderer/Hdr.cpp

@@ -1,4 +1,3 @@
-#include <boost/lexical_cast.hpp>
 #include "anki/renderer/Hdr.h"
 #include "anki/renderer/Renderer.h"
 
@@ -40,11 +39,8 @@ void Hdr::initInternal(const Renderer::Initializer& initializer)
 	blurringDist = initializer.pps.hdr.blurringDist;
 	blurringIterationsCount = initializer.pps.hdr.blurringIterationsCount;
 
-	initFbo(toneFbo, toneFai);
 	initFbo(hblurFbo, hblurFai);
-	initFbo(vblurFbo, fai);
-
-	fai.setFiltering(Texture::TFT_LINEAR);
+	initFbo(vblurFbo, vblurFai);
 
 	// init shaders
 	Vec4 block(exposure, 0.0, 0.0, 0.0);
@@ -104,8 +100,11 @@ void Hdr::run()
 	GlStateSingleton::get().disable(GL_BLEND);
 	GlStateSingleton::get().disable(GL_DEPTH_TEST);
 
+	// For the passes it should be NEAREST
+	vblurFai.setFiltering(Texture::TFT_NEAREST);
+
 	// pass 0
-	toneFbo.bind();
+	vblurFbo.bind();
 	toneSProg->bind();
 
 	if(parameterUpdateTimestamp > commonUboUpdateTimestamp)
@@ -126,20 +125,22 @@ void Hdr::run()
 		hblurSProg->bind();
 		if(i == 0)
 		{
-			hblurSProg->findUniformVariable("img").set(toneFai);
-		}
-		else if(i == 1)
-		{
-			hblurSProg->findUniformVariable("img").set(fai);
+			hblurSProg->findUniformVariable("img").set(vblurFai);
 		}
 		r->drawQuad();
 
 		// vpass
 		vblurFbo.bind();
 		vblurSProg->bind();
-		vblurSProg->findUniformVariable("img").set(hblurFai);
+		if(i == 0)
+		{
+			vblurSProg->findUniformVariable("img").set(hblurFai);
+		}
 		r->drawQuad();
 	}
+
+	// For the next stage it should be LINEAR though
+	vblurFai.setFiltering(Texture::TFT_LINEAR);
 }
 
-} // end namespace
+} // end namespace anki

+ 9 - 14
src/renderer/Ssao.cpp

@@ -47,9 +47,8 @@ void Ssao::initInternal(const RendererInitializer& initializer)
 	//
 	// create FBOs
 	//
-	createFbo(ssaoFbo, ssaoFai);
 	createFbo(hblurFbo, hblurFai);
-	createFbo(vblurFbo, fai);
+	createFbo(vblurFbo, vblurFai);
 
 	//
 	// noise map
@@ -121,7 +120,7 @@ void Ssao::run()
 	// 1st pass
 	//
 	
-	ssaoFbo.bind();
+	vblurFbo.bind();
 	ssaoSProg->bind();
 	commonUbo.setBinding(0);
 
@@ -146,15 +145,11 @@ void Ssao::run()
 	// noiseMap
 	ssaoSProg->findUniformVariable("noiseMap").set(*noiseMap);
 
-	// msNormalFai
-	ssaoSProg->findUniformVariable("msGFai").set(
-		r->getMs().getFai0());
+	// msGFai
+	ssaoSProg->findUniformVariable("msGFai").set(r->getMs().getFai0());
 
 	r->drawQuad();
 
-	vblurSProg->bind();
-	vblurSProg->findUniformVariable("img").set(hblurFai);
-
 	// Blurring passes
 	//
 	for(U32 i = 0; i < blurringIterationsCount; i++)
@@ -164,17 +159,17 @@ void Ssao::run()
 		hblurSProg->bind();
 		if(i == 0)
 		{
-			hblurSProg->findUniformVariable("img").set(ssaoFai);
-		}
-		else if(i == 1)
-		{
-			hblurSProg->findUniformVariable("img").set(fai);
+			hblurSProg->findUniformVariable("img").set(vblurFai);
 		}
 		r->drawQuad();
 
 		// vpass
 		vblurFbo.bind();
 		vblurSProg->bind();
+		if(i == 0)
+		{
+			vblurSProg->findUniformVariable("img").set(hblurFai);
+		}
 		r->drawQuad();
 	}
 }