1
1
use wasm_bindgen:: prelude:: * ;
2
2
use wasm_bindgen:: JsCast ;
3
- use web_sys:: { WebGlProgram , WebGlRenderingContext , WebGlShader } ;
3
+ use web_sys:: { WebGl2RenderingContext , WebGlProgram , WebGlShader } ;
4
4
5
5
#[ wasm_bindgen( start) ]
6
6
pub fn start ( ) -> Result < ( ) , JsValue > {
@@ -9,36 +9,45 @@ pub fn start() -> Result<(), JsValue> {
9
9
let canvas: web_sys:: HtmlCanvasElement = canvas. dyn_into :: < web_sys:: HtmlCanvasElement > ( ) ?;
10
10
11
11
let context = canvas
12
- . get_context ( "webgl " ) ?
12
+ . get_context ( "webgl2 " ) ?
13
13
. unwrap ( )
14
- . dyn_into :: < WebGlRenderingContext > ( ) ?;
14
+ . dyn_into :: < WebGl2RenderingContext > ( ) ?;
15
15
16
16
let vert_shader = compile_shader (
17
17
& context,
18
- WebGlRenderingContext :: VERTEX_SHADER ,
19
- r#"
20
- attribute vec4 position;
18
+ WebGl2RenderingContext :: VERTEX_SHADER ,
19
+ r##"#version 300 es
20
+
21
+ in vec4 position;
22
+
21
23
void main() {
24
+
22
25
gl_Position = position;
23
26
}
24
- " # ,
27
+ "# # ,
25
28
) ?;
29
+
26
30
let frag_shader = compile_shader (
27
31
& context,
28
- WebGlRenderingContext :: FRAGMENT_SHADER ,
29
- r#"
32
+ WebGl2RenderingContext :: FRAGMENT_SHADER ,
33
+ r##"#version 300 es
34
+
35
+ precision highp float;
36
+ out vec4 outColor;
37
+
30
38
void main() {
31
- gl_FragColor = vec4(1.0 , 1.0 , 1.0 , 1.0 );
39
+ outColor = vec4(1, 1, 1, 1);
32
40
}
33
- " # ,
41
+ "# # ,
34
42
) ?;
35
43
let program = link_program ( & context, & vert_shader, & frag_shader) ?;
36
44
context. use_program ( Some ( & program) ) ;
37
45
38
46
let vertices: [ f32 ; 9 ] = [ -0.7 , -0.7 , 0.0 , 0.7 , -0.7 , 0.0 , 0.0 , 0.7 , 0.0 ] ;
39
47
40
- let buffer = context. create_buffer ( ) . ok_or ( "failed to create buffer" ) ?;
41
- context. bind_buffer ( WebGlRenderingContext :: ARRAY_BUFFER , Some ( & buffer) ) ;
48
+ let position_attribute_location = context. get_attrib_location ( & program, "position" ) ;
49
+ let buffer = context. create_buffer ( ) . ok_or ( "Failed to create buffer" ) ?;
50
+ context. bind_buffer ( WebGl2RenderingContext :: ARRAY_BUFFER , Some ( & buffer) ) ;
42
51
43
52
// Note that `Float32Array::view` is somewhat dangerous (hence the
44
53
// `unsafe`!). This is creating a raw view into our module's
@@ -49,31 +58,40 @@ pub fn start() -> Result<(), JsValue> {
49
58
// As a result, after `Float32Array::view` we have to be very careful not to
50
59
// do any memory allocations before it's dropped.
51
60
unsafe {
52
- let vert_array = js_sys:: Float32Array :: view ( & vertices) ;
61
+ let positions_array_buf_view = js_sys:: Float32Array :: view ( & vertices) ;
53
62
54
63
context. buffer_data_with_array_buffer_view (
55
- WebGlRenderingContext :: ARRAY_BUFFER ,
56
- & vert_array ,
57
- WebGlRenderingContext :: STATIC_DRAW ,
64
+ WebGl2RenderingContext :: ARRAY_BUFFER ,
65
+ & positions_array_buf_view ,
66
+ WebGl2RenderingContext :: STATIC_DRAW ,
58
67
) ;
59
68
}
60
69
61
- context. vertex_attrib_pointer_with_i32 ( 0 , 3 , WebGlRenderingContext :: FLOAT , false , 0 , 0 ) ;
62
- context. enable_vertex_attrib_array ( 0 ) ;
70
+ let vao = context
71
+ . create_vertex_array ( )
72
+ . ok_or ( "Could not create vertex array object" ) ?;
73
+ context. bind_vertex_array ( Some ( & vao) ) ;
63
74
64
- context. clear_color ( 0.0 , 0.0 , 0.0 , 1.0 ) ;
65
- context. clear ( WebGlRenderingContext :: COLOR_BUFFER_BIT ) ;
75
+ context. vertex_attrib_pointer_with_i32 ( 0 , 3 , WebGl2RenderingContext :: FLOAT , false , 0 , 0 ) ;
76
+ context. enable_vertex_attrib_array ( position_attribute_location as u32 ) ;
77
+
78
+ context. bind_vertex_array ( Some ( & vao) ) ;
79
+
80
+ let vert_count = ( vertices. len ( ) / 3 ) as i32 ;
81
+ draw ( & context, vert_count) ;
66
82
67
- context. draw_arrays (
68
- WebGlRenderingContext :: TRIANGLES ,
69
- 0 ,
70
- ( vertices. len ( ) / 3 ) as i32 ,
71
- ) ;
72
83
Ok ( ( ) )
73
84
}
74
85
86
+ fn draw ( context : & WebGl2RenderingContext , vert_count : i32 ) {
87
+ context. clear_color ( 0.0 , 0.0 , 0.0 , 1.0 ) ;
88
+ context. clear ( WebGl2RenderingContext :: COLOR_BUFFER_BIT ) ;
89
+
90
+ context. draw_arrays ( WebGl2RenderingContext :: TRIANGLES , 0 , vert_count) ;
91
+ }
92
+
75
93
pub fn compile_shader (
76
- context : & WebGlRenderingContext ,
94
+ context : & WebGl2RenderingContext ,
77
95
shader_type : u32 ,
78
96
source : & str ,
79
97
) -> Result < WebGlShader , String > {
@@ -84,7 +102,7 @@ pub fn compile_shader(
84
102
context. compile_shader ( & shader) ;
85
103
86
104
if context
87
- . get_shader_parameter ( & shader, WebGlRenderingContext :: COMPILE_STATUS )
105
+ . get_shader_parameter ( & shader, WebGl2RenderingContext :: COMPILE_STATUS )
88
106
. as_bool ( )
89
107
. unwrap_or ( false )
90
108
{
@@ -97,7 +115,7 @@ pub fn compile_shader(
97
115
}
98
116
99
117
pub fn link_program (
100
- context : & WebGlRenderingContext ,
118
+ context : & WebGl2RenderingContext ,
101
119
vert_shader : & WebGlShader ,
102
120
frag_shader : & WebGlShader ,
103
121
) -> Result < WebGlProgram , String > {
@@ -110,7 +128,7 @@ pub fn link_program(
110
128
context. link_program ( & program) ;
111
129
112
130
if context
113
- . get_program_parameter ( & program, WebGlRenderingContext :: LINK_STATUS )
131
+ . get_program_parameter ( & program, WebGl2RenderingContext :: LINK_STATUS )
114
132
. as_bool ( )
115
133
. unwrap_or ( false )
116
134
{
0 commit comments