Store inverted final matrix in the shader
This commit is contained in:
parent
bca5dafabf
commit
b0cebb67f8
@ -4,4 +4,5 @@ M4x4f proj_mv;
|
||||
M4x4f proj_mv_inv_t;
|
||||
M4x4f viewport;
|
||||
M4x4f final;
|
||||
M4x4f final_inv;
|
||||
VertexData vertices[TRIANGLE_VERTICES];
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user