Jelajahi Sumber

Move lens flare to the new system

Panagiotis Christopoulos Charitos 8 tahun lalu
induk
melakukan
3d8baf9025

+ 56 - 0
programs/LensFlareOcclusionTest.ankiprog

@@ -0,0 +1,56 @@
+<!-- 
+Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
+All rights reserved.
+Code licensed under the BSD License.
+http://www.anki3d.org/LICENSE
+-->
+<shaderProgram>
+	<shaders>
+		<shader type="vert">
+			<source><![CDATA[
+#include "shaders/Common.glsl"
+
+layout(ANKI_UBO_BINDING(0, 0), std140, row_major) uniform _block
+{
+	mat4 u_mvp;
+};
+
+layout(location = 0) in vec3 in_position;
+
+out gl_PerVertex
+{
+	vec4 gl_Position;
+	float gl_PointSize;
+};
+
+void main()
+{
+	ANKI_WRITE_POSITION(u_mvp * vec4(in_position, 1.0));
+	gl_PointSize = 16.0;
+}
+			]]></source>
+		</shader>
+		
+		<shader type="frag">
+			<source><![CDATA[
+#include "shaders/Common.glsl"
+
+// WORKAROUND: For some reason validation layer complains
+#ifdef ANKI_VK
+layout(location = 0) out vec4 out_msRt0;
+layout(location = 1) out vec4 out_msRt1;
+layout(location = 2) out vec4 out_msRt2;
+#endif
+
+void main()
+{
+#ifdef ANKI_VK
+	out_msRt0 = vec4(0.0);
+	out_msRt1 = vec4(0.0);
+	out_msRt2 = vec4(0.0);
+#endif
+}
+			]]></source>
+		</shader>
+	</shaders>
+</shaderProgram>

+ 36 - 6
shaders/LfSpritePass.vert.glsl → programs/LensFlareSprite.ankiprog

@@ -1,10 +1,17 @@
-// Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-// LF sprites vert shader
+<!-- 
+Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
+All rights reserved.
+Code licensed under the BSD License.
+http://www.anki3d.org/LICENSE
+-->
+<shaderProgram>
+	<shaders>
+		<shader type="vert">
+			<inputs>
+				<input name="MAX_SPRITES" type="uint" const="1"/>
+			</inputs>
 
+			<source><![CDATA[
 #include "shaders/Common.glsl"
 
 // Per flare information
@@ -43,3 +50,26 @@ void main()
 
 	out_color = sprite.color;
 }
+			]]></source>
+		</shader>
+
+		<shader type="frag">
+			<source><![CDATA[
+#include "shaders/Common.glsl"
+
+layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2DArray u_tex;
+
+layout(location = 0) in vec3 in_uv;
+layout(location = 1) flat in vec4 in_color;
+
+layout(location = 0) out vec4 out_color;
+
+void main()
+{
+	vec4 col = texture(u_tex, in_uv);
+	out_color = col * in_color;
+}
+			]]></source>
+		</shader>
+	</shaders>
+</shaderProgram>

+ 14 - 5
shaders/LfUpdateIndirectInfo.comp.glsl → programs/LensFlareUpdateIndirectInfo.ankiprog

@@ -1,8 +1,13 @@
-// Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
+<!-- 
+Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
+All rights reserved.
+Code licensed under the BSD License.
+http://www.anki3d.org/LICENSE
+-->
+<shaderProgram>
+	<shaders>
+		<shader type="comp">
+			<source><![CDATA[
 #include "shaders/Common.glsl"
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -40,3 +45,7 @@ void main()
 	u_indirectInfo[gl_WorkGroupID.x].first = 0;
 	u_indirectInfo[gl_WorkGroupID.x].baseInstance = 0;
 }
+			]]></source>
+		</shader>
+	</shaders>
+</shaderProgram>

+ 0 - 24
shaders/LfOcclusion.frag.glsl

@@ -1,24 +0,0 @@
-// Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-// LF occlusion frag shader
-
-#include "shaders/Common.glsl"
-
-// WORKAROUND: For some reason validation layer complains
-#ifdef ANKI_VK
-layout(location = 0) out vec4 out_msRt0;
-layout(location = 1) out vec4 out_msRt1;
-layout(location = 2) out vec4 out_msRt2;
-#endif
-
-void main()
-{
-#ifdef ANKI_VK
-	out_msRt0 = vec4(0.0);
-	out_msRt1 = vec4(0.0);
-	out_msRt2 = vec4(0.0);
-#endif
-}

+ 0 - 27
shaders/LfOcclusion.vert.glsl

@@ -1,27 +0,0 @@
-// Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-// LF occlusion vert shader
-
-#include "shaders/Common.glsl"
-
-layout(ANKI_UBO_BINDING(0, 0), std140, row_major) uniform _block
-{
-	mat4 u_mvp;
-};
-
-layout(location = 0) in vec3 in_position;
-
-out gl_PerVertex
-{
-	vec4 gl_Position;
-	float gl_PointSize;
-};
-
-void main()
-{
-	ANKI_WRITE_POSITION(u_mvp * vec4(in_position, 1.0));
-	gl_PointSize = 16.0;
-}

+ 0 - 21
shaders/LfSpritePass.frag.glsl

@@ -1,21 +0,0 @@
-// Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-// LF sprites frag shader
-
-#include "shaders/Common.glsl"
-
-layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2DArray u_tex;
-
-layout(location = 0) in vec3 in_uv;
-layout(location = 1) flat in vec4 in_color;
-
-layout(location = 0) out vec4 out_color;
-
-void main()
-{
-	vec4 col = texture(u_tex, in_uv);
-	out_color = col * in_color;
-}

+ 0 - 22
shaders/RendererCommonUniforms.glsl

@@ -1,22 +0,0 @@
-// Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#ifndef ANKI_SHADERS_RENDERER_COMMON_UNIFORMS_GLSL
-#define ANKI_SHADERS_RENDERER_COMMON_UNIFORMS_GLSL
-
-#include "shaders/Common.glsl"
-
-struct RendererCommonUniforms
-{
-	// Projection params
-	vec4 projectionParams;
-
-	// x: near, y: far, zw: depth linearization coefficients
-	vec4 nearFarLinearizeDepth;
-
-	mat4 projectionMatrix;
-};
-
-#endif

+ 0 - 67
shaders/TilerMinMax.comp.glsl

@@ -1,67 +0,0 @@
-// Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#include "shaders/Common.glsl"
-
-const uint U32_MAX = 0xFFFFFFFFU;
-
-const uint WORKGROUP_SIZE_X = 16;
-const uint WORKGROUP_SIZE_Y = 16;
-
-// Every thread will read more pixels since the workgroup size is less than
-// the tile size.
-const uint PIXEL_READ_X = TILE_SIZE_X / WORKGROUP_SIZE_X;
-const uint PIXEL_READ_Y = TILE_SIZE_Y / WORKGROUP_SIZE_Y;
-
-layout(binding = 0) uniform sampler2D u_depthMap;
-
-layout(std430, binding = 0) writeonly buffer _blk
-{
-	vec2 u_depthLimits[];
-};
-
-layout(local_size_x = WORKGROUP_SIZE_X, local_size_y = WORKGROUP_SIZE_Y, local_size_z = 1) in;
-
-shared uint g_minDepth;
-shared uint g_maxDepth;
-
-void main()
-{
-	// Init
-	g_minDepth = U32_MAX;
-	g_maxDepth = 0U;
-
-	memoryBarrierShared();
-	barrier();
-
-	// Get max/min depth
-	ivec2 coord = ivec2(gl_GlobalInvocationID.xy) * ivec2(PIXEL_READ_X, PIXEL_READ_Y);
-
-	float mind = 10.0;
-	float maxd = -10.0;
-	for(uint y = 0; y < PIXEL_READ_Y; ++y)
-	{
-		for(uint x = 0; x < PIXEL_READ_X; ++x)
-		{
-			float depth = texelFetch(u_depthMap, coord + ivec2(x, y), 0).r;
-			mind = min(mind, depth);
-			maxd = max(maxd, depth);
-		}
-	}
-
-	uvec2 udepth = uvec2(vec2(mind, maxd) * float(U32_MAX));
-	atomicMin(g_minDepth, udepth.x);
-	atomicMax(g_maxDepth, udepth.y);
-
-	memoryBarrierShared();
-	barrier();
-
-	// Write result
-	if(gl_LocalInvocationIndex == 0)
-	{
-		uint idx = gl_WorkGroupID.y * TILES_COUNT_X + gl_WorkGroupID.x;
-		u_depthLimits[idx] = vec2(g_minDepth, g_maxDepth) / float(U32_MAX);
-	}
-}

+ 0 - 15
shaders/UiLines.frag.glsl

@@ -1,15 +0,0 @@
-// Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#include "shaders/Common.glsl"
-
-layout(location = 0) in mediump vec4 in_color;
-
-layout(location = 0) out mediump vec4 out_color;
-
-void main()
-{
-	out_color = in_color;
-}

+ 0 - 22
shaders/UiLines.vert.glsl

@@ -1,22 +0,0 @@
-// Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#include "shaders/Common.glsl"
-
-out gl_PerVertex
-{
-	vec4 gl_Position;
-};
-
-layout(location = 0) in vec2 in_position;
-layout(location = 2) in mediump vec4 in_color;
-
-layout(location = 0) out mediump vec4 out_color;
-
-void main()
-{
-	gl_Position = vec4(in_position, 0.0, 1.0);
-	out_color = in_color;
-}

+ 0 - 129
shaders/VariableSamplingBlurGeneric.frag.glsl

@@ -1,129 +0,0 @@
-// Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-/// Defines:
-/// - VPASS or HPASS
-/// - COL_RGBA or COL_RGB or COL_R
-/// - SAMPLES is a number of 3 or 5 or 7 or 9
-/// - BLURRING_DIST is optional and it's extra pixels to move the blurring
-
-#include "shaders/Common.glsl"
-
-// Preprocessor switches sanity checks
-#if !defined(VPASS) && !defined(HPASS)
-#error See file
-#endif
-
-#if !(defined(COL_RGBA) || defined(COL_RGB) || defined(COL_R))
-#error See file
-#endif
-
-#if !defined(IMG_DIMENSION)
-#error See file
-#endif
-
-#if !defined(SAMPLES)
-#error See file
-#endif
-
-// Input RT with different binding for less GL API calls
-layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D uTex;
-
-layout(location = 0) in vec2 in_texCoord;
-
-#if !defined(BLURRING_DIST)
-#define BLURRING_DIST 0.0
-#endif
-
-// Determine color type
-#if defined(COL_RGBA)
-#define COL_TYPE vec4
-#elif defined(COL_RGB)
-#define COL_TYPE vec3
-#elif defined(COL_R)
-#define COL_TYPE float
-#endif
-
-// Determine tex fetch
-#if defined(COL_RGBA)
-#define TEX_FETCH rgba
-#elif defined(COL_RGB)
-#define TEX_FETCH rgb
-#elif defined(COL_R)
-#define TEX_FETCH r
-#endif
-
-// Calc the kernel. Use offsets of 3 to take advantage of bilinear filtering
-#define BLURRING(val, sign_) ((float(val) * (float(BLURRING_DIST) + 1.0) / float(IMG_DIMENSION)) * float(sign_))
-
-#if defined(HPASS)
-#define BLURRING_OFFSET_X(val, sign_) BLURRING(val, sign_)
-#define BLURRING_OFFSET_Y(val, sign_) 0.0
-#else
-#define BLURRING_OFFSET_X(val, sign_) 0.0
-#define BLURRING_OFFSET_Y(val, sign_) BLURRING(val, sign_)
-#endif
-
-#define BLURRING_OFFSET(v, s) vec2(BLURRING_OFFSET_X(v, s), BLURRING_OFFSET_Y(v, s))
-
-const vec2 KERNEL[SAMPLES - 1] = vec2[](BLURRING_OFFSET(1, -1),
-	BLURRING_OFFSET(1, 1)
-#if SAMPLES > 3
-		,
-	BLURRING_OFFSET(2, -1),
-	BLURRING_OFFSET(2, 1)
-#endif
-#if SAMPLES > 5
-		,
-	BLURRING_OFFSET(3, -1),
-	BLURRING_OFFSET(3, 1)
-#endif
-#if SAMPLES > 7
-		,
-	BLURRING_OFFSET(4, -1),
-	BLURRING_OFFSET(4, 1)
-#endif
-#if SAMPLES > 9
-		,
-	BLURRING_OFFSET(5, -1),
-	BLURRING_OFFSET(5, 1)
-#endif
-#if SAMPLES > 11
-		,
-	BLURRING_OFFSET(6, -1),
-	BLURRING_OFFSET(6, 1)
-#endif
-#if SAMPLES > 13
-		,
-	BLURRING_OFFSET(7, -1),
-	BLURRING_OFFSET(7, 1)
-#endif
-#if SAMPLES > 15
-		,
-	BLURRING_OFFSET(8, -1),
-	BLURRING_OFFSET(8, 1)
-#endif
-#if SAMPLES > 17
-		,
-	BLURRING_OFFSET(9, -1),
-	BLURRING_OFFSET(9, 1)
-#endif
-		);
-
-layout(location = 0) out COL_TYPE out_fragColor;
-
-void main()
-{
-	// Get the first
-	COL_TYPE col = texture(uTex, in_texCoord).TEX_FETCH;
-
-	// Get the rest of the samples
-	for(uint i = 0; i < SAMPLES - 1; i++)
-	{
-		col += texture(uTex, in_texCoord + KERNEL[i]).TEX_FETCH;
-	}
-
-	out_fragColor = col / float(SAMPLES);
-}

+ 18 - 19
src/anki/renderer/LensFlare.cpp

@@ -66,17 +66,14 @@ Error LensFlare::initSprite(const ConfigSet& config)
 
 	m_maxSprites = m_maxSpritesPerFlare * m_maxFlares;
 
-	// Load shaders
-	StringAuto pps(getAllocator());
+	// Load prog
+	ANKI_CHECK(getResourceManager().loadResource("programs/LensFlareSprite.ankiprog", m_realProg));
 
-	pps.sprintf("#define MAX_SPRITES %u\n", m_maxSprites);
-
-	ANKI_CHECK(m_r->createShader("shaders/LfSpritePass.vert.glsl", m_realVert, pps.toCString()));
-
-	ANKI_CHECK(m_r->createShader("shaders/LfSpritePass.frag.glsl", m_realFrag, pps.toCString()));
-
-	// Create prog.
-	m_realProg = getGrManager().newInstance<ShaderProgram>(m_realVert->getGrShader(), m_realFrag->getGrShader());
+	ShaderProgramResourceConstantValueInitList<1> consts(m_realProg);
+	consts.add("MAX_SPRITES", U32(m_maxSprites));
+	const ShaderProgramResourceVariant* variant;
+	m_realProg->getOrCreateVariant(consts.get(), variant);
+	m_realGrProg = variant->getProgram();
 
 	return ErrorCode::NONE;
 }
@@ -95,13 +92,15 @@ Error LensFlare::initOcclusion(const ConfigSet& config)
 		BufferUsageBit::INDIRECT | BufferUsageBit::STORAGE_COMPUTE_WRITE | BufferUsageBit::BUFFER_UPLOAD_DESTINATION,
 		BufferMapAccessBit::NONE);
 
-	ANKI_CHECK(getResourceManager().loadResource("shaders/LfOcclusion.vert.glsl", m_occlusionVert));
-	ANKI_CHECK(getResourceManager().loadResource("shaders/LfOcclusion.frag.glsl", m_occlusionFrag));
-	ANKI_CHECK(getResourceManager().loadResource("shaders/LfUpdateIndirectInfo.comp.glsl", m_writeIndirectBuffComp));
-
-	m_updateIndirectBuffProg = gr.newInstance<ShaderProgram>(m_writeIndirectBuffComp->getGrShader());
+	ANKI_CHECK(getResourceManager().loadResource("programs/LensFlareOcclusionTest.ankiprog", m_occlusionProg));
+	const ShaderProgramResourceVariant* variant;
+	m_occlusionProg->getOrCreateVariant(variant);
+	m_occlusionGrProg = variant->getProgram();
 
-	m_occlusionProg = gr.newInstance<ShaderProgram>(m_occlusionVert->getGrShader(), m_occlusionFrag->getGrShader());
+	ANKI_CHECK(
+		getResourceManager().loadResource("programs/LensFlareUpdateIndirectInfo.ankiprog", m_updateIndirectBuffProg));
+	m_updateIndirectBuffProg->getOrCreateVariant(variant);
+	m_updateIndirectBuffGrProg = variant->getProgram();
 
 	return ErrorCode::NONE;
 }
@@ -145,7 +144,7 @@ void LensFlare::runOcclusionTests(RenderingContext& ctx, CommandBufferPtr cmdb)
 		cmdb->bindVertexBuffer(0, vertToken.m_buffer, vertToken.m_offset, sizeof(Vec3));
 
 		// Setup state
-		cmdb->bindShaderProgram(m_occlusionProg);
+		cmdb->bindShaderProgram(m_occlusionGrProg);
 		cmdb->setVertexAttribute(0, 0, PixelFormat(ComponentFormat::R32G32B32, TransformFormat::FLOAT), 0);
 		cmdb->setColorChannelWriteMask(0, ColorBit::NONE);
 		cmdb->setColorChannelWriteMask(1, ColorBit::NONE);
@@ -201,7 +200,7 @@ void LensFlare::updateIndirectInfo(RenderingContext& ctx, CommandBufferPtr cmdb)
 		sizeof(DrawArraysIndirectInfo) * count);
 
 	// Update the indirect info
-	cmdb->bindShaderProgram(m_updateIndirectBuffProg);
+	cmdb->bindShaderProgram(m_updateIndirectBuffGrProg);
 	cmdb->bindStorageBuffer(0, 0, m_queryResultBuff, 0, MAX_PTR_SIZE);
 	cmdb->bindStorageBuffer(0, 1, m_indirectBuff, 0, MAX_PTR_SIZE);
 	cmdb->dispatchCompute(count, 1, 1);
@@ -222,7 +221,7 @@ void LensFlare::run(RenderingContext& ctx, CommandBufferPtr cmdb)
 		return;
 	}
 
-	cmdb->bindShaderProgram(m_realProg);
+	cmdb->bindShaderProgram(m_realGrProg);
 	cmdb->setDepthWrite(false);
 	cmdb->setDepthCompareOperation(CompareOperation::ALWAYS);
 	cmdb->setBlendFactors(

+ 6 - 8
src/anki/renderer/LensFlare.h

@@ -42,17 +42,15 @@ private:
 	DynamicArray<OcclusionQueryPtr> m_queries;
 	BufferPtr m_queryResultBuff;
 	BufferPtr m_indirectBuff;
-	ShaderResourcePtr m_writeIndirectBuffComp;
-	ShaderProgramPtr m_updateIndirectBuffProg;
+	ShaderProgramResourcePtr m_updateIndirectBuffProg;
+	ShaderProgramPtr m_updateIndirectBuffGrProg;
 
-	ShaderResourcePtr m_occlusionVert;
-	ShaderResourcePtr m_occlusionFrag;
-	ShaderProgramPtr m_occlusionProg;
+	ShaderProgramResourcePtr m_occlusionProg;
+	ShaderProgramPtr m_occlusionGrProg;
 
 	// Sprite billboards
-	ShaderResourcePtr m_realVert;
-	ShaderResourcePtr m_realFrag;
-	ShaderProgramPtr m_realProg;
+	ShaderProgramResourcePtr m_realProg;
+	ShaderProgramPtr m_realGrProg;
 	U8 m_maxSpritesPerFlare;
 	U8 m_maxFlares;
 	U16 m_maxSprites;