Browse Source

Move VSM shadow z/w divide to pixel shader so that e.g. shadowed point lights will work much better. Related to #1716.

Lasse Öörni 9 years ago
parent
commit
3e4ca7ae33
2 changed files with 7 additions and 7 deletions
  1. 3 3
      bin/CoreData/Shaders/GLSL/Shadow.glsl
  2. 4 4
      bin/CoreData/Shaders/HLSL/Shadow.hlsl

+ 3 - 3
bin/CoreData/Shaders/GLSL/Shadow.glsl

@@ -3,7 +3,7 @@
 #include "Transform.glsl"
 
 #ifdef VSM_SHADOW
-    varying vec3 vTexCoord;
+    varying vec4 vTexCoord;
 #else
     varying vec2 vTexCoord;
 #endif
@@ -14,7 +14,7 @@ void VS()
     vec3 worldPos = GetWorldPos(modelMatrix);
     gl_Position = GetClipPos(worldPos);
     #ifdef VSM_SHADOW
-        vTexCoord = vec3(GetTexCoord(iTexCoord), gl_Position.z / gl_Position.w * 0.5 + 0.5);
+        vTexCoord = vec4(GetTexCoord(iTexCoord), gl_Position.z, gl_Position.w);
     #else
         vTexCoord = GetTexCoord(iTexCoord);
     #endif
@@ -29,7 +29,7 @@ void PS()
     #endif
 
     #ifdef VSM_SHADOW
-        float depth = vTexCoord.z;
+        float depth = vTexCoord.z / vTexCoord.w * 0.5 + 0.5;
         gl_FragColor = vec4(depth, depth * depth, 1.0, 1.0);
     #else
         gl_FragColor = vec4(1.0);

+ 4 - 4
bin/CoreData/Shaders/HLSL/Shadow.hlsl

@@ -17,7 +17,7 @@ void VS(float4 iPos : POSITION,
         float2 iSize : TEXCOORD1,
     #endif
     #ifdef VSM_SHADOW
-        out float3 oTexCoord : TEXCOORD0,
+        out float4 oTexCoord : TEXCOORD0,
     #else
         out float2 oTexCoord : TEXCOORD0,
     #endif
@@ -32,7 +32,7 @@ void VS(float4 iPos : POSITION,
     float3 worldPos = GetWorldPos(modelMatrix);
     oPos = GetClipPos(worldPos);
     #ifdef VSM_SHADOW
-        oTexCoord = float3(GetTexCoord(iTexCoord), oPos.z/oPos.w);
+        oTexCoord = float4(GetTexCoord(iTexCoord), oPos.z, oPos.w);
     #else
         oTexCoord = GetTexCoord(iTexCoord);
     #endif
@@ -40,7 +40,7 @@ void VS(float4 iPos : POSITION,
 
 void PS(
     #ifdef VSM_SHADOW
-        float3 iTexCoord : TEXCOORD0,
+        float4 iTexCoord : TEXCOORD0,
     #else
         float2 iTexCoord : TEXCOORD0,
     #endif
@@ -53,7 +53,7 @@ void PS(
     #endif
 
     #ifdef VSM_SHADOW
-        float depth = iTexCoord.z;
+        float depth = iTexCoord.z / iTexCoord.w;
         oColor = float4(depth, depth * depth, 1.0, 1.0);
     #else
         oColor = 1.0;