浏览代码

Folded GetShadowPos() back into the lighting shader code as the function contains light-specific #ifdefs.

Lasse Öörni 14 年之前
父节点
当前提交
960b8de398

+ 17 - 10
SourceAssets/GLSLShaders/Forward.vert

@@ -35,6 +35,10 @@ void main()
     gl_Position = GetClipPos(worldPos);
     gl_Position = GetClipPos(worldPos);
     vTexCoord = GetTexCoord(iTexCoord);
     vTexCoord = GetTexCoord(iTexCoord);
 
 
+    #ifdef VERTEXCOLOR
+        vColor = iColor;
+    #endif
+
     #ifdef LIGHT
     #ifdef LIGHT
 
 
         #ifdef NORMALMAP
         #ifdef NORMALMAP
@@ -45,23 +49,30 @@ void main()
     
     
         vNormal = GetWorldNormal(modelMatrix);
         vNormal = GetWorldNormal(modelMatrix);
         vec3 centeredWorldPos = worldPos - cCameraPos;
         vec3 centeredWorldPos = worldPos - cCameraPos;
+        vec4 projWorldPos = vec4(worldPos, 1.0);
 
 
-        #if defined(DIRLIGHT)
+        #ifdef DIRLIGHT
             vLightVec = vec4(cLightDir, GetDepth(gl_Position));
             vLightVec = vec4(cLightDir, GetDepth(gl_Position));
-        #elif defined(LIGHT)
-            vLightVec = vec4((cLightPos - centeredWorldPos) * cLightAtten, GetDepth(gl_Position));
         #else
         #else
-            vLightVec = vec4(0.0, 0.0, 0.0, GetDepth(gl_Position));
+            vLightVec = vec4((cLightPos - centeredWorldPos) * cLightAtten, GetDepth(gl_Position));
         #endif
         #endif
 
 
         #ifdef SHADOW
         #ifdef SHADOW
             // Shadow projection: transform from world space to shadow space
             // Shadow projection: transform from world space to shadow space
-            GetShadowPos(worldPos, vShadowPos);
+            #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
+                vShadowPos = centeredWorldPos - cLightPos;
+            #endif
         #endif
         #endif
 
 
         #ifdef SPOTLIGHT
         #ifdef SPOTLIGHT
             // Spotlight projection: transform from world space to projector texture coordinates
             // Spotlight projection: transform from world space to projector texture coordinates
-            vec4 projWorldPos = vec4(worldPos, 1.0);
             vSpotPos = cSpotProj * projWorldPos;
             vSpotPos = cSpotProj * projWorldPos;
         #endif
         #endif
 
 
@@ -88,8 +99,4 @@ void main()
         vLightVec = vec4(0.0, 0.0, 0.0, GetDepth(gl_Position));
         vLightVec = vec4(0.0, 0.0, 0.0, GetDepth(gl_Position));
 
 
     #endif
     #endif
-
-    #ifdef VERTEXCOLOR
-        vColor = iColor;
-    #endif
 }
 }

+ 0 - 21
SourceAssets/GLSLShaders/Transform.vert

@@ -87,24 +87,3 @@ vec3 GetWorldTangent(mat4 modelMatrix)
     #endif
     #endif
 }
 }
 
 
-#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

+ 18 - 11
SourceAssets/HLSLShaders/Forward.hlsl

@@ -56,6 +56,10 @@ void VS(float4 iPos : POSITION,
     oPos = GetClipPos(worldPos);
     oPos = GetClipPos(worldPos);
     oTexCoord = GetTexCoord(iTexCoord);
     oTexCoord = GetTexCoord(iTexCoord);
 
 
+    #ifdef VERTEXCOLOR
+        oColor = iColor;
+    #endif
+
     #ifdef LIGHT
     #ifdef LIGHT
 
 
         #ifdef NORMALMAP
         #ifdef NORMALMAP
@@ -66,23 +70,30 @@ void VS(float4 iPos : POSITION,
 
 
         oNormal = GetWorldNormal(modelMatrix);
         oNormal = GetWorldNormal(modelMatrix);
         float3 centeredWorldPos = worldPos - cCameraPos;
         float3 centeredWorldPos = worldPos - cCameraPos;
+        float4 projWorldPos = float4(worldPos, 1.0);
 
 
         #ifdef DIRLIGHT
         #ifdef DIRLIGHT
             oLightVec = float4(cLightDir, GetDepth(oPos));
             oLightVec = float4(cLightDir, GetDepth(oPos));
-        #elif defined(LIGHT)
-            oLightVec = float4((cLightPos - centeredWorldPos) * cLightAtten, GetDepth(oPos));
         #else
         #else
-            oLightVec = float4(0.0, 0.0, 0.0, GetDepth(oPos));
+            oLightVec = float4((cLightPos - centeredWorldPos) * cLightAtten, GetDepth(oPos));
         #endif
         #endif
-    
+
         #ifdef SHADOW
         #ifdef SHADOW
             // Shadow projection: transform from world space to shadow space
             // Shadow projection: transform from world space to shadow space
-            GetShadowPos(worldPos, oShadowPos);
+            #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
         #endif
         #endif
-    
+
         #ifdef SPOTLIGHT
         #ifdef SPOTLIGHT
             // Spotlight projection: transform from world space to projector texture coordinates
             // Spotlight projection: transform from world space to projector texture coordinates
-            float4 projWorldPos = float4(worldPos, 1.0);
             oSpotPos = mul(projWorldPos, cSpotProj);
             oSpotPos = mul(projWorldPos, cSpotProj);
         #endif
         #endif
 
 
@@ -109,10 +120,6 @@ void VS(float4 iPos : POSITION,
         oLightVec = float4(0.0, 0.0, 0.0, GetDepth(oPos));
         oLightVec = float4(0.0, 0.0, 0.0, GetDepth(oPos));
 
 
     #endif
     #endif
-
-    #ifdef VERTEXCOLOR
-        oColor = iColor;
-    #endif
 }
 }
 
 
 void PS(float2 iTexCoord : TEXCOORD0,
 void PS(float2 iTexCoord : TEXCOORD0,

+ 0 - 22
SourceAssets/HLSLShaders/Transform.hlsl

@@ -52,25 +52,3 @@ float3 GetBillboardNormal()
 #endif
 #endif
 
 
 #define GetWorldTangent(modelMatrix) normalize(mul(iTangent.xyz, (float3x3)modelMatrix))
 #define GetWorldTangent(modelMatrix) normalize(mul(iTangent.xyz, (float3x3)modelMatrix))
-
-#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