From b0cebb67f8ce211143d4fa040fde33c7a0eaf5a5 Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sat, 14 Sep 2024 18:33:04 +0100 Subject: [PATCH] Store inverted final matrix in the shader --- src/shader/shader_base.inc | 1 + src/shader/shaders.c | 34 ++++++++++++++++++++-------------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/shader/shader_base.inc b/src/shader/shader_base.inc index 5fb7dc7..77a0e90 100644 --- a/src/shader/shader_base.inc +++ b/src/shader/shader_base.inc @@ -4,4 +4,5 @@ M4x4f proj_mv; M4x4f proj_mv_inv_t; M4x4f viewport; M4x4f final; +M4x4f final_inv; VertexData vertices[TRIANGLE_VERTICES]; diff --git a/src/shader/shaders.c b/src/shader/shaders.c index f2d13f7..104ded2 100644 --- a/src/shader/shaders.c +++ b/src/shader/shaders.c @@ -6,15 +6,15 @@ #include "shader.h" #include "vec.h" +ShaderID depth = {0}; ShaderID perspective_diffuse = {0}; ShaderID perspective_albedo = {0}; ShaderID orthographic_diffuse = {0}; ShaderID orthographic_albedo = {0}; -ShaderID depth = {0}; +internal DepthShader depth_shader = {0}; internal Shader perspective = {0}; internal Shader orthographic = {0}; -internal DepthShader depth_shader = {0}; internal V3f g_ambient_light = {0.1f, 0.1f, 0.1f}; internal V3f g_eye = {0.2f, -0.1f, 0.5f}; @@ -25,6 +25,19 @@ internal V3f g_light_dir = {1.0f, -1.0f, 1.0f}; internal M4x4f get_projection_matrix(ProjectionType projection_type); void load_shaders(M4x4f vp) { + // Set up depth shader matrices + M4x4f depth_model_view = lookat(g_light_dir, g_target, g_up); + M4x4f depth_projection = projection(0.0f); + + // Set up depth shader + depth_shader.proj_mv = mat4x4_mul(depth_projection, depth_model_view); + depth_shader.proj_mv_inv_t = mat4x4_inv(mat4x4_transpose(depth_shader.proj_mv)); + depth_shader.viewport = vp; + depth_shader.final = mat4x4_mul(depth_shader.viewport, depth_shader.proj_mv); + depth_shader.light_dir = mat3x3_mul_vec3(depth_shader.proj_mv, g_light_dir); + normalise_v3(depth_shader.light_dir); + + // Set up main shaders matrices M4x4f model_view = lookat(g_eye, g_target, g_up); M4x4f orthographic_projection = get_projection_matrix(PROJECTION_TYPE_ORTHOGRAPHIC); M4x4f perspective_projection = get_projection_matrix(PROJECTION_TYPE_PERSPECTIVE); @@ -34,6 +47,8 @@ void load_shaders(M4x4f vp) { perspective.proj_mv_inv_t = mat4x4_inv(mat4x4_transpose(perspective.proj_mv)); perspective.viewport = vp; perspective.final = mat4x4_mul(perspective.viewport, perspective.proj_mv); + perspective.final_inv = mat4x4_inv(perspective.final); + perspective.shadow_matrix = mat4x4_mul(depth_shader.final, perspective.final_inv); perspective.light_dir = mat3x3_mul_vec3(perspective.proj_mv, g_light_dir); normalise_v3(perspective.light_dir); perspective.ambient = g_ambient_light; @@ -43,27 +58,18 @@ void load_shaders(M4x4f vp) { orthographic.proj_mv_inv_t = mat4x4_inv(mat4x4_transpose(orthographic.proj_mv)); orthographic.viewport = vp; orthographic.final = mat4x4_mul(orthographic.viewport, orthographic.proj_mv); + orthographic.final_inv = mat4x4_inv(perspective.final); + orthographic.shadow_matrix = mat4x4_mul(depth_shader.final, orthographic.final_inv); orthographic.light_dir = mat3x3_mul_vec3(orthographic.proj_mv, g_light_dir); normalise_v3(orthographic.light_dir); orthographic.ambient = g_ambient_light; - // Set up depth shader - M4x4f depth_model_view = lookat(g_light_dir, g_target, g_up); - M4x4f depth_projection = projection(0.0f); - - depth_shader.proj_mv = mat4x4_mul(depth_projection, depth_model_view); - depth_shader.proj_mv_inv_t = mat4x4_inv(mat4x4_transpose(depth_shader.proj_mv)); - depth_shader.viewport = vp; - depth_shader.final = mat4x4_mul(depth_shader.viewport, depth_shader.proj_mv); - depth_shader.light_dir = mat3x3_mul_vec3(depth_shader.proj_mv, g_light_dir); - normalise_v3(depth_shader.light_dir); - // Register shaders + depth = register_shader(&depth_shader, depth_shader_vertex, depth_shader_fragment); perspective_diffuse = register_shader(&perspective, general_shader_vertex, diffuse_shader_fragment); perspective_albedo = register_shader(&perspective, general_shader_vertex, albedo_shader_fragment); orthographic_diffuse = register_shader(&orthographic, general_shader_vertex, diffuse_shader_fragment); orthographic_albedo = register_shader(&orthographic, general_shader_vertex, albedo_shader_fragment); - depth = register_shader(&depth_shader, depth_shader_vertex, depth_shader_fragment); } internal M4x4f get_projection_matrix(ProjectionType projection_type) {