diff options
Diffstat (limited to 'source/blender/draw/engines/workbench/shaders')
4 files changed, 30 insertions, 8 deletions
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl index d0b1c580e5f..c826a5b82fa 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl @@ -8,4 +8,6 @@ struct WorldData { vec4 background_color_low; vec4 background_color_high; vec4 object_outline_color; + vec4 light_direction_vs; + float specular_sharpness; }; diff --git a/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl index 35867a566f1..525b934d3be 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl @@ -10,7 +10,6 @@ uniform float lightMultiplier; uniform float shadowShift = 0.1; uniform mat3 normalWorldMatrix; -uniform vec3 lightDirection; /* light direction in view space */ layout(std140) uniform world_block { WorldData world_data; @@ -57,14 +56,17 @@ void main() #ifdef V3D_LIGHTING_STUDIO -#ifdef STUDIOLIGHT_ORIENTATION_CAMERA + #ifdef STUDIOLIGHT_ORIENTATION_CAMERA vec3 diffuse_light = get_camera_diffuse_light(world_data, normal_viewport); -#endif -#ifdef STUDIOLIGHT_ORIENTATION_WORLD + #endif + + #ifdef STUDIOLIGHT_ORIENTATION_WORLD vec3 normal_world = normalWorldMatrix * normal_viewport; vec3 diffuse_light = get_world_diffuse_light(world_data, normal_world); -#endif - vec3 shaded_color = diffuse_light * diffuse_color.rgb; + #endif + + vec3 specular_color = get_world_specular_light(world_data, normal_viewport, vec3(0.0, 0.0, 1.0)); + vec3 shaded_color = diffuse_light * diffuse_color.rgb + specular_color; #else /* V3D_LIGHTING_STUDIO */ vec3 shaded_color = diffuse_color.rgb; @@ -72,7 +74,7 @@ void main() #endif /* V3D_LIGHTING_STUDIO */ #ifdef V3D_SHADING_SHADOW - float shadow_mix = step(-shadowShift, dot(normal_viewport, lightDirection)); + float shadow_mix = step(-shadowShift, dot(normal_viewport, world_data.light_direction_vs.xyz)); float light_multiplier; light_multiplier = mix(lightMultiplier, shadowMultiplier, shadow_mix); diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl index 309ae063284..6585bac9289 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl @@ -36,7 +36,9 @@ void main() vec3 normal_world = normalWorldMatrix * normal_viewport; vec3 diffuse_light = get_world_diffuse_light(world_data, normal_world); #endif - vec3 shaded_color = diffuse_light * diffuse_color.rgb; + + vec3 specular_color = get_world_specular_light(world_data, normal_viewport, vec3(0.0, 0.0, 1.0)); + vec3 shaded_color = diffuse_light * diffuse_color.rgb + specular_color; #else /* V3D_LIGHTING_STUDIO */ vec3 shaded_color = diffuse_color.rgb; diff --git a/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl index 6507f1ec707..7e476080b64 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl @@ -18,3 +18,19 @@ vec3 get_camera_diffuse_light(WorldData world_data, vec3 N) result = mix(result, world_data.diffuse_light_y_neg, clamp(-N.z, 0.0, 1.0)); return result.xyz; } + +/* N And I are in View Space. */ +vec3 get_world_specular_light(WorldData world_data, vec3 N, vec3 I) +{ +#ifdef V3D_SHADING_SPECULAR_HIGHLIGHTS + vec3 reflection_vector = reflect(I, N); + vec3 specular_light = vec3(1.0); + /* Simple frontal specular highlights. */ + float specular_influence = pow(max(0.0, dot(world_data.light_direction_vs.xyz, reflection_vector)), world_data.specular_sharpness); + vec3 specular_color = specular_light * specular_influence; + +#else /* V3D_SHADING_SPECULAR_HIGHLIGHTS */ + vec3 specular_color = vec3(0.0); +#endif /* V3D_SHADING_SPECULAR_HIGHLIGHTS */ + return specular_color; +} |