Fixing lights and shadows

This commit is contained in:
Vladislav Khorev committed 2026-06-15 21:25:54 +03:00
1 parent 9f4d60036d
commit bba493ee7c
18 files changed
+308 -126

No files matched your search

+2
View File
@@ -6,6 +6,7 @@ varying vec2 texCoord;
varying float fogDistance;
varying vec3 fragViewPos;
varying vec3 fragNormal;
varying vec2 fragWorldXZ;
uniform mat4 ProjectionModelViewMatrix;
uniform mat4 ModelViewMatrix;
@@ -19,4 +20,5 @@ void main()
texCoord = vTexCoord;
fragViewPos = eyePos.xyz;
fragNormal = mat3(ModelViewMatrix) * vNormal;
fragWorldXZ = vPosition.xz;
}
+8 -1
View File
@@ -4,6 +4,8 @@ uniform int uPointLightCount;
uniform vec3 uPointLightPos[4];
uniform vec3 uPointLightDir[4];
uniform vec3 uPointLightColor[4];
uniform vec2 uPointLightWorldXZ[4];
uniform vec2 uPointLightLimitXZ[4];
uniform vec3 uAmbientColor;
uniform vec3 uFogColor;
@@ -11,6 +13,7 @@ varying vec2 texCoord;
varying float fogDistance;
varying vec3 fragViewPos;
varying vec3 fragNormal;
varying vec2 fragWorldXZ;
// cos(45 deg) = half-angle for a 90-degree full-angle spotlight
const float SPOT_COS_OUTER = 0.7071;
@@ -44,7 +47,11 @@ void main()
float atten = 1.0 / (1.0 + 0.35 * dist + 0.15 * dist * dist);
float diff = hasNormal ? max(dot(N, lightDir), 0.0) : 1.0;
lighting += uPointLightColor[i] * diff * atten * spotAtten;
vec2 worldDelta = abs(fragWorldXZ - uPointLightWorldXZ[i]);
float rectX = 1.0 - smoothstep(uPointLightLimitXZ[i].x - 0.5, uPointLightLimitXZ[i].x + 0.5, worldDelta.x);
float rectY = 1.0 - smoothstep(uPointLightLimitXZ[i].y - 0.5, uPointLightLimitXZ[i].y + 0.5, worldDelta.y);
lighting += uPointLightColor[i] * diff * atten * spotAtten * rectX * rectY;
}
color.rgb *= lighting;
@@ -7,6 +7,7 @@ varying vec4 fragPosLightSpace;
varying vec3 fragNormal;
varying float fogDistance;
varying vec3 fragViewPos;
varying vec2 fragWorldXZ;
uniform mat4 ProjectionModelViewMatrix;
uniform mat4 ModelViewMatrix;
@@ -22,4 +23,5 @@ void main()
fragViewPos = eyePos.xyz;
fragNormal = mat3(ModelViewMatrix) * vNormal;
fragPosLightSpace = uLightFromCamera * eyePos;
fragWorldXZ = vPosition.xz;
}
@@ -6,6 +6,8 @@ uniform int uPointLightCount;
uniform vec3 uPointLightPos[4];
uniform vec3 uPointLightDir[4];
uniform vec3 uPointLightColor[4];
uniform vec2 uPointLightWorldXZ[4];
uniform vec2 uPointLightLimitXZ[4];
uniform vec3 uAmbientColor;
uniform vec3 uFogColor;
@@ -14,6 +16,7 @@ varying vec4 fragPosLightSpace;
varying vec3 fragNormal;
varying float fogDistance;
varying vec3 fragViewPos;
varying vec2 fragWorldXZ;
const float SPOT_COS_OUTER = 0.7071;
const float SPOT_COS_INNER = 0.82;
@@ -83,7 +86,11 @@ void main()
float atten = 1.0 / (1.0 + 0.35 * dist + 0.15 * dist * dist);
float diff = hasNormal ? max(dot(N, lightDir), 0.0) : 1.0;
lighting += uPointLightColor[i] * diff * atten * spotAtten * (1.0 - shadow);
vec2 worldDelta = abs(fragWorldXZ - uPointLightWorldXZ[i]);
float rectX = 1.0 - smoothstep(uPointLightLimitXZ[i].x - 0.5, uPointLightLimitXZ[i].x + 0.5, worldDelta.x);
float rectY = 1.0 - smoothstep(uPointLightLimitXZ[i].y - 0.5, uPointLightLimitXZ[i].y + 0.5, worldDelta.y);
lighting += uPointLightColor[i] * diff * atten * spotAtten * rectX * rectY * (1.0 - shadow);
}
color.rgb *= lighting;
@@ -8,6 +8,8 @@ uniform int uPointLightCount;
uniform vec3 uPointLightPos[4];
uniform vec3 uPointLightDir[4];
uniform vec3 uPointLightColor[4];
uniform vec2 uPointLightWorldXZ[4];
uniform vec2 uPointLightLimitXZ[4];
uniform vec3 uAmbientColor;
uniform vec3 uFogColor;
@@ -16,6 +18,7 @@ varying vec4 fragPosLightSpace;
varying vec3 fragNormal;
varying float fogDistance;
varying vec3 fragViewPos;
varying vec2 fragWorldXZ;
const float SPOT_COS_OUTER = 0.7071;
const float SPOT_COS_INNER = 0.82;
@@ -85,7 +88,11 @@ void main()
float atten = 1.0 / (1.0 + 0.35 * dist + 0.15 * dist * dist);
float diff = hasNormal ? max(dot(N, lightDir), 0.0) : 1.0;
lighting += uPointLightColor[i] * diff * atten * spotAtten * (1.0 - shadow);
vec2 worldDelta = abs(fragWorldXZ - uPointLightWorldXZ[i]);
float rectX = 1.0 - smoothstep(uPointLightLimitXZ[i].x - 0.5, uPointLightLimitXZ[i].x + 0.5, worldDelta.x);
float rectY = 1.0 - smoothstep(uPointLightLimitXZ[i].y - 0.5, uPointLightLimitXZ[i].y + 0.5, worldDelta.y);
lighting += uPointLightColor[i] * diff * atten * spotAtten * rectX * rectY * (1.0 - shadow);
}
color.rgb *= lighting;
@@ -10,9 +10,11 @@ varying vec2 texCoord;
varying float fogDistance;
varying vec3 fragViewPos;
varying vec3 fragNormal;
varying vec2 fragWorldXZ;
uniform mat4 ProjectionModelViewMatrix;
uniform mat4 ModelViewMatrix;
uniform mat4 uViewInverse;
uniform mat4 uBoneMatrices[58];
uniform vec3 uPlayerEyePos;
@@ -65,4 +67,5 @@ void main()
texCoord = vTexCoord;
fragViewPos = eyePos.xyz;
fragNormal = mat3(ModelViewMatrix) * skinnedNormal;
fragWorldXZ = (uViewInverse * eyePos).xz;
}
@@ -11,10 +11,12 @@ varying vec4 fragPosLightSpace;
varying vec3 fragNormal;
varying float fogDistance;
varying vec3 fragViewPos;
varying vec2 fragWorldXZ;
uniform mat4 ProjectionModelViewMatrix;
uniform mat4 ModelViewMatrix;
uniform mat4 uLightFromCamera;
uniform mat4 uViewInverse;
uniform mat4 uBoneMatrices[58];
uniform vec3 uPlayerEyePos;
@@ -68,4 +70,5 @@ void main()
fragViewPos = eyePos.xyz;
fragNormal = mat3(ModelViewMatrix) * skinnedNormal;
fragPosLightSpace = uLightFromCamera * eyePos;
fragWorldXZ = (uViewInverse * eyePos).xz;
}
+8 -1
View File
@@ -6,6 +6,8 @@ uniform int uPointLightCount;
uniform vec3 uPointLightPos[4];
uniform vec3 uPointLightDir[4];
uniform vec3 uPointLightColor[4];
uniform vec2 uPointLightWorldXZ[4];
uniform vec2 uPointLightLimitXZ[4];
uniform vec3 uAmbientColor;
uniform vec3 uFogColor;
@@ -13,6 +15,7 @@ varying vec2 texCoord;
varying float fogDistance;
varying vec3 fragViewPos;
varying vec3 fragNormal;
varying vec2 fragWorldXZ;
// cos(45 deg) = half-angle for a 90-degree full-angle spotlight
const float SPOT_COS_OUTER = 0.7071;
@@ -46,7 +49,11 @@ void main()
float atten = 1.0 / (1.0 + 0.35 * dist + 0.15 * dist * dist);
float diff = hasNormal ? max(dot(N, lightDir), 0.0) : 1.0;
lighting += uPointLightColor[i] * diff * atten * spotAtten;
vec2 worldDelta = abs(fragWorldXZ - uPointLightWorldXZ[i]);
float rectX = 1.0 - smoothstep(uPointLightLimitXZ[i].x - 0.5, uPointLightLimitXZ[i].x + 0.5, worldDelta.x);
float rectY = 1.0 - smoothstep(uPointLightLimitXZ[i].y - 0.5, uPointLightLimitXZ[i].y + 0.5, worldDelta.y);
lighting += uPointLightColor[i] * diff * atten * spotAtten * rectX * rectY;
}
color.rgb *= lighting;