From e9d4cbaa3c44337115d672d2038a7b73745181c8 Mon Sep 17 00:00:00 2001 From: Connor Thomson Date: Thu, 10 Sep 2026 17:07:15 -0700 Subject: Update teapot model, add phong shading, & more --- shaders/obj.frag.slang | 19 ++++++++++++++++--- shaders/obj.vert.slang | 15 +++++++++++---- 2 files changed, 27 insertions(+), 7 deletions(-) (limited to 'shaders') diff --git a/shaders/obj.frag.slang b/shaders/obj.frag.slang index 90525a3..6f6661c 100644 --- a/shaders/obj.frag.slang +++ b/shaders/obj.frag.slang @@ -18,17 +18,30 @@ */ struct FSInput { - float3 normal : TEXCOORD0; + float3 normal : TEXCOORD0; + float3 world_position : TEXCOORD1; + float3 camera_position : TEXCOORD2; }; struct FSOutput { float4 out_color : SV_Target0; }; +static const float ambient_strength = 0.22; +static const float diffuse_strength = 0.78; +static const float specular_strength = 0.6; +static const float shininess = 32.0; + FSOutput main(FSInput input) { float3 light_direction = normalize(float3(-0.45, 0.75, 0.55)); - float light = max(dot(normalize(input.normal), light_direction), 0.0); - float shade = 0.22 + light * 0.78; + float3 normal = normalize(input.normal); + float3 view_direction = normalize(input.camera_position - input.world_position); + float3 reflect_direction = reflect(-light_direction, normal); + + float diffuse = max(dot(normal, light_direction), 0.0); + float specular = diffuse > 0.0 ? pow(max(dot(view_direction, reflect_direction), 0.0), shininess) : 0.0; + + float shade = saturate(ambient_strength + diffuse * diffuse_strength + specular * specular_strength); FSOutput output; output.out_color = float4(shade, shade, shade, 1.0); return output; diff --git a/shaders/obj.vert.slang b/shaders/obj.vert.slang index 2d45e1d..1884b97 100644 --- a/shaders/obj.vert.slang +++ b/shaders/obj.vert.slang @@ -20,6 +20,8 @@ struct ObjUniforms { float4x4 mvp; float4x4 model; + float3 camera_position; + float padding; }; [[vk::binding(0, 1)]] @@ -31,13 +33,18 @@ struct VSInput { }; struct VSOutput { - float4 position : SV_Position; - float3 normal : TEXCOORD0; + float4 position : SV_Position; + float3 normal : TEXCOORD0; + float3 world_position : TEXCOORD1; + float3 camera_position : TEXCOORD2; }; VSOutput main(VSInput input) { VSOutput output; - output.position = mul(uniforms.mvp, float4(input.position, 1.0)); - output.normal = normalize(mul((float3x3)uniforms.model, input.normal)); + float4 world_position = mul(uniforms.model, float4(input.position, 1.0)); + output.position = mul(uniforms.mvp, float4(input.position, 1.0)); + output.normal = normalize(mul((float3x3)uniforms.model, input.normal)); + output.world_position = world_position.xyz; + output.camera_position = uniforms.camera_position; return output; } -- cgit v1.2.3