1
+ #![ cfg_attr( target_arch = "spirv" , no_std) ]
2
+ #![ allow( clippy:: missing_safety_doc) ]
3
+
4
+ use spirv_std:: { spirv, glam:: { vec2, vec3, vec4, Mat3 , Mat4 , Vec2 , Vec3 , Vec4 , Vec4Swizzles } , Image , Sampler , num_traits:: Float } ;
5
+
6
+ #[ repr( C ) ]
7
+ #[ derive( Copy , Clone ) ]
8
+ pub struct Ubo {
9
+ pub projection : Mat4 ,
10
+ pub view : Mat4 ,
11
+ pub model : Mat4 ,
12
+ pub view_pos : Vec4 ,
13
+ pub lod_bias : f32 ,
14
+ pub sampler_index : i32 ,
15
+ }
16
+
17
+ #[ spirv( vertex) ]
18
+ pub fn main_vs (
19
+ in_pos : Vec3 ,
20
+ in_uv : Vec2 ,
21
+ in_normal : Vec3 ,
22
+ #[ spirv( uniform, descriptor_set = 0 , binding = 0 ) ] ubo : & Ubo ,
23
+ #[ spirv( position) ] out_position : & mut Vec4 ,
24
+ out_uv : & mut Vec2 ,
25
+ out_lod_bias : & mut f32 ,
26
+ out_normal : & mut Vec3 ,
27
+ out_view_vec : & mut Vec3 ,
28
+ out_light_vec : & mut Vec3 ,
29
+ ) {
30
+ * out_uv = in_uv * vec2 ( 2.0 , 1.0 ) ;
31
+ * out_lod_bias = ubo. lod_bias ;
32
+
33
+ let world_pos = ( ubo. model * vec4 ( in_pos. x , in_pos. y , in_pos. z , 1.0 ) ) . xyz ( ) ;
34
+
35
+ * out_position = ubo. projection * ubo. view * ubo. model * vec4 ( in_pos. x , in_pos. y , in_pos. z , 1.0 ) ;
36
+
37
+ * out_normal = Mat3 :: from_mat4 ( ubo. model . inverse ( ) . transpose ( ) ) * in_normal;
38
+ let light_pos = vec3 ( -30.0 , 0.0 , 0.0 ) ;
39
+ * out_light_vec = world_pos - light_pos;
40
+ * out_view_vec = ubo. view_pos . xyz ( ) - world_pos;
41
+ }
42
+
43
+ #[ spirv( fragment) ]
44
+ pub fn main_fs (
45
+ in_uv : Vec2 ,
46
+ in_lod_bias : f32 ,
47
+ in_normal : Vec3 ,
48
+ in_view_vec : Vec3 ,
49
+ in_light_vec : Vec3 ,
50
+ #[ spirv( uniform, descriptor_set = 0 , binding = 0 ) ] ubo : & Ubo ,
51
+ #[ spirv( descriptor_set = 0 , binding = 1 ) ] texture_color : & Image ! ( 2 D , type =f32 , sampled) ,
52
+ #[ spirv( descriptor_set = 0 , binding = 2 ) ] samplers : & [ Sampler ; 3 ] ,
53
+ out_frag_color : & mut Vec4 ,
54
+ ) {
55
+ let sampler = & samplers[ ubo. sampler_index as usize ] ;
56
+ let color = texture_color. sample_bias ( * sampler, in_uv, in_lod_bias) ;
57
+
58
+ let n = in_normal. normalize ( ) ;
59
+ let l = in_light_vec. normalize ( ) ;
60
+ let v = in_view_vec. normalize ( ) ;
61
+ let r = l. reflect ( n) ;
62
+ let diffuse = n. dot ( l) . max ( 0.65 ) * vec3 ( 1.0 , 1.0 , 1.0 ) ;
63
+ let specular = r. dot ( v) . max ( 0.0 ) . powf ( 16.0 ) * color. w ;
64
+ let final_color = diffuse * color. xyz ( ) + vec3 ( specular, specular, specular) ;
65
+ * out_frag_color = vec4 ( final_color. x , final_color. y , final_color. z , 1.0 ) ;
66
+ }
0 commit comments