Workbench: Precompute light direction in object space.
Avoid 2 matrix multiplication in the shader.
This commit is contained in:
parent
ef90d46700
commit
2c6106247b
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue