[Bf-blender-cvs] [3f95daa31fa] blender2.8: Workbench: Shadows
Jeroen Bakker
noreply at git.blender.org
Fri May 4 14:10:53 CEST 2018
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. @@
More information about the Bf-blender-cvs
mailing list