Shadows: Softer edge and smoother cascade transitions

This commit is contained in:
Vincent Lejeune 2014-02-15 20:45:47 +01:00
parent fd8496ffba
commit d5d57bbae0
2 changed files with 47 additions and 36 deletions

View File

@ -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;

View File

@ -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();