From 8ab4780f134c33a9e11ac0fe0bd866e17d3ee650 Mon Sep 17 00:00:00 2001 From: vimene Date: Mon, 29 Dec 2025 21:21:09 +0100 Subject: starting to merge vulkan with the engine - refactored scene_main to be able to share code between software and hardware renderers, while still sharing code between terminal software renderer and graphical software renderer - made the hardware renderer use scene objects vertices and transforms, instead of hardcoded ones - made the hardware renderer use the scene's camera - made .obj parser create Vector3 instead of Vector4, which didn't made sense - removed unnecessary std:: - lots of small changes --- src/shaders/shader.slang | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) (limited to 'src/shaders') diff --git a/src/shaders/shader.slang b/src/shaders/shader.slang index 1f055c1..5598e1e 100644 --- a/src/shaders/shader.slang +++ b/src/shaders/shader.slang @@ -1,28 +1,28 @@ struct VertexInput { float3 pos; - float3 col; - float2 uv; + float3 normal; }; struct UniformBuffer { float4x4 model, view, proj; + float4x4 camera_rot; + float3 camera_loc; }; ConstantBuffer ubo; struct VertexOutput { float4 pos : SV_Position; - float3 col; - float2 uv; + float3 world_loc; + float3 normal; }; [shader("vertex")] VertexOutput vert_main(VertexInput vi) { VertexOutput vo; - // vo.pos = float4(vi.pos, 0., 1.); vo.pos = mul(ubo.proj, mul(ubo.view, mul(ubo.model, float4(vi.pos, 1.)))); - vo.col = vi.col; - vo.uv = vi.uv; + vo.world_loc = vi.pos; + vo.normal = vi.normal; return vo; } @@ -30,5 +30,16 @@ Sampler2D texture; [shader("fragment")] float4 frag_main(VertexOutput vo) : SV_Target { - return texture.Sample(vo.uv); + float3 u = vo.world_loc - ubo.camera_loc; + float u_len_sq = dot(u, u); + u = normalize(u); + float attenuation = dot(mul(ubo.camera_rot, float4(0., 0., -1., 0.)).xyz, u); + if (attenuation < .7) attenuation = 0.f; + else if (attenuation > .8) attenuation = 1.; + else attenuation = (attenuation - .7) / .1; + float light = -dot(vo.normal, u) / u_len_sq; + if (light < 0.) light = 0.; + float final_light = .05 + light * attenuation * .8 * .95; + if (final_light > 1.) final_light = 1.; + return float4(final_light, final_light, final_light, 1.); } -- cgit v1.2.3