diff options
author | Jeroen Bakker <j.bakker@atmind.nl> | 2018-05-15 16:19:57 +0300 |
---|---|---|
committer | Jeroen Bakker <j.bakker@atmind.nl> | 2018-05-15 16:40:12 +0300 |
commit | 197af58baab1c1be7e6f371a829b31f5c1098a73 (patch) | |
tree | 34a454ee49cfa782178ff06095154599b3732002 /source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl | |
parent | 4d5b7696cbf8b4452dbc04200cb7cd188373f19a (diff) |
Workbench: Cleaner Shadow edges own shadow
Diffstat (limited to 'source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl')
-rw-r--r-- | source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl index 7f7e8f9c69c..09bdffe3299 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl @@ -7,6 +7,10 @@ uniform sampler2D normalBuffer; uniform vec2 invertedViewportSize; uniform vec3 objectOverlapColor = vec3(0.0); uniform float shadowMultiplier; +uniform float lightMultiplier; +uniform float shadowShift = 0.1; + +uniform vec3 lightDirection; /* light direction in view space */ layout(std140) uniform world_block { WorldData world_data; @@ -38,29 +42,42 @@ void main() } #endif /* !V3D_SHADING_OBJECT_OVERLAP */ - -#ifdef V3D_LIGHTING_STUDIO vec4 diffuse_color = texelFetch(colorBuffer, texel, 0); +/* Do we need normals */ +#ifdef NORMAL_VIEWPORT_PASS_ENABLED #ifdef WORKBENCH_ENCODE_NORMALS vec3 normal_viewport = normal_decode(texelFetch(normalBuffer, texel, 0).rg); if (diffuse_color.a == 1.0) { - normal_viewport = - normal_viewport; + normal_viewport = -normal_viewport; } #else /* WORKBENCH_ENCODE_NORMALS */ vec3 normal_viewport = texelFetch(normalBuffer, texel, 0).rgb; #endif /* WORKBENCH_ENCODE_NORMALS */ +#endif + + +#ifdef V3D_LIGHTING_STUDIO vec3 diffuse_light = get_world_diffuse_light(world_data, normal_viewport); - vec3 shaded_color = diffuse_light * diffuse_color.rgb * (1.0 - shadowMultiplier); + vec3 shaded_color = diffuse_light * diffuse_color.rgb; #else /* V3D_LIGHTING_STUDIO */ - vec3 diffuse_color = texelFetch(colorBuffer, texel, 0).rgb; - vec3 shaded_color = diffuse_color * (1.0 - shadowMultiplier); + vec3 shaded_color = diffuse_color.rgb; + #endif /* V3D_LIGHTING_STUDIO */ +#ifdef V3D_SHADING_SHADOW + float shadow_mix = step(-shadowShift, dot(normal_viewport, lightDirection)); + float light_multiplier; + light_multiplier = mix(lightMultiplier, shadowMultiplier, shadow_mix); + +#else /* V3D_SHADING_SHADOW */ + float light_multiplier = 1.0; +#endif /* V3D_SHADING_SHADOW */ + + shaded_color *= light_multiplier; #ifdef V3D_SHADING_OBJECT_OVERLAP shaded_color = mix(objectOverlapColor, shaded_color, object_overlap); #endif /* V3D_SHADING_OBJECT_OVERLAP */ - fragColor = vec4(shaded_color, 1.0); } |