diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2019-05-09 17:16:12 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2019-05-10 13:14:41 +0300 |
commit | a298dde5d799bd41dd571cda9c91b62a6b78562a (patch) | |
tree | 75dc46e668c58915e0a2f1a8369f2a029e42072c /source | |
parent | fdddea676d4fa40668ca82f8ccc5106437d113f2 (diff) |
Eevee: Update matrices operations to not use combined matrices
Diffstat (limited to 'source')
5 files changed, 34 insertions, 34 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c index 270defb039b..6e6c23205fe 100644 --- a/source/blender/draw/engines/eevee/eevee_lights.c +++ b/source/blender/draw/engines/eevee/eevee_lights.c @@ -53,6 +53,8 @@ extern char datatoc_shadow_store_frag_glsl[]; extern char datatoc_shadow_copy_frag_glsl[]; extern char datatoc_concentric_samples_lib_glsl[]; +extern char datatoc_common_view_lib_glsl[]; + /* Prototypes */ static void eevee_light_setup(Object *ob, EEVEE_Light *evli); static float light_attenuation_radius_get(Light *la, float light_threshold); @@ -111,8 +113,11 @@ void EEVEE_lights_init(EEVEE_ViewLayerData *sldata) const Scene *scene_eval = DEG_get_evaluated_scene(draw_ctx->depsgraph); if (!e_data.shadow_sh) { - e_data.shadow_sh = DRW_shader_create( - datatoc_shadow_vert_glsl, NULL, datatoc_shadow_frag_glsl, NULL); + e_data.shadow_sh = DRW_shader_create_with_lib(datatoc_shadow_vert_glsl, + NULL, + datatoc_shadow_frag_glsl, + datatoc_common_view_lib_glsl, + NULL); } if (!sldata->lights) { diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index c195732aaf8..35e1ff8a9c1 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -48,6 +48,7 @@ static struct { char *frag_shader_lib; char *vert_shader_str; + char *vert_shadow_shader_str; char *volume_shader_lib; struct GPUShader *default_prepass_sh; @@ -609,18 +610,20 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata, e_data.vert_shader_str = BLI_string_joinN( datatoc_common_view_lib_glsl, datatoc_common_hair_lib_glsl, datatoc_lit_surface_vert_glsl); + e_data.vert_shadow_shader_str = BLI_string_joinN( + datatoc_common_view_lib_glsl, datatoc_common_hair_lib_glsl, datatoc_shadow_vert_glsl); + e_data.default_background = DRW_shader_create( datatoc_background_vert_glsl, NULL, datatoc_default_world_frag_glsl, NULL); - e_data.default_prepass_sh = DRW_shader_create( - datatoc_prepass_vert_glsl, NULL, datatoc_prepass_frag_glsl, NULL); - - e_data.default_prepass_clip_sh = DRW_shader_create( - datatoc_prepass_vert_glsl, NULL, datatoc_prepass_frag_glsl, "#define CLIP_PLANES\n"); - char *vert_str = BLI_string_joinN( datatoc_common_view_lib_glsl, datatoc_common_hair_lib_glsl, datatoc_prepass_vert_glsl); + e_data.default_prepass_sh = DRW_shader_create(vert_str, NULL, datatoc_prepass_frag_glsl, NULL); + + e_data.default_prepass_clip_sh = DRW_shader_create( + vert_str, NULL, datatoc_prepass_frag_glsl, "#define CLIP_PLANES\n"); + e_data.default_hair_prepass_sh = DRW_shader_create( vert_str, NULL, datatoc_prepass_frag_glsl, "#define HAIR_SHADER\n"); @@ -853,7 +856,7 @@ struct GPUMaterial *EEVEE_material_mesh_depth_get(struct Scene *scene, ma, engine, options, - (is_shadow) ? datatoc_shadow_vert_glsl : + (is_shadow) ? e_data.vert_shadow_shader_str : e_data.vert_shader_str, NULL, frag_str, @@ -1896,6 +1899,7 @@ void EEVEE_materials_free(void) } MEM_SAFE_FREE(e_data.frag_shader_lib); MEM_SAFE_FREE(e_data.vert_shader_str); + MEM_SAFE_FREE(e_data.vert_shadow_shader_str); MEM_SAFE_FREE(e_data.volume_shader_lib); DRW_SHADER_FREE_SAFE(e_data.default_hair_prepass_sh); DRW_SHADER_FREE_SAFE(e_data.default_hair_prepass_clip_sh); diff --git a/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl b/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl index 68e11f7414c..4243d0ef870 100644 --- a/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl +++ b/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl @@ -1,6 +1,4 @@ -uniform mat4 ModelViewProjectionMatrix; -uniform mat4 ModelViewMatrix; #ifndef USE_ATTR uniform mat4 ModelMatrix; uniform mat4 ModelMatrixInverse; @@ -55,21 +53,19 @@ void main() hairThickness, hairThickTime); - gl_Position = ViewProjectionMatrix * vec4(pos, 1.0); - viewPosition = (ViewMatrix * vec4(pos, 1.0)).xyz; - worldPosition = pos; hairTangent = normalize(hairTangent); worldNormal = cross(binor, hairTangent); - viewNormal = mat3(ViewMatrix) * worldNormal; + worldPosition = pos; #else - gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); worldPosition = point_object_to_world(pos); - viewPosition = point_world_to_view(worldPosition); - worldNormal = normalize(normal_object_to_world(nor)); +#endif + /* No need to normalize since this is just a rotation. */ viewNormal = normal_world_to_view(worldNormal); -#endif + + viewPosition = point_world_to_view(worldPosition); + gl_Position = point_world_to_ndc(worldPosition); /* Used for planar reflections */ gl_ClipDistance[0] = dot(vec4(worldPosition, 1.0), ClipPlanes[0]); diff --git a/source/blender/draw/engines/eevee/shaders/prepass_vert.glsl b/source/blender/draw/engines/eevee/shaders/prepass_vert.glsl index 9196253478a..883862855f3 100644 --- a/source/blender/draw/engines/eevee/shaders/prepass_vert.glsl +++ b/source/blender/draw/engines/eevee/shaders/prepass_vert.glsl @@ -19,25 +19,23 @@ void main() { #ifdef HAIR_SHADER float time, thick_time, thickness; - vec3 pos, tan, binor; + vec3 worldPosition, tan, binor; hair_get_pos_tan_binor_time((ProjectionMatrix[3][3] == 0.0), ModelMatrixInverse, ViewMatrixInverse[3].xyz, ViewMatrixInverse[2].xyz, - pos, + worldPosition, tan, binor, time, thickness, thick_time); - - gl_Position = ViewProjectionMatrix * vec4(pos, 1.0); - vec4 worldPosition = vec4(pos, 1.0); #else - gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); - vec4 worldPosition = (ModelMatrix * vec4(pos, 1.0)); + vec3 worldPosition = point_object_to_world(pos); #endif + gl_Position = point_world_to_ndc(worldPosition); + #ifdef CLIP_PLANES gl_ClipDistance[0] = dot(vec4(worldPosition.xyz, 1.0), ClipPlanes[0]); #endif diff --git a/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl b/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl index baaa43d84b8..4f59725fcf8 100644 --- a/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl +++ b/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl @@ -1,10 +1,6 @@ -uniform mat4 ModelViewProjectionMatrix; -#ifdef MESH_SHADER -uniform mat4 ModelViewMatrix; -# ifndef USE_ATTR +#ifndef USE_ATTR uniform mat4 ModelMatrix; -# endif #endif in vec3 pos; @@ -19,10 +15,11 @@ out vec3 viewNormal; void main() { - gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); + vec3 world_pos = point_object_to_world(pos); + gl_Position = point_world_to_ndc(world_pos); #ifdef MESH_SHADER - viewPosition = (ModelViewMatrix * vec4(pos, 1.0)).xyz; - worldPosition = (ModelMatrix * vec4(pos, 1.0)).xyz; + worldPosition = world_pos; + viewPosition = point_world_to_view(worldPosition); worldNormal = normalize(normal_object_to_world(nor)); /* No need to normalize since this is just a rotation. */ |