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-04-25 11:59:48 +0300
committerJeroen Bakker <j.bakker@atmind.nl>2018-04-25 12:09:49 +0300
commit35220ccde0cf77ee11f01ebd2c3d7b3f60d72903 (patch)
treeaf5ace5652995b3b355286639a5b67e784859f33 /source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
parentfc8d9030000aa77dc26b8ff4c442672894e28ffc (diff)
Silhouette Overlap Overlay
Added Object Overlap Overlay - Added R32UI support to GPU_framebuffer - Added R32U support to draw manager - The overlay mode has a object data pass that will render 'needed' data to specific buffers so we can mix them together via a deferred rendering. In future will also add UV's and other data - Overlap is implemented as an overlay so it could be used on top of the Scene lighted Solid mode (that will be rendered by Eevee. Reviewers: fclem, brecht Reviewed By: fclem Subscribers: sergey Tags: #code_quest Maniphest Tasks: T54726 Differential Revision: https://developer.blender.org/D3174
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.glsl59
1 files changed, 59 insertions, 0 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
new file mode 100644
index 00000000000..ccb94f56db8
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
@@ -0,0 +1,59 @@
+out vec4 fragColor;
+
+uniform usampler2D objectId;
+uniform sampler2D depth;
+uniform sampler2D diffuseColor;
+uniform sampler2D normalViewport;
+uniform vec2 invertedViewportSize;
+
+uniform vec3 objectOverlapColor = vec3(0.0);
+
+layout(std140) uniform world_block {
+ WorldData world_data;
+};
+
+
+void main()
+{
+ ivec2 texel = ivec2(gl_FragCoord.xy);
+ vec2 uvViewport = gl_FragCoord.xy * invertedViewportSize;
+ float depth = texelFetch(depth, texel, 0).r;
+
+#ifndef V3D_DRAWOPTION_OBJECT_OVERLAP
+ if (depth == 1.0) {
+ fragColor = vec4(background_color(world_data, uvViewport.y), 0.0);
+ return;
+ }
+#else /* !V3D_DRAWOPTION_OBJECT_OVERLAP */
+ uint object_id = depth == 1.0? NO_OBJECT_ID: texelFetch(objectId, texel, 0).r;
+ float object_overlap = calculate_object_overlap(objectId, texel, object_id);
+
+ if (object_id == NO_OBJECT_ID) {
+ vec3 background = background_color(world_data, uvViewport.y);
+ if (object_overlap == 0.0) {
+ fragColor = vec4(background, 0.0);
+ } else {
+ fragColor = vec4(mix(objectOverlapColor, background, object_overlap), 1.0-object_overlap);
+ }
+ return;
+ }
+#endif /* !V3D_DRAWOPTION_OBJECT_OVERLAP */
+
+ vec3 diffuse_color = texelFetch(diffuseColor, texel, 0).rgb;
+
+#ifdef V3D_LIGHTING_STUDIO
+ vec3 normal_viewport = texelFetch(normalViewport, texel, 0).rgb;
+ vec3 diffuse_light = get_world_diffuse_light(world_data, normal_viewport);
+ vec3 shaded_color = diffuse_light * diffuse_color;
+
+#else /* V3D_LIGHTING_STUDIO */
+ vec3 shaded_color = diffuse_color;
+#endif /* V3D_LIGHTING_STUDIO */
+
+
+#ifdef V3D_DRAWOPTION_OBJECT_OVERLAP
+ shaded_color = mix(objectOverlapColor, shaded_color, object_overlap);
+#endif /* V3D_DRAWOPTION_OBJECT_OVERLAP */
+
+ fragColor = vec4(shaded_color, 1.0);
+}