Просмотр исходного кода

Move screenspace lens flare to the new system

Panagiotis Christopoulos Charitos 8 лет назад
Родитель
Сommit
f322034f06

+ 31 - 9
shaders/Sslf.frag.glsl → programs/ScreenSpaceLensFlare.ankiprog

@@ -1,11 +1,29 @@
-// Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-// Screen space lens flare. Used the technique from here
-// http://john-chapman-graphics.blogspot.no/2013/02/pseudo-lens-flare.html
-
+<!-- 
+Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
+All rights reserved.
+Code licensed under the BSD License.
+http://www.anki3d.org/LICENSE
+-->
+
+<!--
+Screen space lens flare. Used the technique from here
+http://john-chapman-graphics.blogspot.no/2013/02/pseudo-lens-flare.html
+-->
+
+<shaderProgram>
+	<shaders>
+		<shader type="vert">
+			<source><![CDATA[
+#include "shaders/Quad.vert.glsl"
+			]]></source>
+		</shader>
+
+		<shader type="frag">
+			<inputs>
+				<input name="INPUT_TEX_SIZE" type="uvec2" const="1"/>
+			</inputs>
+
+			<source><![CDATA[
 #include "shaders/Common.glsl"
 
 #define MAX_GHOSTS 4
@@ -43,7 +61,7 @@ void main()
 
 	vec2 ghostVec = (vec2(0.5) - texcoord) * GHOST_DISPERSAL;
 
-	const vec2 texelSize = 1.0 / vec2(TEX_DIMENSIONS);
+	const vec2 texelSize = 1.0 / vec2(INPUT_TEX_SIZE);
 
 	const vec3 distortion = vec3(-texelSize.x * CHROMATIC_DISTORTION, 0.0, texelSize.x * CHROMATIC_DISTORTION);
 
@@ -78,3 +96,7 @@ void main()
 	// Write
 	out_color = result;
 }
+			]]></source>
+		</shader>
+	</shaders>
+</shaderProgram>

+ 2 - 2
src/anki/renderer/Bloom.h

@@ -6,7 +6,7 @@
 #pragma once
 
 #include <anki/renderer/RenderingPass.h>
-#include <anki/renderer/ScreenspaceLensFlare.h>
+#include <anki/renderer/ScreenSpaceLensFlare.h>
 #include <anki/Gr.h>
 #include <anki/resource/TextureResource.h>
 #include <anki/resource/ShaderResource.h>
@@ -86,7 +86,7 @@ class Bloom : public RenderingPass
 anki_internal:
 	BloomExposure m_extractExposure;
 	BloomUpscale m_upscale;
-	ScreenspaceLensFlare m_sslf;
+	ScreenSpaceLensFlare m_sslf;
 
 	Bloom(Renderer* r)
 		: RenderingPass(r)

+ 1 - 1
src/anki/renderer/Common.h

@@ -25,7 +25,7 @@ class LightShading;
 class ForwardShading;
 class LensFlare;
 class Ssao;
-class ScreenspaceLensFlare;
+class ScreenSpaceLensFlare;
 class Tonemapping;
 class Bloom;
 class FinalComposite;

+ 1 - 1
src/anki/renderer/FinalComposite.cpp

@@ -7,7 +7,7 @@
 #include <anki/renderer/Renderer.h>
 #include <anki/renderer/Bloom.h>
 #include <anki/renderer/TemporalAA.h>
-#include <anki/renderer/ScreenspaceLensFlare.h>
+#include <anki/renderer/ScreenSpaceLensFlare.h>
 #include <anki/renderer/Tonemapping.h>
 #include <anki/renderer/LightShading.h>
 #include <anki/renderer/GBuffer.h>

+ 14 - 12
src/anki/renderer/ScreenspaceLensFlare.cpp → src/anki/renderer/ScreenSpaceLensFlare.cpp

@@ -3,7 +3,7 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#include <anki/renderer/ScreenspaceLensFlare.h>
+#include <anki/renderer/ScreenSpaceLensFlare.h>
 #include <anki/renderer/Renderer.h>
 #include <anki/renderer/Bloom.h>
 #include <anki/misc/ConfigSet.h>
@@ -11,7 +11,7 @@
 namespace anki
 {
 
-Error ScreenspaceLensFlare::init(const ConfigSet& config)
+Error ScreenSpaceLensFlare::init(const ConfigSet& config)
 {
 	ANKI_R_LOGI("Initializing screen space lens flare");
 
@@ -24,27 +24,29 @@ Error ScreenspaceLensFlare::init(const ConfigSet& config)
 	return err;
 }
 
-Error ScreenspaceLensFlare::initInternal(const ConfigSet& config)
+Error ScreenSpaceLensFlare::initInternal(const ConfigSet& config)
 {
-	ANKI_CHECK(m_r->createShaderf("shaders/Sslf.frag.glsl",
-		m_frag,
-		"#define TEX_DIMENSIONS vec2(%u.0, %u.0)\n",
-		m_r->getBloom().m_extractExposure.m_width,
-		m_r->getBloom().m_extractExposure.m_height));
+	ANKI_CHECK(getResourceManager().loadResource("engine_data/LensDirt.ankitex", m_lensDirtTex));
 
-	m_r->createDrawQuadShaderProgram(m_frag->getGrShader(), m_prog);
+	ANKI_CHECK(getResourceManager().loadResource("programs/ScreenSpaceLensFlare.ankiprog", m_prog));
 
-	ANKI_CHECK(getResourceManager().loadResource("engine_data/LensDirt.ankitex", m_lensDirtTex));
+	ShaderProgramResourceConstantValueInitList<1> consts(m_prog);
+	consts.add(
+		"INPUT_TEX_SIZE", UVec2(m_r->getBloom().m_extractExposure.m_width, m_r->getBloom().m_extractExposure.m_height));
+
+	const ShaderProgramResourceVariant* variant;
+	m_prog->getOrCreateVariant(consts.get(), variant);
+	m_grProg = variant->getProgram();
 
 	return ErrorCode::NONE;
 }
 
-void ScreenspaceLensFlare::run(RenderingContext& ctx)
+void ScreenSpaceLensFlare::run(RenderingContext& ctx)
 {
 	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
 
 	// Draw to the SSLF FB
-	cmdb->bindShaderProgram(m_prog);
+	cmdb->bindShaderProgram(m_grProg);
 	cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::ONE);
 	cmdb->bindTexture(0, 0, m_r->getBloom().m_extractExposure.m_rt);
 	cmdb->bindTexture(0, 1, m_lensDirtTex->getGrTexture());

+ 4 - 4
src/anki/renderer/ScreenspaceLensFlare.h → src/anki/renderer/ScreenSpaceLensFlare.h

@@ -14,10 +14,10 @@ namespace anki
 /// @{
 
 /// Screen space lens flare pass.
-class ScreenspaceLensFlare : public RenderingPass
+class ScreenSpaceLensFlare : public RenderingPass
 {
 anki_internal:
-	ScreenspaceLensFlare(Renderer* r)
+	ScreenSpaceLensFlare(Renderer* r)
 		: RenderingPass(r)
 	{
 	}
@@ -26,8 +26,8 @@ anki_internal:
 	void run(RenderingContext& ctx);
 
 private:
-	ShaderResourcePtr m_frag;
-	ShaderProgramPtr m_prog;
+	ShaderProgramResourcePtr m_prog;
+	ShaderProgramPtr m_grProg;
 	TextureResourcePtr m_lensDirtTex;
 
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& config);