diff options
Diffstat (limited to 'client/shaders/shadow_shaders/pass1_vertex.glsl')
-rw-r--r-- | client/shaders/shadow_shaders/pass1_vertex.glsl | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/client/shaders/shadow_shaders/pass1_vertex.glsl b/client/shaders/shadow_shaders/pass1_vertex.glsl index 38aef3619..1dceb93c6 100644 --- a/client/shaders/shadow_shaders/pass1_vertex.glsl +++ b/client/shaders/shadow_shaders/pass1_vertex.glsl @@ -6,24 +6,37 @@ uniform float xyPerspectiveBias0; uniform float xyPerspectiveBias1; uniform float zPerspectiveBias; -vec4 getPerspectiveFactor(in vec4 shadowPosition) +vec4 getRelativePosition(in vec4 position) { - vec2 s = vec2(shadowPosition.x > CameraPos.x ? 1.0 : -1.0, shadowPosition.y > CameraPos.y ? 1.0 : -1.0); - vec2 l = s * (shadowPosition.xy - CameraPos.xy) / (1.0 - s * CameraPos.xy); - float pDistance = length(l); + vec2 l = position.xy - CameraPos.xy; + vec2 s = l / abs(l); + s = (1.0 - s * CameraPos.xy); + l /= s; + return vec4(l, s); +} + +float getPerspectiveFactor(in vec4 relativePosition) +{ + float pDistance = length(relativePosition.xy); float pFactor = pDistance * xyPerspectiveBias0 + xyPerspectiveBias1; - l /= pFactor; - shadowPosition.xy = CameraPos.xy * (1.0 - l) + s * l; - shadowPosition.z *= zPerspectiveBias; - return shadowPosition; + return pFactor; } +vec4 applyPerspectiveDistortion(in vec4 position) +{ + vec4 l = getRelativePosition(position); + float pFactor = getPerspectiveFactor(l); + l.xy /= pFactor; + position.xy = l.xy * l.zw + CameraPos.xy; + position.z *= zPerspectiveBias; + return position; +} void main() { vec4 pos = LightMVP * gl_Vertex; - tPos = getPerspectiveFactor(pos); + tPos = applyPerspectiveDistortion(pos); gl_Position = vec4(tPos.xyz, 1.0); gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; |