Decrease shadow mapping bias and better 3rd cascade depth range
This commit is contained in:
parent
3e3593119c
commit
00b465b84f
3 changed files with 15 additions and 12 deletions
|
@ -54,7 +54,7 @@
|
|||
<pass n="2" include="csm-pass.xml">
|
||||
<name>csm2</name>
|
||||
<near-m>50.0</near-m>
|
||||
<far-m>150.0</far-m>
|
||||
<far-m>400.0</far-m>
|
||||
<viewport>
|
||||
<x>0.0</x>
|
||||
<y>0.5</y>
|
||||
|
@ -64,7 +64,7 @@
|
|||
</pass>
|
||||
<pass n="3" include="csm-pass.xml">
|
||||
<name>csm3</name>
|
||||
<near-m>150.0</near-m>
|
||||
<near-m>400.0</near-m>
|
||||
<far-m>1500.0</far-m>
|
||||
<viewport>
|
||||
<x>0.5</x>
|
||||
|
|
|
@ -9,7 +9,7 @@ varying vec4 lightSpacePos[4];
|
|||
|
||||
const bool DEBUG_CASCADES = false;
|
||||
|
||||
const float depth_bias = 2.0;
|
||||
const float DEPTH_BIAS = 1.5;
|
||||
|
||||
// Ideally these should be passed as an uniform, but we don't support uniform
|
||||
// arrays yet
|
||||
|
@ -22,10 +22,10 @@ const vec2 uv_factor = vec2(0.5, 0.5);
|
|||
float debugCascade(int cascade)
|
||||
{
|
||||
const mat2 bayer_matrix = mat2(0, 3, 2, 1);
|
||||
const float scale = 1.0;
|
||||
const float scale = 0.2;
|
||||
vec2 coords = mod(gl_FragCoord.xy * scale, 2.0);
|
||||
int threshold = int(bayer_matrix[int(coords.y)][int(coords.x)]);
|
||||
if (threshold <= cascade)
|
||||
int threshold = int(bayer_matrix[int(coords.x)][int(coords.y)]);
|
||||
if (threshold < cascade)
|
||||
return 0.0;
|
||||
return 1.0;
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ float sampleOffset(vec4 pos, vec2 offset, vec2 invTexelSize)
|
|||
return shadow2DProj(
|
||||
shadow_tex, vec4(
|
||||
pos.xy + offset * invTexelSize * pos.w,
|
||||
pos.z - depth_bias * invTexelSize.x,
|
||||
pos.z - DEPTH_BIAS * invTexelSize.x,
|
||||
pos.w)).r;
|
||||
}
|
||||
|
||||
|
@ -118,17 +118,18 @@ float getShadowing()
|
|||
for (int i = 0; i < 4; ++i) {
|
||||
if (checkWithinBounds(lightSpacePos[i].xy, vec2(0.0), vec2(1.0)) > 0.0 &&
|
||||
(lightSpacePos[i].z / lightSpacePos[i].w) <= 1.0) {
|
||||
float debug_value = 0.0;
|
||||
if (DEBUG_CASCADES)
|
||||
return debugCascade(i);
|
||||
debug_value = debugCascade(i);
|
||||
|
||||
if (checkWithinBounds(lightSpacePos[i].xy, bandBottomLeft, bandTopRight) < 1.0) {
|
||||
vec2 s =
|
||||
smoothstep(vec2(0.0), bandBottomLeft, lightSpacePos[i].xy) -
|
||||
smoothstep(bandTopRight, vec2(1.0), lightSpacePos[i].xy);
|
||||
float blend = 1.0 - s.x * s.y;
|
||||
return mix(sampleShadowMap(i), sampleShadowMap(i+1), blend);
|
||||
return clamp(mix(sampleShadowMap(i), sampleShadowMap(i+1), blend) - debug_value, 0.0, 1.0);
|
||||
}
|
||||
return sampleShadowMap(i);
|
||||
return clamp(sampleShadowMap(i) - debug_value, 0.0, 1.0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#version 120
|
||||
|
||||
uniform bool shadows_enabled;
|
||||
uniform int sun_atlas_size;
|
||||
|
||||
uniform mat4 fg_LightMatrix_csm0;
|
||||
uniform mat4 fg_LightMatrix_csm1;
|
||||
|
@ -9,7 +10,7 @@ uniform mat4 fg_LightMatrix_csm3;
|
|||
|
||||
varying vec4 lightSpacePos[4];
|
||||
|
||||
const float normal_offset_scale = 0.1;
|
||||
const float NORMAL_OFFSET_SCALE = 200.0;
|
||||
|
||||
|
||||
void setupShadows(vec4 eyeSpacePos)
|
||||
|
@ -22,7 +23,8 @@ void setupShadows(vec4 eyeSpacePos)
|
|||
vec3 toLight = normalize(gl_LightSource[0].position.xyz);
|
||||
float costheta = dot(normal, toLight);
|
||||
float slopeScale = clamp(1.0 - costheta, 0.0, 1.0);
|
||||
float normalOffset = normal_offset_scale * slopeScale;
|
||||
float texelSize = 1.0 / sun_atlas_size;
|
||||
float normalOffset = NORMAL_OFFSET_SCALE * slopeScale * texelSize;
|
||||
|
||||
vec4 offsetPos = eyeSpacePos + vec4(normal * normalOffset, 0.0);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue