[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