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. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] https://lists.blender.org/mailman/listinfo/bf-blender-cvs
