Explorar o código

Further shader cleanup.

Lasse Öörni %!s(int64=14) %!d(string=hai) anos
pai
achega
0a6538f069

+ 2 - 2
SourceAssets/GLSLShaders/Forward.frag

@@ -21,7 +21,7 @@ varying vec4 vLightVec;
         #elif defined(SPOTLIGHT)
             varying vec4 vShadowPos;
         #else
-            varying vec3 vWorldLightVec;
+            varying vec3 vShadowPos;
         #endif
     #endif
     #ifdef SPOTLIGHT
@@ -74,7 +74,7 @@ void main()
             #elif defined(SPOTLIGHT)
                 diff *= GetShadow(vShadowPos);
             #else
-                diff *= GetCubeShadow(vWorldLightVec);
+                diff *= GetCubeShadow(vShadowPos);
             #endif
         #endif
 

+ 6 - 15
SourceAssets/GLSLShaders/Forward.vert

@@ -19,7 +19,7 @@ varying vec4 vLightVec;
         #elif defined(SPOTLIGHT)
             varying vec4 vShadowPos;
         #else
-            varying vec3 vWorldLightVec;
+            varying vec3 vShadowPos;
         #endif
     #endif
     #ifdef SPOTLIGHT
@@ -47,7 +47,6 @@ void main()
     
         vNormal = GetWorldNormal(modelMatrix);
         vec3 centeredWorldPos = worldPos - cCameraPos;
-        vec4 projWorldPos = vec4(worldPos, 1.0);
 
         #if defined(DIRLIGHT)
             vLightVec = vec4(cLightDir, GetDepth(gl_Position));
@@ -56,26 +55,18 @@ void main()
         #else
             vLightVec = vec4(0.0, 0.0, 0.0, GetDepth(gl_Position));
         #endif
-    
+
         #ifdef SHADOW
             // Shadow projection: transform from world space to shadow space
-            #if defined(DIRLIGHT)
-                vShadowPos[0] = cShadowProj[0] * projWorldPos;
-                vShadowPos[1] = cShadowProj[1] * projWorldPos;
-                vShadowPos[2] = cShadowProj[2] * projWorldPos;
-                vShadowPos[3] = cShadowProj[3] * projWorldPos;
-            #elif defined(SPOTLIGHT)
-                vShadowPos = cShadowProj[0] * projWorldPos;
-            #else
-                vWorldLightVec = centeredWorldPos - cLightPos;
-            #endif
+            GetShadowPos(worldPos, vShadowPos);
         #endif
-    
+
         #ifdef SPOTLIGHT
             // Spotlight projection: transform from world space to projector texture coordinates
+            vec4 projWorldPos = vec4(worldPos, 1.0);
             vSpotPos = cSpotProj * projWorldPos;
         #endif
-    
+
         #ifdef POINTLIGHT
             vCubeMaskVec = cLightVecRot * vLightVec.xyz;
         #endif

+ 24 - 0
SourceAssets/GLSLShaders/Transform.vert

@@ -86,3 +86,27 @@ vec3 GetWorldTangent(mat4 modelMatrix)
         return normalize(normalMatrix * iTangent.xyz);
     #endif
 }
+
+#ifdef SHADOW
+    #if defined(DIRLIGHT)
+        void GetShadowPos(vec3 worldPos, out vec4 shadowPos[4])
+        {
+            vec4 projWorldPos = vec4(worldPos, 1.0);
+            shadowPos[0] = cShadowProj[0] * projWorldPos;
+            shadowPos[1] = cShadowProj[1] * projWorldPos;
+            shadowPos[2] = cShadowProj[2] * projWorldPos;
+            shadowPos[3] = cShadowProj[3] * projWorldPos;
+        }
+    #elif defined(SPOTLIGHT)
+        void GetShadowPos(vec3 worldPos, out vec4 shadowPos)
+        {
+            vec4 projWorldPos = vec4(worldPos, 1.0);
+            shadowPos = cShadowProj[0] * projWorldPos;
+        }
+    #else
+        void GetShadowPos(vec3 worldPos, out vec3 shadowPos)
+        {
+            shadowPos = worldPos - cCameraPos - cLightPos;
+        }
+    #endif
+#endif

+ 2 - 11
SourceAssets/HLSLShaders/Forward.hlsl

@@ -66,7 +66,6 @@ void VS(float4 iPos : POSITION,
 
         oNormal = GetWorldNormal(modelMatrix);
         float3 centeredWorldPos = worldPos - cCameraPos;
-        float4 projWorldPos = float4(worldPos, 1.0);
 
         #ifdef DIRLIGHT
             oLightVec = float4(cLightDir, GetDepth(oPos));
@@ -78,20 +77,12 @@ void VS(float4 iPos : POSITION,
     
         #ifdef SHADOW
             // Shadow projection: transform from world space to shadow space
-            #if defined(DIRLIGHT)
-                oShadowPos[0] = mul(projWorldPos, cShadowProj[0]);
-                oShadowPos[1] = mul(projWorldPos, cShadowProj[1]);
-                oShadowPos[2] = mul(projWorldPos, cShadowProj[2]);
-                oShadowPos[3] = mul(projWorldPos, cShadowProj[3]);
-            #elif defined(SPOTLIGHT)
-                oShadowPos = mul(projWorldPos, cShadowProj[0]);
-            #else
-                oShadowPos = centeredWorldPos - cLightPos;
-            #endif
+            GetShadowPos(worldPos, oShadowPos);
         #endif
     
         #ifdef SPOTLIGHT
             // Spotlight projection: transform from world space to projector texture coordinates
+            float4 projWorldPos = float4(worldPos, 1.0);
             oSpotPos = mul(projWorldPos, cSpotProj);
         #endif
 

+ 24 - 0
SourceAssets/HLSLShaders/Transform.hlsl

@@ -52,3 +52,27 @@ float3 GetBillboardNormal()
 #endif
 
 #define GetWorldTangent(modelMatrix) normalize(mul(iTangent.xyz, (float3x3)modelMatrix))
+
+#ifdef SHADOW
+    #if defined(DIRLIGHT)
+        void GetShadowPos(float3 worldPos, out float4 shadowPos[4])
+        {
+            float4 projWorldPos = float4(worldPos, 1.0);
+            shadowPos[0] = mul(projWorldPos, cShadowProj[0]);
+            shadowPos[1] = mul(projWorldPos, cShadowProj[1]);
+            shadowPos[2] = mul(projWorldPos, cShadowProj[2]);
+            shadowPos[3] = mul(projWorldPos, cShadowProj[3]);
+        }
+    #elif defined(SPOTLIGHT)
+        void GetShadowPos(float3 worldPos, out float4 shadowPos)
+        {
+            float4 projWorldPos = float4(worldPos, 1.0);
+            shadowPos = mul(projWorldPos, cShadowProj[0]);
+        }
+    #else
+        void GetShadowPos(float3 worldPos, out float3 shadowPos)
+        {
+            shadowPos = worldPos - cCameraPos - cLightPos;
+        }
+    #endif
+#endif