Commit: 3f95daa31fa98b1bd67fc71835f0011287c1d136 Author: Jeroen Bakker Date: Fri May 4 14:07:00 2018 +0200 Branches: blender2.8 https://developer.blender.org/rB3f95daa31fa98b1bd67fc71835f0011287c1d136
Workbench: Shadows Initial review of the shard shadows in the workbench engine. Speed optimizations like transform feedback are not implemented yet. I first want this part to be reviewed and merged. @fclem please check the note in drw_stencil_set it was holding back nequal == 0 as by default DST.stencil_mask was set to 0. questioin is should we remove the whole check or not. Also I am still looking for a better name (or split the enum) for DRW_STATE_STENCIL_DEPTH_FAIL_INCR_DECR_WRAP Reviewers: fclem Reviewed By: fclem Tags: #code_quest Differential Revision: https://developer.blender.org/D3198 =================================================================== M release/scripts/startup/bl_ui/properties_render.py M release/scripts/startup/bl_ui/space_view3d.py M source/blender/blenloader/intern/versioning_280.c M source/blender/draw/CMakeLists.txt M source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl A source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl A source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl M source/blender/draw/engines/workbench/solid_mode.c M source/blender/draw/engines/workbench/workbench_engine.c 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.h M source/blender/draw/intern/draw_manager_exec.c M source/blender/editors/space_view3d/space_view3d.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/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py index 9a9b973650c..08f19a02ecc 100644 --- a/release/scripts/startup/bl_ui/properties_render.py +++ b/release/scripts/startup/bl_ui/properties_render.py @@ -755,17 +755,7 @@ class RENDER_PT_workbench_environment_light(RenderButtonsPanel, Panel): layout = self.layout scene = context.scene props = scene.layer_properties['BLENDER_WORKBENCH'] - - row = layout.row(align=True) - col = row.column(align=True) - col.prop(props, "diffuse_light_x_neg", text="Left/Right") - col.prop(props, "diffuse_light_x_pos", text="") - col = row.column(align=True) - col.prop(props, "diffuse_light_y_pos", text="Up/Down") - col.prop(props, "diffuse_light_y_neg", text="") - col = row.column(align=True) - col.prop(props, "diffuse_light_z_pos", text="Front/Back") - col.prop(props, "diffuse_light_z_neg", text="") + layout.prop(props, "light_direction", text="") classes = ( diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index 16448c2ad0e..bba39867079 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -3552,8 +3552,13 @@ class VIEW3D_PT_shading(Panel): col.row().prop(shading, "light", expand=True) if shading.light == 'STUDIO': col.row().template_icon_view(shading, "studiolight") + col.separator() + + col.prop(shading, "show_shadows") + if shading.show_shadows: + col.prop(shading, "ambient_light_intensity") + col.separator() - col.separator() col.prop(shading, "show_object_overlap") diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index 07f51dfbc2f..b0cfadacb2c 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -1068,6 +1068,11 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main) } } } + if (sl->spacetype == SPACE_VIEW3D) { + View3D *v3d = (View3D *)sl; + v3d->drawtype_ambient_intensity = 0.5; + v3d->overlays |= V3D_OVERLAY_HIDE_CURSOR; + } } } } diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index e3b6e6fb1f9..3c4d7da29fb 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -212,6 +212,8 @@ data_to_c_simple(engines/eevee/shaders/volumetric_integration_frag.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_shadow_vert.glsl SRC) +data_to_c_simple(engines/workbench/shaders/workbench_shadow_geom.glsl SRC) data_to_c_simple(engines/workbench/shaders/workbench_background_lib.glsl SRC) data_to_c_simple(engines/workbench/shaders/workbench_common_lib.glsl SRC) data_to_c_simple(engines/workbench/shaders/workbench_data_lib.glsl SRC) diff --git a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl index 38211239d01..b032bb6a7b5 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl @@ -6,8 +6,8 @@ uniform sampler2D colorBuffer; uniform sampler2D normalBuffer; /* normalBuffer contains viewport normals */ uniform vec2 invertedViewportSize; - uniform vec3 objectOverlapColor = vec3(0.0); +uniform float lightMultiplier; layout(std140) uniform world_block { WorldData world_data; @@ -52,11 +52,11 @@ void main() vec3 normal_viewport = texelFetch(normalBuffer, texel, 0).rgb; #endif /* WORKBENCH_ENCODE_NORMALS */ vec3 diffuse_light = get_world_diffuse_light(world_data, normal_viewport); - vec3 shaded_color = diffuse_light * diffuse_color.rgb; + vec3 shaded_color = diffuse_light * diffuse_color.rgb * lightMultiplier; #else /* V3D_LIGHTING_STUDIO */ vec3 diffuse_color = texelFetch(colorBuffer, texel, 0).rgb; - vec3 shaded_color = diffuse_color; + vec3 shaded_color = diffuse_color * lightMultiplier; #endif /* V3D_LIGHTING_STUDIO */ diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl new file mode 100644 index 00000000000..a1abfb3fe1c --- /dev/null +++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl @@ -0,0 +1,51 @@ +layout(triangles) in; +layout(triangle_strip, max_vertices=9) out; + +uniform mat4 ModelMatrix; +uniform mat4 ModelViewProjectionMatrix; + +uniform vec3 lightDirection = vec3(0.57, 0.57, -0.57); + +in VertexData { + flat vec4 lightDirectionMS; + vec4 frontPosition; + vec4 backPosition; +} vertexData[]; + +vec3 face_normal(vec3 v1, vec3 v2, vec3 v3) { + return normalize(cross(v2 - v1, v3 - v1)); +} +void main() +{ + vec4 light_direction = vertexData[0].lightDirectionMS; + vec4 v1 = gl_in[0].gl_Position; + vec4 v2 = gl_in[1].gl_Position; + vec4 v3 = gl_in[2].gl_Position; + bool backface = dot(face_normal(v1.xyz, v2.xyz, v3.xyz), light_direction.xyz) > 0.0; + + int index0 = backface?0:2; + int index2 = backface?2:0; + + /* back cap */ + gl_Position = vertexData[index0].backPosition; + EmitVertex(); + gl_Position = vertexData[1].backPosition; + EmitVertex(); + gl_Position = vertexData[index2].backPosition; + EmitVertex(); + + /* sides */ + gl_Position = vertexData[index2].frontPosition; + EmitVertex(); + gl_Position = vertexData[index0].backPosition; + EmitVertex(); + gl_Position = vertexData[index0].frontPosition; + EmitVertex(); + gl_Position = vertexData[1].backPosition; + EmitVertex(); + gl_Position = vertexData[1].frontPosition; + EmitVertex(); + gl_Position = vertexData[index2].frontPosition; + EmitVertex(); + EndPrimitive(); +} diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl new file mode 100644 index 00000000000..7322266a956 --- /dev/null +++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl @@ -0,0 +1,23 @@ +#define EPSILON 0.000001 +#define INFINITE 100.0 + +uniform mat4 ModelMatrixInverse; +uniform mat4 ModelViewProjectionMatrix; +uniform vec3 lightDirection = vec3(0.57, 0.57, -0.57); + +in vec4 pos; + +out VertexData { + flat vec4 lightDirectionMS; + vec4 frontPosition; + vec4 backPosition; +} vertexData; + +void main() +{ + gl_Position = pos; + vertexData.lightDirectionMS = normalize(ModelMatrixInverse * vec4(lightDirection, 0.0)); + vertexData.lightDirectionMS.w = 0.0; + vertexData.frontPosition = ModelViewProjectionMatrix * (pos + vertexData.lightDirectionMS * EPSILON); + vertexData.backPosition = ModelViewProjectionMatrix * (pos + vertexData.lightDirectionMS * INFINITE); +} diff --git a/source/blender/draw/engines/workbench/solid_mode.c b/source/blender/draw/engines/workbench/solid_mode.c index 2a1b5eecc27..c001cd13bb8 100644 --- a/source/blender/draw/engines/workbench/solid_mode.c +++ b/source/blender/draw/engines/workbench/solid_mode.c @@ -59,8 +59,10 @@ static void workbench_solid_cache_finish(void *vedata) workbench_materials_cache_finish(data); } -static void workbench_solid_draw_background(void *UNUSED(vedata)) +static void workbench_solid_draw_background(void *vedata) { + WORKBENCH_Data * data = (WORKBENCH_Data *)vedata; + workbench_materials_draw_background(data); } static void workbench_solid_draw_scene(void *vedata) diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c index f758918d577..40d5c2b12f9 100644 --- a/source/blender/draw/engines/workbench/workbench_engine.c +++ b/source/blender/draw/engines/workbench/workbench_engine.c @@ -58,7 +58,9 @@ static void workbench_view_layer_settings_create(RenderEngine *UNUSED(engine), I BLI_assert(props && props->type == IDP_GROUP && props->subtype == IDP_GROUP_SUB_ENGINE_RENDER); - UNUSED_VARS_NDEBUG(props); + + const float light_direction[3] = {-0.577350269, -0.577350269, 0.577350269}; + BKE_collection_engine_property_add_float_array(props, "light_direction", light_direction, 3); UNUSED_VARS_NDEBUG(props); } /* Note: currently unused, we may want to register so we can see this when debugging the view. */ diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c index 69d983b96c7..04a12d992b3 100644 --- a/source/blender/draw/engines/workbench/workbench_materials.c +++ b/source/blender/draw/engines/workbench/workbench_materials.c @@ -25,8 +25,9 @@ #include "workbench_private.h" -#include "BLI_dynstr.h" #include "BLI_alloca.h" +#include "BLI_dynstr.h" +#include "BLI_utildefines.h" #include "BKE_particle.h" @@ -37,23 +38,31 @@ #include "UI_resources.h" /* *********** STATIC *********** */ + +// #define DEBUG_SHADOW_VOLUME #define MAX_SHADERS 255 + static struct { struct GPUShader *prepass_sh_cache[MAX_SHADERS]; struct GPUShader *composite_sh_cache[MAX_SHADERS]; + struct GPUShader *shadow_sh; struct GPUTexture *object_id_tx; /* ref only, not alloced */ struct GPUTexture *color_buffer_tx; /* ref only, not alloced */ struct GPUTexture *normal_buffer_tx; /* ref only, not alloced */ + float light_direction[3]; /* world light direction for shadows */ int next_object_id; -} e_data = {{NULL}}; +} e_data = {NULL}; /* Shaders */ extern char datatoc_workbench_prepass_vert_glsl[]; extern char datatoc_workbench_prepass_frag_glsl[]; extern char datatoc_workbench_composite_frag_glsl[]; +extern char datatoc_workbench_shadow_vert_glsl[]; +extern char datatoc_workbench_shadow_geom_glsl[]; + extern @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] https://lists.blender.org/mailman/listinfo/bf-blender-cvs
