diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-09-02 02:42:34 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-09-10 04:09:45 +0300 |
commit | f46b908cc5e62049e911d963303d36c4ab4e3a64 (patch) | |
tree | 3877d1cbc692f4e2961143ca461e02b3a9a7b7a0 /source/blender/draw | |
parent | 32e96448b9d08b7975f6afd73b2569a6b81a125e (diff) |
Eevee: Expose Shadow filter size.
Diffstat (limited to 'source/blender/draw')
5 files changed, 11 insertions, 5 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c index 20d46619787..b70cfcb01dc 100644 --- a/source/blender/draw/engines/eevee/eevee_lights.c +++ b/source/blender/draw/engines/eevee/eevee_lights.c @@ -754,6 +754,7 @@ void EEVEE_draw_shadows(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl) srd->shadow_inv_samples_ct = 1.0f / srd->shadow_samples_ct; srd->clip_near = la->clipsta; srd->clip_far = la->clipend; + srd->filter_size = la->soft * 0.0005f; copy_v3_v3(srd->position, ob->obmat[3]); for (int j = 0; j < 6; j++) { float tmp[4][4]; diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index 1507e8be08e..724764b5291 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -231,6 +231,7 @@ typedef struct EEVEE_ShadowRender { float clip_far; float shadow_samples_ct; float shadow_inv_samples_ct; + float filter_size; } EEVEE_ShadowRender; /* ************ VOLUME DATA ************ */ diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl index 713fb2a31d5..97ee6bccafc 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl @@ -25,6 +25,7 @@ layout(std140) uniform shadow_render_block { float farClip; float shadowSampleCount; float shadowInvSampleCount; + float shadowFilterSize; }; flat in int shFace; /* Shadow layer we are rendering to. */ diff --git a/source/blender/draw/engines/eevee/shaders/shadow_geom.glsl b/source/blender/draw/engines/eevee/shaders/shadow_geom.glsl index 508df7a6b37..4eafef05082 100644 --- a/source/blender/draw/engines/eevee/shaders/shadow_geom.glsl +++ b/source/blender/draw/engines/eevee/shaders/shadow_geom.glsl @@ -9,6 +9,7 @@ layout(std140) uniform shadow_render_block { float farClip; float shadowSampleCount; float shadowInvSampleCount; + float shadowFilterSize; }; layout(triangles) in; diff --git a/source/blender/draw/engines/eevee/shaders/shadow_store_frag.glsl b/source/blender/draw/engines/eevee/shaders/shadow_store_frag.glsl index 9a7161660f7..61a26d999b7 100644 --- a/source/blender/draw/engines/eevee/shaders/shadow_store_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/shadow_store_frag.glsl @@ -9,6 +9,7 @@ layout(std140) uniform shadow_render_block { float farClip; float shadowSampleCount; float shadowInvSampleCount; + float shadowFilterSize; }; #ifdef CSM @@ -35,12 +36,13 @@ vec3 octahedral_to_cubemap_proj(vec2 co) void make_orthonormal_basis(vec3 N, float rot, out vec3 T, out vec3 B) { - vec3 UpVector = (abs(N.z) < max(abs(N.x), abs(N.y))) ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); + vec3 UpVector = (abs(N.z) < 0.999) ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); vec3 nT = normalize(cross(UpVector, N)); vec3 nB = cross(N, nT); /* Rotate tangent space */ - vec2 dir = vec2(cos(rot * 3.1415 * 2.0), sin(rot * 3.1415 * 2.0)); + float angle = rot * 3.1415 * 2.0; + vec2 dir = vec2(cos(angle), sin(angle)); T = dir.x * nT + dir.y * nB; B = -dir.y * nT + dir.x * nB; } @@ -138,7 +140,7 @@ void main() { uvs.xy = fract(uvs.xy); /* get cubemap vector */ - vec3 cubevec = octahedral_to_cubemap_proj(uvs.xy); + vec3 cubevec = normalize(octahedral_to_cubemap_proj(uvs.xy)); /* TODO Can be optimized by groupping fetches * and by converting to radial distance beforehand. */ @@ -146,8 +148,8 @@ void main() { vec3 T, B; make_orthonormal_basis(cubevec, wang_hash_noise(0u), T, B); - T *= 0.01; - B *= 0.01; + T *= shadowFilterSize; + B *= shadowFilterSize; #ifdef ESM float accum = 0.0; |