-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathvoxel_shader_packed.wgsl
68 lines (57 loc) · 1.82 KB
/
voxel_shader_packed.wgsl
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
// Vertex shader
struct CameraUniform {
view_proj: mat4x4<f32>,
};
@group(1) @binding(0)
var<uniform> camera: CameraUniform;
// Vertex shader
struct ModelPush {
model: mat4x4<f32>,
};
var<push_constant> model_matrix: ModelPush;
struct VertexInput {
@location(0) @interpolate(flat) vertex_data: u32,
}
struct VertexOutput {
@builtin(position) clip_position: vec4<f32>,
@location(0) tex_coords: vec2<f32>,
@location(1) tex_idx: i32,
}
@vertex
fn vs_main(
vertex: VertexInput,
) -> VertexOutput {
var out: VertexOutput;
var bitmask_6 = u32(63); //AND with this to get lowest six bits of data.
//Extract X:
var x = f32(vertex.vertex_data & bitmask_6);
//Extract Y:
var y = f32((vertex.vertex_data >> u32(6)) & bitmask_6);
//Extract Z:
var z = f32((vertex.vertex_data >> u32(12)) & bitmask_6);
var vertex_position = vec3<f32>(x, y, z);
out.clip_position = camera.view_proj * model_matrix.model * vec4<f32>(vertex_position, 1.0);
//Extract texture ID
var bitmask_12 = u32(4095);
var t_id = i32((vertex.vertex_data >> u32(18)) & bitmask_12);
out.tex_idx = t_id;
var bitmask_1 = u32(1); //Lowest one bit time.
var u = f32((vertex.vertex_data >> u32(30)) & bitmask_1);
var v = f32((vertex.vertex_data >> u32(31)) & bitmask_1);
out.tex_coords = vec2<f32>(u, v);
return out;
}
// Fragment shader
@group(0) @binding(0)
var t_diffuse: texture_2d_array<f32>;
@group(0) @binding(1)
var s_diffuse: sampler;
@fragment
fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {
// TODO: This is most likely a bug in WGPU -
// u32 is supposed to be supported as a texture index but currently
// it throws a shader compilation error, so we convert it to an
// i32 instead.
var tex_idx: i32 = i32(in.tex_idx);
return textureSample(t_diffuse, s_diffuse, in.tex_coords, tex_idx);
}