[Bf-blender-cvs] [2c6106247bf] blender2.8: Workbench: Precompute light direction in object space.

Clément Foucault noreply at git.blender.org
Sun May 20 19:20:15 CEST 2018


Commit: 2c6106247bfde4d649fc788a6b933d48221dc7b3
Author: Clément Foucault
Date:   Sat May 19 18:53:53 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB2c6106247bfde4d649fc788a6b933d48221dc7b3

Workbench: Precompute light direction in object space.

Avoid 2 matrix multiplication in the shader.

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

M	source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_private.h

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

diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
index bee49c41870..881cc901ffb 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
@@ -8,8 +8,6 @@ layout(lines_adjacency) in;
 layout(triangle_strip, max_vertices = 8) out;
 #endif
 
-uniform mat4 ModelMatrixInverse;
-
 uniform vec3 lightDirection = vec3(0.57, 0.57, -0.57);
 
 in VertexData {
@@ -34,9 +32,6 @@ void extrude_edge(bool invert)
 
 void main()
 {
-	/* TODO precompute light_direction */
-	vec3 light_dir = mat3(ModelMatrixInverse) * lightDirection;
-
 	vec3 v10 = vData[0].pos - vData[1].pos;
 	vec3 v12 = vData[2].pos - vData[1].pos;
 	vec3 v13 = vData[3].pos - vData[1].pos;
@@ -55,8 +50,8 @@ void main()
 
 	vec3 n1 = cross(v12, v10);
 	vec3 n2 = cross(v13, v12);
-	vec2 facing = vec2(dot(n1, light_dir),
-	                   dot(n2, light_dir));
+	vec2 facing = vec2(dot(n1, lightDirection),
+	                   dot(n2, lightDirection));
 
 	/* WATCH: maybe unpredictable in some cases. */
 	bool is_manifold = any(notEqual(vData[0].pos, vData[3].pos));
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
index 8f02ce26626..4a06d325db6 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
@@ -1,7 +1,6 @@
 #define EPSILON 0.0001
-#define INFINITE 10000.0
+#define INFINITE 1000000.0
 
-uniform mat4 ModelMatrixInverse;
 uniform mat4 ModelViewProjectionMatrix;
 uniform mat4 ViewProjectionMatrix;
 uniform vec3 lightDirection = vec3(0.57, 0.57, -0.57);
@@ -16,9 +15,7 @@ out VertexData {
 
 void main()
 {
-	/* TODO precompute light_direction */
-	vec3 light_direction = mat3(ModelMatrixInverse) * lightDirection;
 	vData.pos = pos;
 	vData.frontPosition = ModelViewProjectionMatrix * vec4(pos, 1.0);
-	vData.backPosition  = ModelViewProjectionMatrix * vec4(pos + light_direction * INFINITE, 1.0);
+	vData.backPosition  = ModelViewProjectionMatrix * vec4(pos + lightDirection * INFINITE, 1.0);
 }
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index 944572729c1..959186cd1d2 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -449,10 +449,6 @@ void workbench_materials_cache_init(WORKBENCH_Data *vedata)
 			wpd->shadow_shgrp = grp;
 #else
 			psl->shadow_pass = DRW_pass_create("Shadow", DRW_STATE_DEPTH_GREATER | DRW_STATE_WRITE_STENCIL_SHADOW);
-			grp = DRW_shgroup_create(e_data.shadow_sh, psl->shadow_pass);
-			DRW_shgroup_uniform_vec3(grp, "lightDirection", e_data.display.light_direction, 1);
-			DRW_shgroup_stencil_mask(grp, 0xFF);
-			wpd->shadow_shgrp = grp;
 
 			psl->composite_shadow_pass = DRW_pass_create("Composite Shadow", DRW_STATE_WRITE_COLOR | DRW_STATE_STENCIL_NEQUAL);
 			grp = DRW_shgroup_create(wpd->composite_sh, psl->composite_shadow_pass);
@@ -546,6 +542,7 @@ static void workbench_cache_populate_particles(WORKBENCH_Data *vedata, Object *o
 
 void workbench_materials_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob)
 {
+	WORKBENCH_PassList *psl = vedata->psl;
 	WORKBENCH_StorageList *stl = vedata->stl;
 	WORKBENCH_PrivateData *wpd = stl->g_data;
 
@@ -629,7 +626,16 @@ void workbench_materials_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob
 					// DRW_shgroup_call_sculpt_add(wpd->shadow_shgrp, ob, ob->obmat);
 				}
 				else {
-					DRW_shgroup_call_object_add(wpd->shadow_shgrp, geom_shadow, ob);
+					WORKBENCH_ObjectData *engine_object_data = (WORKBENCH_ObjectData *)DRW_object_engine_data_ensure(
+					        ob, &draw_engine_workbench_solid, sizeof(WORKBENCH_ObjectData), &workbench_init_object_data, NULL);
+
+					invert_m4_m4(ob->imat, ob->obmat);
+					mul_v3_mat3_m4v3(engine_object_data->shadow_dir, ob->imat, e_data.display.light_direction);
+
+					DRWShadingGroup *grp = DRW_shgroup_create(e_data.shadow_sh, psl->shadow_pass);
+					DRW_shgroup_uniform_vec3(grp, "lightDirection", engine_object_data->shadow_dir, 1);
+					DRW_shgroup_stencil_mask(grp, 0xFF);
+					DRW_shgroup_call_object_add(grp, geom_shadow, ob);
 				}
 			}
 		}
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index 7b0aa157e07..1be1c475d19 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -108,6 +108,8 @@ typedef struct WORKBENCH_ObjectData {
 	ObjectEngineDataFreeCb free;
 	/* Accumulated recalc flags, which corresponds to ID->recalc flags. */
 	int recalc;
+	/* Shadow direction in local object space. */
+	float shadow_dir[3];
 
 	int object_id;
 } WORKBENCH_ObjectData;



More information about the Bf-blender-cvs mailing list