-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathshaders.cxx
84 lines (68 loc) · 2.12 KB
/
shaders.cxx
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
template<int location, typename type_t>
[[using spirv: in, location(location)]]
type_t shader_in;
template<int location, typename type_t>
[[using spirv: out, location(location)]]
type_t shader_out;
struct object_data_t {
mat4 gWorld;
};
[[using spirv: uniform, binding(0)]]
object_data_t object_data;
struct pass_data_t {
mat4 gViewProj;
vec3 eyePos;
};
[[using spirv: uniform, binding(1)]]
pass_data_t pass_data;
extern "C" [[spirv::vert]]
void vert() {
glvert_Output.Position = vec4(shader_in<0, vec3>, 1);
}
inline void patch_constant() {
vec3 p0 = gltesc_Input[0].Position.xyz;
vec3 p1 = gltesc_Input[1].Position.xyz;
vec3 p2 = gltesc_Input[2].Position.xyz;
vec3 p3 = gltesc_Input[3].Position.xyz;
vec3 centerL = .25f * (p0 + p1 + p2 + p3);
vec3 centerW = (object_data.gWorld * vec4(centerL, 1)).xyz;
float d = distance(centerW, pass_data.eyePos);
float d0 = 20;
float d1 = 100;
float tess = 64 * saturate((d1 - d) / (d1 - d0));
// Uniformly tessellate the patch.
gltesc_LevelOuter[0] = tess;
gltesc_LevelOuter[1] = tess;
gltesc_LevelOuter[2] = tess;
gltesc_LevelOuter[3] = tess;
gltesc_LevelInner[0] = tess;
gltesc_LevelInner[1] = tess;
}
extern "C"
[[using spirv: tesc(quads, 4), output(triangle_cw), spacing(fractional_even)]]
[[dxil::patch_constant(patch_constant)]]
void tesc() {
// Pass the patch positions through.
gltesc_Output.Position = gltesc_Input[gltesc_InvocationID].Position;
}
extern "C"
[[using spirv: tese(quads, 4)]]
void tese() {
float u = gltese_TessCoord.x;
float v = gltese_TessCoord.y;
vec3 p0 = gltese_Input[0].Position.xyz;
vec3 p1 = gltese_Input[1].Position.xyz;
vec3 p2 = gltese_Input[2].Position.xyz;
vec3 p3 = gltese_Input[3].Position.xyz;
vec3 v1 = mix(p0, p1, u);
vec3 v2 = mix(p2, p3, u);
vec3 p = mix(v1, v2, v);
// Displacement mapping.
p.y = .3f * (p.z * sin(p.x) + p.x * cos(p.z));
vec4 pos = vec4(p, 1) * object_data.gWorld * pass_data.gViewProj;
glvert_Output.Position = pos;
}
extern "C" [[spirv::frag]]
void frag() {
shader_out<0, vec4> = vec4(1);
}