Shadowmap size cleanup

This commit is contained in:
unknown 2018-12-28 13:31:43 +01:00
parent aeeb7512a9
commit 87a895d3b6
5 changed files with 31 additions and 15 deletions

View file

@ -79,7 +79,7 @@ uniform mat4 invVP;
#endif
#ifdef _SMSizeUniform
uniform vec2 smSizeUniform;
//!uniform vec2 smSizeUniform;
#endif
#ifdef _LTC
@ -305,10 +305,10 @@ void main() {
#ifdef _ShadowMap
// if (lightShadow == 1) {
#ifdef _CSM
svisibility = shadowTestCascade(shadowMap, eye, p + n * shadowsBias * 10, shadowsBias, shadowmapSize * vec2(shadowmapCascades, 1.0));
svisibility = shadowTestCascade(shadowMap, eye, p + n * shadowsBias * 10, shadowsBias);
#else
vec4 lPos = LWVP * vec4(p + n * shadowsBias * 100, 1.0);
if (lPos.w > 0.0) svisibility = shadowTest(shadowMap, lPos.xyz / lPos.w, shadowsBias, shadowmapSize);
if (lPos.w > 0.0) svisibility = shadowTest(shadowMap, lPos.xyz / lPos.w, shadowsBias);
#endif
// }
#endif

View file

@ -63,24 +63,24 @@ vec3 sampleLight(const vec3 p, const vec3 n, const vec3 v, const float dotNV, co
#ifdef _ShadowMap
#ifdef _SinglePoint
vec4 lPos = LWVPSpot0 * vec4(p + n * bias * 10, 1.0);
direct *= shadowTest(shadowMapSpot[0], lPos.xyz / lPos.w, bias, shadowmapSize);
direct *= shadowTest(shadowMapSpot[0], lPos.xyz / lPos.w, bias);
#endif
#ifdef _Clusters
if (index == 0) {
vec4 lPos = LWVPSpot0 * vec4(p + n * bias * 10, 1.0);
direct *= shadowTest(shadowMapSpot[0], lPos.xyz / lPos.w, bias, shadowmapSize);
direct *= shadowTest(shadowMapSpot[0], lPos.xyz / lPos.w, bias);
}
else if (index == 1) {
vec4 lPos = LWVPSpot1 * vec4(p + n * bias * 10, 1.0);
direct *= shadowTest(shadowMapSpot[1], lPos.xyz / lPos.w, bias, shadowmapSize);
direct *= shadowTest(shadowMapSpot[1], lPos.xyz / lPos.w, bias);
}
else if (index == 2) {
vec4 lPos = LWVPSpot2 * vec4(p + n * bias * 10, 1.0);
direct *= shadowTest(shadowMapSpot[2], lPos.xyz / lPos.w, bias, shadowmapSize);
direct *= shadowTest(shadowMapSpot[2], lPos.xyz / lPos.w, bias);
}
else if (index == 3) {
vec4 lPos = LWVPSpot3 * vec4(p + n * bias * 10, 1.0);
direct *= shadowTest(shadowMapSpot[3], lPos.xyz / lPos.w, bias, shadowmapSize);
direct *= shadowTest(shadowMapSpot[3], lPos.xyz / lPos.w, bias);
}
#endif
#endif

View file

@ -7,6 +7,10 @@
uniform vec4 casData[shadowmapCascades * 4 + 4];
#endif
#ifdef _SMSizeUniform
uniform vec2 smSizeUniform;
#endif
float PCF(sampler2DShadow shadowMap, const vec2 uv, const float compare, const vec2 smSize) {
float result = texture(shadowMap, vec3(uv + (vec2(-1.0, -1.0) / smSize), compare));
result += texture(shadowMap, vec3(uv + (vec2(-1.0, 0.0) / smSize), compare));
@ -43,7 +47,12 @@ float PCFCube(samplerCubeShadow shadowMapCube, const vec3 lp, vec3 ml, const flo
return result / 9.0;
}
float shadowTest(sampler2DShadow shadowMap, const vec3 lPos, const float shadowsBias, const vec2 smSize) {
float shadowTest(sampler2DShadow shadowMap, const vec3 lPos, const float shadowsBias) {
#ifdef _SMSizeUniform
vec2 smSize = smSizeUniform;
#else
const vec2 smSize = shadowmapSize;
#endif
if (lPos.x < 0.0 || lPos.y < 0.0 || lPos.x > 1.0 || lPos.y > 1.0) return 1.0;
return PCF(shadowMap, lPos.xy, lPos.z - shadowsBias, smSize);
}
@ -81,7 +90,12 @@ mat4 getCascadeMat(const float d, out int casi, out int casIndex) {
// ..
}
float shadowTestCascade(sampler2DShadow shadowMap, const vec3 eye, const vec3 p, const float shadowsBias, const vec2 smSize) {
float shadowTestCascade(sampler2DShadow shadowMap, const vec3 eye, const vec3 p, const float shadowsBias) {
#ifdef _SMSizeUniform
vec2 smSize = smSizeUniform * vec2(shadowmapCascades, 1.0);
#else
const vec2 smSize = shadowmapSize * vec2(shadowmapCascades, 1.0);
#endif
const int c = shadowmapCascades;
float d = distance(eye, p);
@ -90,9 +104,10 @@ float shadowTestCascade(sampler2DShadow shadowMap, const vec3 eye, const vec3 p,
mat4 LWVP = getCascadeMat(d, casi, casIndex);
vec4 lPos = LWVP * vec4(p, 1.0);
lPos.xyz /= lPos.w;
float visibility = 1.0;
if (lPos.w > 0.0) visibility = shadowTest(shadowMap, lPos.xyz / lPos.w, shadowsBias, smSize);
if (lPos.w > 0.0) visibility = PCF(shadowMap, lPos.xy, lPos.z - shadowsBias, smSize);
// Blend cascade
// https://github.com/TheRealMJP/Shadows
@ -109,8 +124,9 @@ float shadowTestCascade(sampler2DShadow shadowMap, const vec3 eye, const vec3 p,
casData[casIndex2 + 3]);
vec4 lPos2 = LWVP2 * vec4(p, 1.0);
lPos2.xyz /= lPos2.w;
float visibility2 = 1.0;
if (lPos2.w > 0.0) visibility2 = shadowTest(shadowMap, lPos2.xyz / lPos2.w, shadowsBias, smSize);
if (lPos2.w > 0.0) visibility2 = PCF(shadowMap, lPos2.xy, lPos2.z - shadowsBias, smSize);
float lerpAmt = smoothstep(0.0, blendThres, splitDist);
return mix(visibility2, visibility, lerpAmt);

View file

@ -79,7 +79,7 @@ class Inc {
if (rt == null) {
if (path.light.data.raw.shadowmap_cube) {
// Cubemap size
var size = Std.int(path.light.data.raw.shadowmap_size);
var size = path.light.data.raw.shadowmap_size;
var t = new RenderTargetRaw();
t.name = target;
t.width = size;

View file

@ -182,12 +182,12 @@ class Cycles {
if (frag.n) {
vert.add_uniform('mat3 N', '_normalMatrix');
vert.add_out('vec3 wnormal');
vert.write_attrib('wnormal = N * nor;');
vert.write_attrib('wnormal = N * vec3(nor.xy, pos.w);');
frag.write_attrib('vec3 n = normalize(wnormal);');
}
else if (vert.n) {
vert.add_uniform('mat3 N', '_normalMatrix');
vert.write_attrib('vec3 wnormal = normalize(N * nor);');
vert.write_attrib('vec3 wnormal = normalize(N * vec3(nor.xy, pos.w));');
}
if (frag.dotNV) {
frag.write_attrib('float dotNV = max(dot(n, vVec), 0.0);');