[Bf-blender-cvs] [35220ccde0c] blender2.8: Silhouette Overlap Overlay

Jeroen Bakker noreply at git.blender.org
Wed Apr 25 11:17:56 CEST 2018


Commit: 35220ccde0cf77ee11f01ebd2c3d7b3f60d72903
Author: Jeroen Bakker
Date:   Wed Apr 25 10:59:48 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB35220ccde0cf77ee11f01ebd2c3d7b3f60d72903

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

===================================================================

M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/draw/CMakeLists.txt
D	source/blender/draw/engines/workbench/shaders/solid_flat_frag.glsl
D	source/blender/draw/engines/workbench/shaders/solid_studio_frag.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_background_lib.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
D	source/blender/draw/engines/workbench/shaders/workbench_diffuse_lib.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_object_overlap_lib.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
R100	source/blender/draw/engines/workbench/shaders/workbench_studio_vert.glsl	source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
D	source/blender/draw/engines/workbench/shaders/workbench_vert.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl
D	source/blender/draw/engines/workbench/solid_flat_mode.c
R053	source/blender/draw/engines/workbench/solid_studio_mode.c	source/blender/draw/engines/workbench/solid_mode.c
M	source/blender/draw/engines/workbench/workbench_engine.c
M	source/blender/draw/engines/workbench/workbench_engine.h
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/intern/draw_manager_texture.c
M	source/blender/draw/modes/overlay_mode.c
M	source/blender/gpu/GPU_texture.h
M	source/blender/gpu/intern/gpu_texture.c
M	source/blender/makesdna/DNA_view3d_types.h
M	source/blender/makesrna/intern/rna_layer.c
M	source/blender/makesrna/intern/rna_space.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 1300f2c1350..678974c3b4e 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3534,6 +3534,10 @@ class VIEW3D_PT_view3d_display(Panel):
         col.prop(view, "show_only_render")
         col.prop(view, "show_world")
 
+        if view.viewport_shade == "SOLID":
+            col.prop(view, "show_random_object_colors")
+            col.prop(view, "show_object_overlap")
+
         if context.mode in {'PAINT_WEIGHT', 'PAINT_VERTEX', 'PAINT_TEXTURE'}:
             col.prop(view, "show_mode_shade_override")
 
@@ -3544,7 +3548,6 @@ class VIEW3D_PT_view3d_display(Panel):
         col.prop(view, "show_all_objects_origin")
         col.prop(view, "show_relationship_lines")
         col.prop(view, "show_face_orientation_overlay")
-        col.prop(view, "show_random_object_colors")
 
         col = layout.column()
         col.active = display_all
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 22106c55bda..f0687b543b2 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -107,8 +107,7 @@ set(SRC
 	engines/eevee/eevee_volumes.c
 	engines/workbench/workbench_engine.c
 	engines/workbench/workbench_materials.c
-	engines/workbench/solid_flat_mode.c
-	engines/workbench/solid_studio_mode.c
+	engines/workbench/solid_mode.c
 	engines/external/external_engine.c
 
 	DRW_engine.h
@@ -209,11 +208,13 @@ data_to_c_simple(engines/eevee/shaders/volumetric_resolve_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/volumetric_scatter_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/volumetric_integration_frag.glsl SRC)
 
-data_to_c_simple(engines/workbench/shaders/solid_flat_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/solid_studio_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_diffuse_lib.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_vert.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_studio_vert.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_prepass_vert.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_prepass_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_composite_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_background_lib.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_data_lib.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_object_overlap_lib.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_world_light_lib.glsl SRC)
 
 data_to_c_simple(modes/shaders/common_globals_lib.glsl SRC)
 data_to_c_simple(modes/shaders/common_view_lib.glsl SRC)
diff --git a/source/blender/draw/engines/workbench/shaders/solid_flat_frag.glsl b/source/blender/draw/engines/workbench/shaders/solid_flat_frag.glsl
deleted file mode 100644
index 3a6700bdadc..00000000000
--- a/source/blender/draw/engines/workbench/shaders/solid_flat_frag.glsl
+++ /dev/null
@@ -1,8 +0,0 @@
-uniform vec3 color;
-
-out vec4 fragColor;
-
-void main()
-{
-	fragColor = vec4(color, 1.0);
-}
diff --git a/source/blender/draw/engines/workbench/shaders/solid_studio_frag.glsl b/source/blender/draw/engines/workbench/shaders/solid_studio_frag.glsl
deleted file mode 100644
index 96e65e2919e..00000000000
--- a/source/blender/draw/engines/workbench/shaders/solid_studio_frag.glsl
+++ /dev/null
@@ -1,29 +0,0 @@
-uniform vec3 color;
-uniform vec3 light_direction = vec3(0.0, 0.0, 1.0);
-
-uniform vec3 world_diffuse_light_xp = vec3(0.5, 0.5, 0.6);
-uniform vec3 world_diffuse_light_xn = vec3(0.5, 0.5, 0.6);
-uniform vec3 world_diffuse_light_yp = vec3(0.5, 0.5, 0.6);
-uniform vec3 world_diffuse_light_yn = vec3(0.5, 0.5, 0.6);
-uniform vec3 world_diffuse_light_zp = vec3(0.8, 0.8, 0.8);
-uniform vec3 world_diffuse_light_zn = vec3(0.0, 0.0, 0.0);
-
-in vec3 normal_viewport;
-out vec4 fragColor;
-#define USE_WORLD_DIFFUSE
-#define AMBIENT_COLOR vec3(0.2, 0.2, 0.2)
-
-void main()
-{
-
-#ifdef USE_WORLD_DIFFUSE
-	vec3 diffuse_light_color = get_world_diffuse_light(normal_viewport, world_diffuse_light_xp, world_diffuse_light_xn, world_diffuse_light_yp, world_diffuse_light_yn, world_diffuse_light_zp, world_diffuse_light_zn);
-	vec3 shaded_color = (AMBIENT_COLOR + diffuse_light_color)  * color;
-
-#else
-	float intensity = lambert_diffuse(light_direction, normal_viewport);
-	vec3 shaded_color = color * intensity;
-
-#endif
-	fragColor = vec4(shaded_color, 1.0);
-}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_background_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_background_lib.glsl
new file mode 100644
index 00000000000..fb8c8fb95e4
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_background_lib.glsl
@@ -0,0 +1,3 @@
+vec3 background_color(WorldData world_data, float y) {
+	return mix(world_data.background_color_low, world_data.background_color_high, y).xyz;
+}
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);
+}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
new file mode 100644
index 00000000000..11497778fa4
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
@@ -0,0 +1,10 @@
+struct WorldData {
+	vec4 diffuse_light_xp;
+	vec4 diffuse_light_xn;
+	vec4 diffuse_light_yp;
+	vec4 diffuse_light_yn;
+	vec4 diffuse_light_zp;
+	vec4 diffuse_light_zn;
+	vec4 background_color_low;
+	vec4 background_color_high;
+};
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_diffuse_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_diffuse_lib.glsl
deleted file mode 100644
index ab060745060..00000000000
--- a/source/blender/draw/engines/workbench/shaders/workbench_diffuse_lib.glsl
+++ /dev/null
@@ -1,21 +0,0 @@
-float normalized_dot(vec3 v1, vec3 v2)
-{
-	return max(0.0, dot(v1, v2));
-}
-
-float lambert_diffuse(vec3 light_direction, vec3 surface_normal)
-{
-	return normalized_dot(light_direction, surface_normal);
-}
-
-vec3 get_world_diffuse_light(vec3 N, vec3 xp, vec3 xn, vec3 yp, vec3 yn, vec3 zp, vec3 zn)
-{
-	vec3 result = vec3(0.0, 0.0, 0.0);
-	result = mix(result, xp, normalized_dot(vec3( 1.0,  0.0,  0.0), N));
-	result = mix(result, xn, normalized_dot(vec3(-1.0,  0.0,  0.0), N));
-	result = mix(result, yp, normalized_dot(vec3( 0.0,  1.0,  0.0), N));
-	result = mix(result, yn, normalized_dot(vec3( 0.0, -1.0,  0.0), N));
-	result = mix(result, zp, normalized_dot(vec3( 0.0,  0.0,  1.0), N));
-	result = mix(result, zn, normalized_dot(vec3( 0.0,  0.0, -1.0), N));
-	return result;
-}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_object_overlap_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_object_overlap_lib.glsl
new file mode 100644
index 00000000000..f4c7c896d17
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_object_overlap_lib.glsl
@@ -0,0 +1,13 @@
+#define OBJECT_OVERLAP_OFFSET 1
+#define NO_OBJECT_ID uint(0)
+
+float calculate_object_overlap(usampler2D objectId, ivec2 texel, uint object_id)
+{
+	uvec4 oid_offset = uvec4(
+	    texelFetchOffset(objectId, texel, 0, ivec2(0,  OBJECT_OVERLAP_OFFSET)).r,
+	    texelFetchOffset(objectId, texel, 0, ivec2(0, -OBJECT_OVERLAP_OFFSET)).r,
+	    texelFetchOffset(objectId, texel, 0, ivec2(-OBJECT_OVERLAP_OFFSET, 0)).r,
+	    texelFetchOffset(objectId, texel, 0, ivec2( OBJECT_OVERLAP_OFFSET, 0)).r);
+
+	return dot(vec4(equal(uvec4(object_id), oid_offset)), vec4(1.0/4.0));
+}
\ No newline at end of file
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
new file mode 100644
index 00000000000..208c684f722
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -0,0 +1,15 @@
+uniform int object_id = 0;
+uniform vec3 object_color = vec3(1.0, 0.0, 1.0);
+
+in vec3 normal_viewport;
+
+out uint objectId;
+ou

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list