struct VertexInput { float3 pos; float3 normal; float2 uv; }; struct UniformBuffer { float4x4 model, view, proj, inv_view; }; ConstantBuffer ubo; struct VertexOutput { float4 pos : SV_Position; float3 world_loc; float3 normal; float2 uv; }; [shader("vertex")] VertexOutput vert_main(VertexInput vi) { VertexOutput vo; float4 world_loc = mul(ubo.model, float4(vi.pos, 1.)); vo.pos = mul(ubo.proj, mul(ubo.view, world_loc)); vo.world_loc = world_loc.xyz; vo.normal = mul(ubo.model, float4(vi.normal, 0.)).xyz; vo.uv = vi.uv; return vo; } Sampler2D texture; [shader("fragment")] float4 frag_main(VertexOutput vo) : SV_Target { // float3 u = vo.world_loc - (ubo.inv_view * float4(0., 0., 0., 1.)).xyz; // float u_len_sq = dot(u, u); // u = normalize(u); // float attenuation = dot(mul(ubo.inv_view, 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 = .003 + light * attenuation * .8 * .997; // if (final_light > 1.) final_light = 1.; // return float4(final_light, final_light, final_light, 1.); return float4(texture.Sample(vo.uv).rgb, 1.f); }