Fixing lights and shadows
This commit is contained in:
1 parent
9f4d60036d
commit
bba493ee7c
18 files changed
+308
-126
No files matched your search
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user