Shadows: Softer edge and smoother cascade transitions
This commit is contained in:
parent
fd8496ffba
commit
d5d57bbae0
@ -24,13 +24,18 @@ vec3 DecodeNormal(vec2 n)
|
||||
return vec3(xy,z);
|
||||
}
|
||||
|
||||
float getShadowFactor(vec3 pos, float bias)
|
||||
float getShadowFactor(vec3 pos, float bias, int index)
|
||||
{
|
||||
if (pos.z < 5.)
|
||||
{
|
||||
vec4 shadowcoord = (shadowmat[0] * vec4(pos, 1.0));
|
||||
shadowcoord /= shadowcoord.w;
|
||||
vec2 shadowtexcoord = shadowcoord.xy * 0.5 + 0.5;
|
||||
const vec2 shadowoffset[] = {
|
||||
vec2(-1., -1.),
|
||||
vec2(-1., 1.),
|
||||
vec2(1., -1.),
|
||||
vec2(1., 1.)
|
||||
};
|
||||
|
||||
vec4 shadowcoord = (shadowmat[index] * vec4(pos, 1.0));
|
||||
shadowcoord /= shadowcoord.w;
|
||||
vec2 shadowtexcoord = shadowcoord.xy * 0.5 + 0.5;
|
||||
// shadowcoord = (shadowcoord * 0.5) + vec3(0.5);
|
||||
|
||||
// float movex = decdepth(texture(warpx, shadowcoord.xy));
|
||||
@ -39,31 +44,14 @@ float getShadowFactor(vec3 pos, float bias)
|
||||
// float dy = movey * 2.0 - 1.0;
|
||||
// shadowcoord.xy += vec2(dx, dy);*/
|
||||
|
||||
//float shadowmapz = 2. * texture(shadowtex, vec3(shadowtexcoord, shadowcoord.z).x - 1.;
|
||||
// bias += smoothstep(0.001, 0.1, moved) * 0.014; // According to the warping
|
||||
return texture(shadowtex, vec4(shadowtexcoord, 0., 0.5 * (shadowcoord.z + bias * 0.001) + 0.5));
|
||||
}
|
||||
else if (pos.z < 10.)
|
||||
//float shadowmapz = 2. * texture(shadowtex, vec3(shadowtexcoord, shadowcoord.z).x - 1.;
|
||||
// bias += smoothstep(0.001, 0.1, moved) * 0.014; // According to the warping
|
||||
float sum = 0.;
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
vec4 shadowcoord = (shadowmat[1] * vec4(pos, 1.0));
|
||||
shadowcoord /= shadowcoord.w;
|
||||
vec2 shadowtexcoord = shadowcoord.xy * 0.5 + 0.5;
|
||||
return texture(shadowtex, vec4(shadowtexcoord, 1., 0.5 * (shadowcoord.z + bias * 0.001) + 0.5));
|
||||
}
|
||||
else if (pos.z < 75.)
|
||||
{
|
||||
vec4 shadowcoord = (shadowmat[2] * vec4(pos, 1.0));
|
||||
shadowcoord /= shadowcoord.w;
|
||||
vec2 shadowtexcoord = shadowcoord.xy * 0.5 + 0.5;
|
||||
return texture(shadowtex, vec4(shadowtexcoord, 2., 0.5 * (shadowcoord.z + bias * 0.001) + 0.5));
|
||||
}
|
||||
else
|
||||
{
|
||||
vec4 shadowcoord = (shadowmat[3] * vec4(pos, 1.0));
|
||||
shadowcoord /= shadowcoord.w;
|
||||
vec2 shadowtexcoord = shadowcoord.xy * 0.5 + 0.5;
|
||||
return texture(shadowtex, vec4(shadowtexcoord, 3., 0.5 * (shadowcoord.z + bias) + 0.5));
|
||||
sum += texture(shadowtex, vec4(shadowtexcoord + 0.0005 * shadowoffset[i], float(index), 0.5 * (shadowcoord.z + bias * 0.001) + 0.5));
|
||||
}
|
||||
return sum / 4.;
|
||||
}
|
||||
|
||||
void main() {
|
||||
@ -96,7 +84,30 @@ void main() {
|
||||
// Shadows
|
||||
float bias = 0.002 * tan(acos(NdotL)); // According to the slope
|
||||
bias = clamp(bias, 0.001, 0.014);
|
||||
float factor = getShadowFactor(xpos.xyz, bias);
|
||||
float factor;
|
||||
if (xpos.z < 20.)
|
||||
factor = getShadowFactor(xpos.xyz, bias, 0);
|
||||
else if (xpos.z < 25.)
|
||||
{
|
||||
float a = getShadowFactor(xpos.xyz, bias, 0), b = getShadowFactor(xpos.xyz, bias, 1);
|
||||
factor = mix(a, b, (xpos.z - 20.) / 5.);
|
||||
}
|
||||
else if (xpos.z < 50.)
|
||||
factor = getShadowFactor(xpos.xyz, bias, 1);
|
||||
else if (xpos.z < 60.)
|
||||
{
|
||||
float a = getShadowFactor(xpos.xyz, bias, 1), b = getShadowFactor(xpos.xyz, bias, 2);
|
||||
factor = mix(a, b, (xpos.z - 50.) / 10.);
|
||||
}
|
||||
else if (xpos.z < 100.)
|
||||
factor = getShadowFactor(xpos.xyz, bias, 2);
|
||||
else if (xpos.z < 120.)
|
||||
{
|
||||
float a = getShadowFactor(xpos.xyz, bias, 2), b = getShadowFactor(xpos.xyz, bias, 3);
|
||||
factor = mix(a, b, (xpos.z - 100.) / 20.);
|
||||
}
|
||||
else
|
||||
factor = getShadowFactor(xpos.xyz, bias, 3);
|
||||
Diff = vec4(factor * NdotL * col, 1.);
|
||||
Spec = vec4(factor * Specular * col, 1.);
|
||||
return;
|
||||
|
@ -478,17 +478,17 @@ void IrrDriver::renderShadows(//ShadowImportanceProvider * const sicb,
|
||||
const float oldnear = camnode->getNearValue();
|
||||
float FarValues[] =
|
||||
{
|
||||
5.,
|
||||
10.,
|
||||
75.,
|
||||
20.,
|
||||
50.,
|
||||
100.,
|
||||
oldfar,
|
||||
};
|
||||
float NearValues[] =
|
||||
{
|
||||
oldnear,
|
||||
5.,
|
||||
10.,
|
||||
75.,
|
||||
20.,
|
||||
50.,
|
||||
100.,
|
||||
};
|
||||
|
||||
const core::matrix4 &SunCamViewMatrix = m_suncam->getViewMatrix();
|
||||
|
Loading…
x
Reference in New Issue
Block a user