Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <j.bakker@atmind.nl>2018-05-15 16:19:57 +0300
committerJeroen Bakker <j.bakker@atmind.nl>2018-05-15 16:40:12 +0300
commit197af58baab1c1be7e6f371a829b31f5c1098a73 (patch)
tree34a454ee49cfa782178ff06095154599b3732002 /source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
parent4d5b7696cbf8b4452dbc04200cb7cd188373f19a (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.glsl31
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);
}