1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
struct VertexInput {
float3 pos;
float3 normal;
float2 uv;
};
struct UniformBuffer {
float4x4 model, view, proj, inv_view;
};
ConstantBuffer<UniformBuffer> 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);
}
|