Workbench: Precompute light direction in object space.

Avoid 2 matrix multiplication in the shader.
This commit is contained in:
Clément Foucault 2018-05-19 18:53:53 +02:00
parent ef90d46700
commit 2c6106247b
4 changed files with 17 additions and 17 deletions

View File

@ -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));

View File

@ -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);
}

View File

@ -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);
}
}
}

View File

@ -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;