瀏覽代碼

Decoupling lens flare passes

Panagiotis Christopoulos Charitos 10 年之前
父節點
當前提交
73ccec3c83
共有 3 個文件被更改,包括 147 次插入18 次删除
  1. 50 0
      include/anki/renderer/Sslf.h
  2. 18 18
      src/renderer/Lf.cpp
  3. 79 0
      src/renderer/Sslf.cpp

+ 50 - 0
include/anki/renderer/Sslf.h

@@ -0,0 +1,50 @@
+// Copyright (C) 2009-2015, Panagiotis Christopoulos Charitos.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#ifndef ANKI_RENDERER_SSLF_H
+#define ANKI_RENDERER_SSLF_H
+
+#include "anki/renderer/RenderingPass.h"
+
+namespace anki {
+
+/// @addtogroup renderer
+/// @{
+
+/// Screen space lens flare pass.
+class Sslf: public RenderingPass
+{
+public:
+	Sslf(Renderer* r)
+	:	RenderingPass(r)
+	{}
+
+	~Sslf();
+
+	ANKI_USE_RESULT Error init(const ConfigSet& config);
+	void run(CommandBufferHandle& cmdb);
+
+	TextureHandle& getRt()
+	{
+		return m_rt;
+	}
+
+private:
+	TextureHandle m_rt;
+	FramebufferHandle m_fb;
+	ShaderResourcePointer m_frag;
+	PipelineHandle m_ppline;
+	TextureResourcePointer m_lensDirtTex;
+	U8 m_maxSpritesPerFlare;
+	U8 m_maxFlares;
+
+	ANKI_USE_RESULT Error initInternal(const ConfigSet& config);
+};
+/// @}
+
+} // end namespace anki
+
+#endif
+

+ 18 - 18
src/renderer/Lf.cpp

@@ -263,7 +263,7 @@ Error Lf::runOcclusionTests(CommandBufferHandle& cmdb)
 }
 }
 
 
 //==============================================================================
 //==============================================================================
-Error Lf::run(CommandBufferHandle& cmdBuff)
+Error Lf::run(CommandBufferHandle& cmdb)
 {
 {
 	ANKI_ASSERT(m_enabled);
 	ANKI_ASSERT(m_enabled);
 	Error err = ErrorCode::NONE;
 	Error err = ErrorCode::NONE;
@@ -273,18 +273,18 @@ Error Lf::run(CommandBufferHandle& cmdBuff)
 	//
 	//
 
 
 	// Set the common state
 	// Set the common state
-	m_fb.bind(cmdBuff);
-	cmdBuff.setViewport(0, 0, m_r->getPps().getBloom().getWidth(), 
+	m_fb.bind(cmdb);
+	cmdb.setViewport(0, 0, m_r->getPps().getBloom().getWidth(), 
 		m_r->getPps().getBloom().getHeight());
 		m_r->getPps().getBloom().getHeight());
 
 
-	m_pseudoPpline.bind(cmdBuff);
+	m_pseudoPpline.bind(cmdb);
 
 
 	Array<TextureHandle, 2> tarr = {{
 	Array<TextureHandle, 2> tarr = {{
 		m_r->getPps().getBloom().getRt(), 
 		m_r->getPps().getBloom().getRt(), 
 		m_lensDirtTex->getGlTexture()}};
 		m_lensDirtTex->getGlTexture()}};
-	cmdBuff.bindTextures(0, tarr.begin(), tarr.getSize());
+	cmdb.bindTextures(0, tarr.begin(), tarr.getSize());
 
 
-	m_r->drawQuad(cmdBuff);
+	m_r->drawQuad(cmdb);
 
 
 	//
 	//
 	// Rest of the passes
 	// Rest of the passes
@@ -305,9 +305,9 @@ Error Lf::run(CommandBufferHandle& cmdBuff)
 		const U bufferSize = m_flareSize * totalCount;
 		const U bufferSize = m_flareSize * totalCount;
 
 
 		// Set common rendering state
 		// Set common rendering state
-		m_realPpline.bind(cmdBuff);
-		cmdBuff.enableBlend(true);
-		cmdBuff.setBlendFunctions(GL_ONE, GL_ONE);
+		m_realPpline.bind(cmdb);
+		cmdb.enableBlend(true);
+		cmdb.setBlendFunctions(GL_ONE, GL_ONE);
 
 
 		// Send the command to write the buffer now
 		// Send the command to write the buffer now
 		BufferHandle& flareDataBuff = m_flareDataBuff[
 		BufferHandle& flareDataBuff = m_flareDataBuff[
@@ -352,9 +352,9 @@ Error Lf::run(CommandBufferHandle& cmdBuff)
 			++count;
 			++count;
 
 
 			// Render
 			// Render
-			lf.getTexture().bind(cmdBuff, 0);
+			lf.getTexture().bind(cmdb, 0);
 			flareDataBuff.bindShaderBuffer(
 			flareDataBuff.bindShaderBuffer(
-				cmdBuff, 
+				cmdb, 
 				reinterpret_cast<U8*>(sprites) - spritesInitialPtr, 
 				reinterpret_cast<U8*>(sprites) - spritesInitialPtr, 
 				sizeof(Sprite) * count,
 				sizeof(Sprite) * count,
 				0);
 				0);
@@ -365,7 +365,7 @@ Error Lf::run(CommandBufferHandle& cmdBuff)
 			
 			
 			if(!queryInvalid)
 			if(!queryInvalid)
 			{
 			{
-				m_r->drawQuadConditional(query, cmdBuff);
+				m_r->drawQuadConditional(query, cmdb);
 			}
 			}
 			else
 			else
 			{
 			{
@@ -390,17 +390,17 @@ Error Lf::run(CommandBufferHandle& cmdBuff)
 	{
 	{
 		// No flares
 		// No flares
 
 
-		cmdBuff.enableBlend(true);
-		cmdBuff.setBlendFunctions(GL_ONE, GL_ONE);
+		cmdb.enableBlend(true);
+		cmdb.setBlendFunctions(GL_ONE, GL_ONE);
 	}
 	}
 
 
 	// Blit the HDR RT back to LF RT
 	// Blit the HDR RT back to LF RT
 	//
 	//
-	m_r->getPps().getBloom().getRt().bind(cmdBuff, 0);
-	m_blitPpline.bind(cmdBuff);
-	m_r->drawQuad(cmdBuff);
+	m_r->getPps().getBloom().getRt().bind(cmdb, 0);
+	m_blitPpline.bind(cmdb);
+	m_r->drawQuad(cmdb);
 
 
-	cmdBuff.enableBlend(false);
+	cmdb.enableBlend(false);
 
 
 	return err;
 	return err;
 }
 }

+ 79 - 0
src/renderer/Sslf.cpp

@@ -0,0 +1,79 @@
+// Copyright (C) 2009-2015, Panagiotis Christopoulos Charitos.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#include "anki/renderer/Sslf.h"
+#include "anki/renderer/Renderer.h"
+#include "anki/renderer/Pps.h"
+#include "anki/renderer/Bloom.h"
+
+namespace anki {
+
+//==============================================================================
+Error Sslf::init(const ConfigSet& config)
+{
+	Error err = initInternal(config);
+	if(err)
+	{
+		ANKI_LOGE("Failed to init screen space lens flare pass");
+	}
+
+	return err;
+}
+
+//==============================================================================
+Error Sslf::initInternal(const ConfigSet& config)
+{
+	// Load program 1
+	StringAuto pps(getAllocator());
+
+	pps.sprintf(
+		"#define TEX_DIMENSIONS vec2(%u.0, %u.0)\n", 
+		m_r->getPps().getBloom().getWidth(),
+		m_r->getPps().getBloom().getHeight());
+
+	ANKI_CHECK(m_frag.loadToCache(&getResourceManager(), 
+		"shaders/PpsLfPseudoPass.frag.glsl", pps.toCString(), "r_"));
+
+	ANKI_CHECK(m_r->createDrawQuadPipeline(m_frag->getGrShader(), m_ppline));
+
+	// Textures
+	ANKI_CHECK(m_lensDirtTex.load(
+		"engine_data/lens_dirt.ankitex", &getResourceManager()));
+
+	// Create the render target and FB
+	ANKI_CHECK(m_r->createRenderTarget(m_r->getPps().getBloom().getWidth(), 
+		m_r->getPps().getBloom().getHeight(), 
+		PixelFormat(ComponentFormat::R8G8B8, TransformFormat::UNORM), 
+		1, SamplingFilter::LINEAR, 1, m_rt));
+
+	FramebufferHandle::Initializer fbInit;
+	fbInit.m_colorAttachmentsCount = 1;
+	fbInit.m_colorAttachments[0].m_texture = m_rt;
+	fbInit.m_colorAttachments[0].m_loadOperation = 
+		AttachmentLoadOperation::DONT_CARE;
+	ANKI_CHECK(m_fb.create(&getGrManager(), fbInit));
+
+	return ErrorCode::NONE;
+}
+
+//==============================================================================
+void Sslf::run(CommandBufferHandle& cmdb)
+{
+	m_fb.bind(cmdb);
+	cmdb.setViewport(0, 0, m_r->getPps().getBloom().getWidth(), 
+		m_r->getPps().getBloom().getHeight());
+
+	m_ppline.bind(cmdb);
+
+	Array<TextureHandle, 2> tarr = {{
+		m_r->getPps().getBloom().getRt(), 
+		m_lensDirtTex->getGlTexture()}};
+	cmdb.bindTextures(0, tarr.begin(), tarr.getSize());
+
+	m_r->drawQuad(cmdb);
+}
+
+} // end namespace anki
+