diff options
Diffstat (limited to 'source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl')
-rw-r--r-- | source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl | 63 |
1 files changed, 46 insertions, 17 deletions
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 269911189fa..461fb2fb130 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 @@ -1,16 +1,24 @@ out vec4 fragColor; +uniform mat4 ProjectionMatrix; + uniform usampler2D objectId; uniform sampler2D colorBuffer; uniform sampler2D specularBuffer; uniform sampler2D normalBuffer; /* normalBuffer contains viewport normals */ +uniform sampler2D cavityBuffer; + uniform vec2 invertedViewportSize; +uniform vec4 viewvecs[3]; uniform float shadowMultiplier; uniform float lightMultiplier; uniform float shadowShift = 0.1; uniform mat3 normalWorldMatrix; +#ifdef STUDIOLIGHT_ORIENTATION_VIEWNORMAL +uniform sampler2D matcapImage; +#endif layout(std140) uniform world_block { WorldData world_data; @@ -43,47 +51,68 @@ void main() #endif /* !V3D_SHADING_OBJECT_OUTLINE */ vec4 diffuse_color = texelFetch(colorBuffer, texel, 0); + /* Do we need normals */ #ifdef NORMAL_VIEWPORT_PASS_ENABLED -#ifdef WORKBENCH_ENCODE_NORMALS +# ifdef WORKBENCH_ENCODE_NORMALS vec3 normal_viewport = normal_decode(texelFetch(normalBuffer, texel, 0).rg); - if (diffuse_color.a == 1.0) { + if (diffuse_color.a == 0.0) { normal_viewport = -normal_viewport; } -#else /* WORKBENCH_ENCODE_NORMALS */ +# else /* WORKBENCH_ENCODE_NORMALS */ vec3 normal_viewport = texelFetch(normalBuffer, texel, 0).rgb; -#endif /* WORKBENCH_ENCODE_NORMALS */ +# endif /* WORKBENCH_ENCODE_NORMALS */ +#endif + + vec3 I_vs = view_vector_from_screen_uv(uv_viewport, viewvecs, ProjectionMatrix); + +#ifdef STUDIOLIGHT_ORIENTATION_VIEWNORMAL + bool flipped = world_data.matcap_orientation != 0; + vec2 matcap_uv = matcap_uv_compute(I_vs, normal_viewport, flipped); + diffuse_color = textureLod(matcapImage, matcap_uv, 0.0); #endif #ifdef V3D_SHADING_SPECULAR_HIGHLIGHT - /* XXX Should calculate the correct VS Incoming direction */ - vec3 I_vs = vec3(0.0, 0.0, 1.0); vec4 specular_data = texelFetch(specularBuffer, texel, 0); vec3 specular_color = get_world_specular_lights(world_data, specular_data, normal_viewport, I_vs); #else vec3 specular_color = vec3(0.0); #endif +#ifdef V3D_LIGHTING_FLAT + vec3 diffuse_light = vec3(1.0); +#endif + +#ifdef V3D_LIGHTING_MATCAP + vec3 diffuse_light = texelFetch(specularBuffer, texel, 0).rgb; +#endif + #ifdef V3D_LIGHTING_STUDIO - #ifdef STUDIOLIGHT_ORIENTATION_CAMERA +# ifdef STUDIOLIGHT_ORIENTATION_CAMERA vec3 diffuse_light = get_camera_diffuse_light(world_data, normal_viewport); - #endif +# endif - #ifdef STUDIOLIGHT_ORIENTATION_WORLD +# ifdef STUDIOLIGHT_ORIENTATION_WORLD vec3 normal_world = normalWorldMatrix * normal_viewport; vec3 diffuse_light = get_world_diffuse_light(world_data, normal_world); - #endif +# endif +#endif vec3 shaded_color = diffuse_light * diffuse_color.rgb + specular_color; -#else /* V3D_LIGHTING_STUDIO */ - vec3 shaded_color = diffuse_color.rgb + specular_color; - -#endif /* V3D_LIGHTING_STUDIO */ +#ifdef V3D_SHADING_CAVITY + vec2 cavity = texelFetch(cavityBuffer, texel, 0).rg; + shaded_color *= 1.0 - cavity.x; + shaded_color *= 1.0 + cavity.y; +#endif #ifdef V3D_SHADING_SHADOW - float shadow_mix = step(-shadowShift, dot(normal_viewport, world_data.light_direction_vs.xyz)); - float light_multiplier; - light_multiplier = mix(lightMultiplier, shadowMultiplier, shadow_mix); + float light_factor = -dot(normal_viewport, world_data.light_direction_vs.xyz); + /* The step function might be ok for meshes but it's + * clearly not the case for hairs. Do smoothstep in this case. */ + float shadow_mix = (diffuse_color.a == 1.0 || diffuse_color.a == 0.0) + ? step(-shadowShift, -light_factor) + : smoothstep(1.0, shadowShift, light_factor); + float light_multiplier = mix(lightMultiplier, shadowMultiplier, shadow_mix); #else /* V3D_SHADING_SHADOW */ float light_multiplier = 1.0; |