Shadowmap size cleanup
This commit is contained in:
parent
aeeb7512a9
commit
87a895d3b6
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);');
|
||||
|
|
Loading…
Reference in a new issue