diff --git a/src/shader/main_shader.c b/src/shader/main_shader.c index ba70935..e7e4857 100644 --- a/src/shader/main_shader.c +++ b/src/shader/main_shader.c @@ -1,6 +1,7 @@ #include "main_shader.h" #include "img.h" #include "obj.h" +#include "render.h" #include "shader.h" #include "utils.h" #include "vec.h" @@ -38,6 +39,15 @@ FragmentResult diffuse_shader_fragment(void *shader, const V3f *barycentric, con V3f normal = mat3x3_mul_vec3(normal_mat, (*barycentric)); V2f uv = mat2x3_mul_vec3(uv_mat, (*barycentric)); + V4f shadow_position_h = V3_to_V4(position); + shadow_position_h = mat4x4_mul_vec4(shdr->shadow_matrix, shadow_position_h); + V3f shadow_position = project_vec4(shadow_position_h); + + // Calculate shadow + const Render *shadow_pass = &(g_render_passes[RENDER_PASS_SHADOW]); + f32 shadow_z = get_pixel(f32, &(shadow_pass->depth), shadow_position.x, shadow_position.y); + f32 shadow = 0.3f + 0.7f * (shadow_z < shadow_position.z + 10.0f); + #pragma region darboux_frame_tangent_normals /** * Based on the following section of the tinyrenderer tutorial @@ -96,9 +106,9 @@ FragmentResult diffuse_shader_fragment(void *shader, const V3f *barycentric, con f32 g = clamp(intensity + shdr->ambient.g, 0.0f, 1.0f); f32 b = clamp(intensity + shdr->ambient.b, 0.0f, 1.0f); - output.r *= r; - output.g *= g; - output.b *= b; + output.r *= r * shadow; + output.g *= g * shadow; + output.b *= b * shadow; return (FragmentResult){.colour = output}; }