From 95894421cb4e9ccabb4cff393b561625b9bc4280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sun, 10 Jun 2018 15:30:49 +0200 Subject: Workbench: Xray: Optimize and fix implementation. There was a method explained in the Weighted Blended Order-Independent Transparency paper to support hardware that does not support per render target blending function. So now only 2 geometry passes are required instead of 3 (one being the outline/depth fill pass). This also fix how the blending is done. There was some premult confusion in the implementation. --- .../shaders/workbench_forward_composite_frag.glsl | 35 +++++++++------------- 1 file changed, 14 insertions(+), 21 deletions(-) (limited to 'source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl') diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl index f335e1a15bd..1d9f37274bd 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl @@ -2,9 +2,7 @@ out vec4 fragColor; uniform usampler2D objectId; uniform sampler2D transparentAccum; -#ifdef WORKBENCH_REVEALAGE_ENABLED uniform sampler2D transparentRevealage; -#endif uniform vec2 invertedViewportSize; layout(std140) uniform world_block { @@ -16,29 +14,24 @@ void main() ivec2 texel = ivec2(gl_FragCoord.xy); vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize; uint object_id = texelFetch(objectId, texel, 0).r; - vec4 transparent_accum = texelFetch(transparentAccum, texel, 0); -#ifdef WORKBENCH_REVEALAGE_ENABLED - float transparent_revealage = texelFetch(transparentRevealage, texel, 0).r; -#endif - vec4 color; - vec4 bg_color; + + /* Listing 4 */ + vec4 trans_accum = texelFetch(transparentAccum, texel, 0); + float trans_revealage = trans_accum.a; + trans_accum.a = texelFetch(transparentRevealage, texel, 0).r; #ifdef V3D_SHADING_OBJECT_OUTLINE float outline = calculate_object_outline(objectId, texel, object_id); #else /* V3D_SHADING_OBJECT_OUTLINE */ float outline = 1.0; #endif /* V3D_SHADING_OBJECT_OUTLINE */ - bg_color = vec4(background_color(world_data, uv_viewport.y), 0.0); - if (object_id == NO_OBJECT_ID) { - color = bg_color; - } else { -#ifdef WORKBENCH_REVEALAGE_ENABLED - color = vec4((transparent_accum.xyz / max(transparent_accum.a, EPSILON)) * (1.0 - transparent_revealage), 1.0); - color = mix(bg_color, color, clamp(1.0 - transparent_revealage, 0.0, 1.0)); -#else - color = vec4(transparent_accum.xyz / max(transparent_accum.a, EPSILON), 1.0); -#endif - } - - fragColor = vec4(mix(world_data.object_outline_color.rgb, color.xyz, outline), 1.0); + vec3 bg_color = background_color(world_data, uv_viewport.y); + + /* TODO: Bypass the whole shader if there is no xray pass and no outline pass. */ + vec3 trans_color = trans_accum.rgb / clamp(trans_accum.a, 1e-4, 5e4); + vec3 color = mix(trans_color, bg_color, trans_revealage); + + color = mix(world_data.object_outline_color.rgb, color, outline); + + fragColor = vec4(color, 1.0); } -- cgit v1.2.3