瀏覽代碼

More shader_ballot

Panagiotis Christopoulos Charitos 8 年之前
父節點
當前提交
f7bb56d747

+ 23 - 0
shaders/ClusterLightCommon.glsl

@@ -72,6 +72,29 @@ layout(ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING), std140, row_major) unifor
 #define u_time readFirstInvocationARB(u_lightingUniforms.rendererSizeTimePad1.z)
 #define u_unprojectionParams readFirstInvocationARB(u_lightingUniforms.projectionParams)
 
+#define u_invViewRotation                                                                                              \
+	mat3(readFirstInvocationARB(u_lightingUniforms.invViewRotation[0]),                                                \
+		readFirstInvocationARB(u_lightingUniforms.invViewRotation[1]),                                                 \
+		readFirstInvocationARB(u_lightingUniforms.invViewRotation[2]))
+
+#define u_invProjMat                                                                                                   \
+	mat4(readFirstInvocationARB(u_lightingUniforms.invProjMat[0]),                                                     \
+		readFirstInvocationARB(u_lightingUniforms.invProjMat[1]),                                                      \
+		readFirstInvocationARB(u_lightingUniforms.invProjMat[2]),                                                      \
+		readFirstInvocationARB(u_lightingUniforms.invProjMat[3]))
+
+#define u_invViewProjMat                                                                                               \
+	mat4(readFirstInvocationARB(u_lightingUniforms.invViewProjMat[0]),                                                 \
+		readFirstInvocationARB(u_lightingUniforms.invViewProjMat[1]),                                                  \
+		readFirstInvocationARB(u_lightingUniforms.invViewProjMat[2]),                                                  \
+		readFirstInvocationARB(u_lightingUniforms.invViewProjMat[3]))
+
+#define u_prevViewProjMat                                                                                              \
+	mat4(readFirstInvocationARB(u_lightingUniforms.prevViewProjMat[0]),                                                \
+		readFirstInvocationARB(u_lightingUniforms.prevViewProjMat[1]),                                                 \
+		readFirstInvocationARB(u_lightingUniforms.prevViewProjMat[2]),                                                 \
+		readFirstInvocationARB(u_lightingUniforms.prevViewProjMat[3]))
+
 #ifdef FRAGMENT_SHADER
 
 layout(ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING + 1), std140) uniform u1_

+ 2 - 5
shaders/FsCommonFrag.glsl

@@ -148,11 +148,8 @@ vec3 computeLightColor(vec3 diffCol)
 		float shadowmapLayerIdx = light.diffuseColorShadowmapId.w;
 		if(light.diffuseColorShadowmapId.w >= 0.0)
 		{
-			shadow = computeShadowFactorOmni(frag2Light,
-				shadowmapLayerIdx,
-				light.specularColorRadius.w,
-				u_lightingUniforms.invViewRotation,
-				u_omniMapArr);
+			shadow = computeShadowFactorOmni(
+				frag2Light, shadowmapLayerIdx, light.specularColorRadius.w, u_invViewRotation, u_omniMapArr);
 		}
 #endif
 

+ 7 - 10
shaders/Is.frag.glsl

@@ -113,7 +113,7 @@ void main()
 	vec2 ndc = UV_TO_NDC(in_uv);
 
 	// Get frag pos in view space
-	vec4 fragPos4 = u_lightingUniforms.invProjMat * vec4(ndc, UV_TO_NDC(depth), 1.0);
+	vec4 fragPos4 = u_invProjMat * vec4(ndc, UV_TO_NDC(depth), 1.0);
 	vec3 fragPos = fragPos4.xyz / fragPos4.w;
 	vec3 viewDir = normalize(-fragPos);
 
@@ -121,12 +121,12 @@ void main()
 	vec3 worldPos;
 	vec2 oldUv;
 	{
-		vec4 worldPos4 = u_lightingUniforms.invViewProjMat * vec4(ndc, UV_TO_NDC(depth), 1.0);
+		vec4 worldPos4 = u_invViewProjMat * vec4(ndc, UV_TO_NDC(depth), 1.0);
 		worldPos4 = worldPos4 / worldPos4.w;
 		worldPos = worldPos4.xyz;
 
 		// Project to get old ndc
-		vec4 oldNdc4 = u_lightingUniforms.prevViewProjMat * vec4(worldPos, 1.0);
+		vec4 oldNdc4 = u_prevViewProjMat * vec4(worldPos, 1.0);
 		vec2 oldNdc = oldNdc4.xy / oldNdc4.w;
 
 		oldUv = NDC_TO_UV(oldNdc);
@@ -191,11 +191,8 @@ void main()
 		float shadowmapLayerIdx = light.diffuseColorShadowmapId.w;
 		if(light.diffuseColorShadowmapId.w >= 0.0)
 		{
-			float shadow = computeShadowFactorOmni(frag2Light,
-				shadowmapLayerIdx,
-				light.specularColorRadius.w,
-				u_lightingUniforms.invViewRotation,
-				u_omniMapArr);
+			float shadow = computeShadowFactorOmni(
+				frag2Light, shadowmapLayerIdx, light.specularColorRadius.w, u_invViewRotation, u_omniMapArr);
 			lambert *= shadow;
 		}
 
@@ -226,8 +223,8 @@ void main()
 #if INDIRECT_ENABLED
 	vec3 eye = -viewDir;
 
-	vec3 worldEye = u_lightingUniforms.invViewRotation * eye;
-	vec3 worldNormal = u_lightingUniforms.invViewRotation * normal;
+	vec3 worldEye = u_invViewRotation * eye;
+	vec3 worldNormal = u_invViewRotation * normal;
 	vec3 worldR = reflect(worldEye, worldNormal);
 
 	float reflLod = float(IR_MIPMAP_COUNT) * roughness;

+ 5 - 8
shaders/Volumetric.frag.glsl

@@ -53,11 +53,8 @@ vec3 computeLightColor(vec3 fragPos, uint plightCount, uint plightIdx, uint slig
 		float shadowmapLayerIdx = light.diffuseColorShadowmapId.w;
 		if(light.diffuseColorShadowmapId.w >= 0.0)
 		{
-			factor *= computeShadowFactorOmni(frag2Light,
-				shadowmapLayerIdx,
-				-1.0 / light.posRadius.w,
-				u_lightingUniforms.invViewRotation,
-				u_omniMapArr);
+			factor *= computeShadowFactorOmni(
+				frag2Light, shadowmapLayerIdx, -1.0 / light.posRadius.w, u_invViewRotation, u_omniMapArr);
 		}
 #endif
 
@@ -100,8 +97,8 @@ void main()
 	vec3 history = textureLod(u_historyRt, oldUv, 0.0).rgb;
 
 	vec3 farPos;
-	farPos.z = u_projectionParams.z / (u_projectionParams.w + depth);
-	farPos.xy = ndc.xy * u_projectionParams.xy * farPos.z;
+	farPos.z = u_unprojectionParams.z / (u_unprojectionParams.w + depth);
+	farPos.xy = ndc.xy * u_unprojectionParams.xy * farPos.z;
 	vec3 viewDir = normalize(farPos);
 
 	uint i = uint(in_uv.x * float(CLUSTER_COUNT.x));
@@ -111,7 +108,7 @@ void main()
 	vec3 noiseTexUv = vec3(vec2(FB_SIZE) / vec2(NOISE_MAP_SIZE) * in_uv + vec2(0.0, u_noiseYOffset), u_noiseLayer);
 	float randFactor = clamp(texture(u_noiseTex, noiseTexUv).r, EPSILON, 1.0 - EPSILON);
 
-	float kNear = -u_lightingUniforms.nearFarClustererMagicPad1.x;
+	float kNear = -u_near;
 	vec3 newCol = vec3(0.0);
 	for(uint k = 0u; k < CLUSTER_COUNT.z; ++k)
 	{

+ 3 - 0
src/anki/gr/Enums.h

@@ -281,6 +281,9 @@ enum class ShaderVariableDataType : U8
 	NUMERICS_FIRST = FLOAT,
 	NUMERICS_LAST = MAT4,
 
+	MATRIX_FIRST = MAT3,
+	MATRIX_LAST = MAT4,
+
 	SAMPLERS_FIRST = SAMPLER_2D,
 	SAMPLERS_LAST = SAMPLER_CUBE
 };

+ 8 - 2
src/anki/resource/MaterialLoader.cpp

@@ -679,14 +679,20 @@ void MaterialLoader::processInputs()
 				// In block
 
 				in.m_index = m_nextIndex++;
+				const Bool isMatrix = in.m_type >= ShaderVariableDataType::MATRIX_FIRST
+					&& in.m_type <= ShaderVariableDataType::MATRIX_LAST;
 
 				in.m_line.sprintf("#if %s\n"
-								  "%s var%u%s;\n"
+								  "%s var%u_u%s;\n"
+								  "#define var%u %s(var%u_u)\n"
 								  "#endif",
 					!in.m_flags.m_inShadow ? "PASS == COLOR" : "1",
 					&in.typeStr()[0],
 					in.m_index,
-					in.m_flags.m_instanced ? " INSTANCED" : "");
+					in.m_flags.m_instanced ? " INSTANCED" : "",
+					in.m_index,
+					(isMatrix) ? "" : "readFirstInvocationARB",
+					in.m_index);
 			}
 			else
 			{