mirror of
https://github.com/overte-org/overte.git
synced 2025-08-10 20:33:09 +02:00
Switched to clamped tangent for shadow slope bias
This commit is contained in:
parent
ae20a5d439
commit
5d7b149a9e
3 changed files with 11 additions and 10 deletions
|
@ -336,7 +336,7 @@ void RenderShadowSetup::setConstantBias(int cascadeIndex, float value) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderShadowSetup::setSlopeBias(int cascadeIndex, float value) {
|
void RenderShadowSetup::setSlopeBias(int cascadeIndex, float value) {
|
||||||
_bias[cascadeIndex]._slope = value * value * value * 0.01f;
|
_bias[cascadeIndex]._slope = value * value * value * 0.001f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderShadowSetup::run(const render::RenderContextPointer& renderContext, const Input& input, Output& output) {
|
void RenderShadowSetup::run(const render::RenderContextPointer& renderContext, const Input& input, Output& output) {
|
||||||
|
|
|
@ -95,8 +95,8 @@ public:
|
||||||
float constantBias3{ 0.2f };
|
float constantBias3{ 0.2f };
|
||||||
float slopeBias0{ 0.6f };
|
float slopeBias0{ 0.6f };
|
||||||
float slopeBias1{ 0.6f };
|
float slopeBias1{ 0.6f };
|
||||||
float slopeBias2{ 0.7f };
|
float slopeBias2{ 0.65f };
|
||||||
float slopeBias3{ 0.82f };
|
float slopeBias3{ 0.7f };
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void dirty();
|
void dirty();
|
||||||
|
|
|
@ -90,8 +90,8 @@ float evalShadowAttenuationPCF(int cascadeIndex, ShadowSampleOffsets offsets, ve
|
||||||
return shadowAttenuation;
|
return shadowAttenuation;
|
||||||
}
|
}
|
||||||
|
|
||||||
float evalShadowCascadeAttenuation(int cascadeIndex, ShadowSampleOffsets offsets, vec4 shadowTexcoord, float oneMinusNdotL) {
|
float evalShadowCascadeAttenuation(int cascadeIndex, ShadowSampleOffsets offsets, vec4 shadowTexcoord, float slopeNdotL) {
|
||||||
float bias = getShadowFixedBias(cascadeIndex) + getShadowSlopeBias(cascadeIndex) * oneMinusNdotL;
|
float bias = getShadowFixedBias(cascadeIndex) + getShadowSlopeBias(cascadeIndex) * slopeNdotL;
|
||||||
return evalShadowAttenuationPCF(cascadeIndex, offsets, shadowTexcoord, bias);
|
return evalShadowAttenuationPCF(cascadeIndex, offsets, shadowTexcoord, bias);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,7 +104,8 @@ float evalShadowAttenuation(vec3 worldLightDir, vec4 worldPosition, float viewDe
|
||||||
vec3 cascadeMix;
|
vec3 cascadeMix;
|
||||||
bvec4 isPixelOnCascade;
|
bvec4 isPixelOnCascade;
|
||||||
int cascadeIndex;
|
int cascadeIndex;
|
||||||
float oneMinusNdotL = 1.0 - clamp(dot(worldLightDir, worldNormal), 0.0, 1.0);
|
float NdotL = clamp(dot(worldLightDir, worldNormal), 0.0, 1.0);
|
||||||
|
float slopeNdotL = min(2.0, sqrt(1.0-NdotL*NdotL) / NdotL);
|
||||||
|
|
||||||
for (cascadeIndex=0 ; cascadeIndex<getShadowCascadeCount() ; cascadeIndex++) {
|
for (cascadeIndex=0 ; cascadeIndex<getShadowCascadeCount() ; cascadeIndex++) {
|
||||||
cascadeShadowCoords[cascadeIndex] = evalShadowTexcoord(cascadeIndex, worldPosition);
|
cascadeShadowCoords[cascadeIndex] = evalShadowTexcoord(cascadeIndex, worldPosition);
|
||||||
|
@ -115,10 +116,10 @@ float evalShadowAttenuation(vec3 worldLightDir, vec4 worldPosition, float viewDe
|
||||||
isPixelOnCascade.z = isShadowCascadeProjectedOnPixel(cascadeShadowCoords[2]);
|
isPixelOnCascade.z = isShadowCascadeProjectedOnPixel(cascadeShadowCoords[2]);
|
||||||
isPixelOnCascade.w = isShadowCascadeProjectedOnPixel(cascadeShadowCoords[3]);
|
isPixelOnCascade.w = isShadowCascadeProjectedOnPixel(cascadeShadowCoords[3]);
|
||||||
|
|
||||||
cascadeAttenuations.x = mix(1.0, evalShadowCascadeAttenuation(0, offsets, cascadeShadowCoords[0], oneMinusNdotL), float(isPixelOnCascade.x));
|
cascadeAttenuations.x = mix(1.0, evalShadowCascadeAttenuation(0, offsets, cascadeShadowCoords[0], slopeNdotL), float(isPixelOnCascade.x));
|
||||||
cascadeAttenuations.y = mix(1.0, evalShadowCascadeAttenuation(1, offsets, cascadeShadowCoords[1], oneMinusNdotL), float(isPixelOnCascade.y));
|
cascadeAttenuations.y = mix(1.0, evalShadowCascadeAttenuation(1, offsets, cascadeShadowCoords[1], slopeNdotL), float(isPixelOnCascade.y));
|
||||||
cascadeAttenuations.z = mix(1.0, evalShadowCascadeAttenuation(2, offsets, cascadeShadowCoords[2], oneMinusNdotL), float(isPixelOnCascade.z));
|
cascadeAttenuations.z = mix(1.0, evalShadowCascadeAttenuation(2, offsets, cascadeShadowCoords[2], slopeNdotL), float(isPixelOnCascade.z));
|
||||||
cascadeAttenuations.w = mix(1.0, evalShadowCascadeAttenuation(3, offsets, cascadeShadowCoords[3], oneMinusNdotL), float(isPixelOnCascade.w));
|
cascadeAttenuations.w = mix(1.0, evalShadowCascadeAttenuation(3, offsets, cascadeShadowCoords[3], slopeNdotL), float(isPixelOnCascade.w));
|
||||||
|
|
||||||
cascadeWeights.x = evalShadowCascadeWeight(cascadeShadowCoords[0]);
|
cascadeWeights.x = evalShadowCascadeWeight(cascadeShadowCoords[0]);
|
||||||
cascadeWeights.y = evalShadowCascadeWeight(cascadeShadowCoords[1]);
|
cascadeWeights.y = evalShadowCascadeWeight(cascadeShadowCoords[1]);
|
||||||
|
|
Loading…
Reference in a new issue