Panagiotis Christopoulos Charitos 4 years ago
parent
commit
4c229cee40

+ 1 - 1
AnKi/Renderer/ConfigDefs.h

@@ -53,5 +53,5 @@ ANKI_CONFIG_OPTION(r_bloomScale, 2.5, 0.0, 256.0)
 ANKI_CONFIG_OPTION(r_smResolveFactor, 0.5, 0.25, 1.0)
 
 ANKI_CONFIG_OPTION(r_rtShadowsSvgf, 0, 0, 1)
-ANKI_CONFIG_OPTION(r_rtShadowsSvgfAtrousPassCount, 1, 1, 20)
+ANKI_CONFIG_OPTION(r_rtShadowsSvgfAtrousPassCount, 3, 1, 20)
 ANKI_CONFIG_OPTION(r_rtShadowsRaysPerPixel, 1, 1, 8)

+ 1 - 0
AnKi/Renderer/GBufferPost.cpp

@@ -36,6 +36,7 @@ Error GBufferPost::initInternal(const ConfigSet& cfg)
 	ShaderProgramResourceVariantInitInfo variantInitInfo(m_prog);
 	variantInitInfo.addConstant("TILE_COUNTS", m_r->getTileCounts());
 	variantInitInfo.addConstant("Z_SPLIT_COUNT", m_r->getZSplitCount());
+	variantInitInfo.addConstant("TILE_SIZE", m_r->getTileSize());
 
 	const ShaderProgramResourceVariant* variant;
 	m_prog->getOrCreateVariant(variantInitInfo, variant);

+ 1 - 0
AnKi/Renderer/ShadowmapsResolve.cpp

@@ -43,6 +43,7 @@ Error ShadowmapsResolve::initInternal(const ConfigSet& cfg)
 	variantInitInfo.addConstant("FB_SIZE", UVec2(width, height));
 	variantInitInfo.addConstant("TILE_COUNTS", m_r->getTileCounts());
 	variantInitInfo.addConstant("Z_SPLIT_COUNT", m_r->getZSplitCount());
+	variantInitInfo.addConstant("TILE_SIZE", m_r->getTileSize());
 	const ShaderProgramResourceVariant* variant;
 	m_prog->getOrCreateVariant(variantInitInfo, variant);
 	m_grProg = variant->getProgram();

+ 11 - 21
AnKi/Shaders/ClusteredShadingCommon2.glsl

@@ -150,13 +150,6 @@ U32 computeZSplitClusterIndex(F32 depth, U32 zSplitCount, F32 a, F32 b)
 	return min(zSplitCount - 1u, U32(fSplitIdx));
 }
 
-/// Return the tile index.
-U32 computeTileClusterIndexUv(Vec2 uv, UVec2 tileCounts)
-{
-	const UVec2 tileXY = UVec2(uv * Vec2(tileCounts));
-	return tileXY.y * tileCounts.x + tileXY.x;
-}
-
 /// Return the tile index.
 U32 computeTileClusterIndexFragCoord(Vec2 fragCoord, U32 tileSize, U32 tileCountX)
 {
@@ -167,15 +160,20 @@ U32 computeTileClusterIndexFragCoord(Vec2 fragCoord, U32 tileSize, U32 tileCount
 /// Merge the tiles with z splits into a single cluster.
 Cluster mergeClusters(Cluster tileCluster, Cluster zCluster)
 {
+//#define ANKI_OR_MASKS(x) subgroupOr(x)
+#define ANKI_OR_MASKS(x) (x)
+
 	Cluster outCluster;
-	outCluster.m_pointLightsMask = subgroupOr(tileCluster.m_pointLightsMask & zCluster.m_pointLightsMask);
-	outCluster.m_spotLightsMask = subgroupOr(tileCluster.m_spotLightsMask & zCluster.m_spotLightsMask);
-	outCluster.m_decalsMask = subgroupOr(tileCluster.m_decalsMask & zCluster.m_decalsMask);
+	outCluster.m_pointLightsMask = ANKI_OR_MASKS(tileCluster.m_pointLightsMask & zCluster.m_pointLightsMask);
+	outCluster.m_spotLightsMask = ANKI_OR_MASKS(tileCluster.m_spotLightsMask & zCluster.m_spotLightsMask);
+	outCluster.m_decalsMask = ANKI_OR_MASKS(tileCluster.m_decalsMask & zCluster.m_decalsMask);
 	outCluster.m_fogDensityVolumesMask =
-		subgroupOr(tileCluster.m_fogDensityVolumesMask & zCluster.m_fogDensityVolumesMask);
+		ANKI_OR_MASKS(tileCluster.m_fogDensityVolumesMask & zCluster.m_fogDensityVolumesMask);
 	outCluster.m_reflectionProbesMask =
-		subgroupOr(tileCluster.m_reflectionProbesMask & zCluster.m_reflectionProbesMask);
-	outCluster.m_giProbesMask = subgroupOr(tileCluster.m_giProbesMask & zCluster.m_giProbesMask);
+		ANKI_OR_MASKS(tileCluster.m_reflectionProbesMask & zCluster.m_reflectionProbesMask);
+	outCluster.m_giProbesMask = ANKI_OR_MASKS(tileCluster.m_giProbesMask & zCluster.m_giProbesMask);
+
+#undef ANKI_OR_MASKS
 
 	return outCluster;
 }
@@ -196,12 +194,4 @@ Cluster getClusterFragCoord(Vec3 fragCoord)
 							   u_clusteredShading.m_zSplitCount, u_clusteredShading.m_zSplitMagic.x,
 							   u_clusteredShading.m_zSplitMagic.y);
 }
-
-Cluster getClusterUv(Vec2 uv, F32 depth, UVec2 tileCounts, U32 zSplitCount, F32 a, F32 b)
-{
-	const Cluster tileCluster = u_clusters2[computeTileClusterIndexUv(uv, tileCounts)];
-	const Cluster zCluster =
-		u_clusters2[computeZSplitClusterIndex(depth, zSplitCount, a, b) + tileCounts.x * tileCounts.y];
-	return mergeClusters(tileCluster, zCluster);
-}
 #endif

+ 3 - 2
AnKi/Shaders/GBufferPost.ankiprog

@@ -5,6 +5,7 @@
 
 ANKI_SPECIALIZATION_CONSTANT_UVEC2(TILE_COUNTS, 0);
 ANKI_SPECIALIZATION_CONSTANT_U32(Z_SPLIT_COUNT, 2);
+ANKI_SPECIALIZATION_CONSTANT_U32(TILE_SIZE, 3);
 
 #pragma anki start vert
 #include <AnKi/Shaders/QuadVert.glsl>
@@ -48,8 +49,8 @@ void main()
 	const Vec3 worldPos = worldPos4.xyz / worldPos4.w;
 
 	// Get the cluster
-	Cluster cluster = getClusterUv(in_uv, depth, TILE_COUNTS, Z_SPLIT_COUNT, u_clusteredShading.m_zSplitMagic.x,
-								   u_clusteredShading.m_zSplitMagic.y);
+	Cluster cluster = getClusterFragCoord(Vec3(gl_FragCoord.xy, depth), TILE_SIZE, TILE_COUNTS, Z_SPLIT_COUNT,
+										  u_clusteredShading.m_zSplitMagic.x, u_clusteredShading.m_zSplitMagic.y);
 
 	// Process decals
 	if(cluster.m_decalsMask == 0ul)

+ 1 - 2
AnKi/Shaders/RtShadowsRayGen.ankiprog

@@ -87,8 +87,7 @@ void main()
 	const Vec3 normal = readNormalFromGBuffer(u_normalRt, u_linearAnyClampSampler, uv);
 
 	// Cluster
-	Cluster cluster = getClusterUv(uv, depth, u_clusteredShading.m_tileCounts, u_clusteredShading.m_zSplitCount,
-								   u_clusteredShading.m_zSplitMagic.x, u_clusteredShading.m_zSplitMagic.y);
+	Cluster cluster = getClusterFragCoord(Vec3(uv * u_clusteredShading.m_renderingSize, depth));
 
 	F32 shadowFactors[MAX_RT_SHADOW_LAYERS];
 	zeroRtShadowLayers(shadowFactors);

+ 4 - 2
AnKi/Shaders/ShadowmapsResolve.ankiprog

@@ -8,6 +8,7 @@
 ANKI_SPECIALIZATION_CONSTANT_UVEC2(FB_SIZE, 0);
 ANKI_SPECIALIZATION_CONSTANT_UVEC2(TILE_COUNTS, 2);
 ANKI_SPECIALIZATION_CONSTANT_U32(Z_SPLIT_COUNT, 4);
+ANKI_SPECIALIZATION_CONSTANT_U32(TILE_SIZE, 5);
 
 #define CLUSTERED_SHADING_SET 0
 #define CLUSTERED_SHADING_UNIFORMS_BINDING 0
@@ -37,8 +38,9 @@ void main()
 	const Vec3 worldPos = worldPos4.xyz / worldPos4.w;
 
 	// Cluster
-	Cluster cluster = getClusterUv(uv, depth, TILE_COUNTS, Z_SPLIT_COUNT, u_clusteredShading.m_zSplitMagic.x,
-								   u_clusteredShading.m_zSplitMagic.y);
+	const Vec2 fragCoord = uv * u_clusteredShading.m_renderingSize;
+	Cluster cluster = getClusterFragCoord(Vec3(fragCoord, depth), TILE_SIZE, TILE_COUNTS, Z_SPLIT_COUNT,
+										  u_clusteredShading.m_zSplitMagic.x, u_clusteredShading.m_zSplitMagic.y);
 
 	// Layers
 	U32 shadowCasterCountPerFragment = 0;