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:
authorClément Foucault <foucault.clem@gmail.com>2018-06-10 16:30:49 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-06-10 21:06:26 +0300
commit95894421cb4e9ccabb4cff393b561625b9bc4280 (patch)
treedb343a83b911d7fe2ca2f1d4d7c9814598e19530 /source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl
parentb23d5132a90a0e8360a20199c8e7bb45174987c4 (diff)
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.
Diffstat (limited to 'source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl')
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl35
1 files changed, 14 insertions, 21 deletions
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);
}