I have been trying to draw a triangle but it is not showing up on the canvas
here is my draw function code:
JavaScript
x
10
10
1
function draw() {
2
gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight)gl.clear(gl.COLOR_BUFFER_BIT)
3
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,
4
buffer.itemSize, gl.FLOAT, false, 0, 0);
5
gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute)
6
7
//Draw the triangle
8
gl.drawArrays(gl.TRIANGLES, 0, buffer.numberOfItems)
9
}
10
here is the whole work:
JavaScript
1
99
99
1
const vertexShaderText = [
2
'attribute vec3 vertexPos;',
3
'',
4
'void main() {',
5
' gl_Position = vec4(vertexPos, 1.0);',
6
'}'
7
].join('n')
8
9
const fragmentShaderText = [
10
'precision mediump float;',
11
'',
12
'void main() {',
13
' gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);',
14
'}'
15
].join('n')
16
17
let gl, shaderProgram, buffer
18
19
function startup() {
20
const canvas = document.getElementById('myCanvas')
21
gl = canvas.getContext('webgl')
22
23
initShader()
24
initBuffer()
25
26
gl.clearColor(0.0, 0.0, 0.0, 1.0)
27
28
draw()
29
}
30
31
function initShader() {
32
33
// VERTEX SHADER
34
let vertexShader = gl.createShader(gl.VERTEX_SHADER)
35
gl.shaderSource(vertexShader, vertexShaderText)
36
gl.compileShader(vertexShader)
37
38
if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
39
alert('vertex', gl.getShaderInfoLog(vertexShader))
40
return
41
}
42
43
let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)
44
gl.shaderSource(fragmentShader, fragmentShaderText)
45
gl.compileShader(fragmentShader)
46
47
if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
48
alert('fragment', gl.getShaderInfoLog(fragmentShader))
49
return
50
}
51
52
53
shaderProgram = gl.createProgram()
54
55
gl.attachShader(shaderProgram, vertexShader)
56
gl.attachShader(shaderProgram, fragmentShader)
57
58
gl.linkProgram(shaderProgram)
59
60
if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
61
alert('Failed to setup shaders')
62
}
63
64
gl.useProgram(shaderProgram)
65
66
shaderProgram.vertextPositionAttribute = gl.getAttribLocation(shaderProgram, 'vertexPos')
67
//gl.enableVertexAttribArray(shaderProgram.vertextPositionAttribute)
68
69
}
70
71
function initBuffer() {
72
buffer = gl.createBuffer()
73
74
gl.bindBuffer(gl.ARRAY_BUFFER, buffer)
75
76
const triangleVertices = [
77
0.0, 0, 5, 0.0, -0.5, -0.5, 0.0,
78
0.5, -0.5, 0.0
79
]
80
81
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(triangleVertices), gl.STATIC_DRAW)
82
83
buffer.itemSize = 3
84
buffer.numberOfItems = 3
85
console.log(shaderProgram)
86
}
87
88
function draw() {
89
gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight)
90
gl.clear(gl.COLOR_BUFFER_BIT)
91
92
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,
93
buffer.itemSize, gl.FLOAT, false, 0, 0);
94
gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute)
95
//Draw the triangle
96
gl.drawArrays(gl.TRIANGLES, 0, buffer.numberOfItems)
97
}
98
99
startup()
JavaScript
1
1
1
<canvas id="myCanvas" width="500" height="500"></canvas>
Advertisement
Answer
There are some issues:
The properties gl.viewportWidth
and gl.viewportHeight
are never set:
JavaScript
1
4
1
gl = canvas.getContext('webgl')
2
gl.viewportWidth = canvas.clientWidth;
3
gl.viewportHeight = canvas.clientHeight;
4
In the array of vertex coordinates is a ,
instead of a .
JavaScript
1
6
1
const triangleVertices = [
2
0.0, 0,5, 0.0, // <---- this line
3
-0.5, -0.5, 0.0,
4
0.5, -0.5, 0.0
5
]
6
And there is a typo , you wrote vertextPositionAttribute
instead of vertexPositionAttribute
, when you get the attribute index:
JavaScript
1
3
1
shaderProgram.vertextPositionAttribute = // <--- typo
2
gl.getAttribLocation(shaderProgram, 'vertexPos')
3
But in general your code works:
JavaScript
1
106
106
1
const vertexShaderText = [
2
'attribute vec3 vertexPos;',
3
'',
4
'void main() {',
5
' gl_Position = vec4(vertexPos, 1.0);',
6
'}'
7
].join('n')
8
9
const fragmentShaderText = [
10
'precision mediump float;',
11
'',
12
'void main() {',
13
' gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);',
14
'}'
15
].join('n')
16
17
let gl, shaderProgram, buffer
18
19
function startup() {
20
const canvas = document.getElementById('myCanvas')
21
gl = canvas.getContext('webgl')
22
23
gl.viewportWidth = canvas.clientWidth;
24
gl.viewportHeight = canvas.clientHeight;
25
26
initShader()
27
initBuffer()
28
29
gl.clearColor(0.0, 0.0, 0.0, 1.0)
30
31
draw()
32
}
33
34
function initShader() {
35
36
// VERTEX SHADER
37
let vertexShader = gl.createShader(gl.VERTEX_SHADER)
38
gl.shaderSource(vertexShader, vertexShaderText)
39
gl.compileShader(vertexShader)
40
41
if(!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
42
alert('vertex', gl.getShaderInfoLog(vertexShader))
43
return
44
}
45
46
let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)
47
gl.shaderSource(fragmentShader, fragmentShaderText)
48
gl.compileShader(fragmentShader)
49
50
if(!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
51
alert('fragment', gl.getShaderInfoLog(fragmentShader))
52
return
53
}
54
55
56
shaderProgram = gl.createProgram()
57
58
gl.attachShader(shaderProgram, vertexShader )
59
gl.attachShader(shaderProgram, fragmentShader)
60
61
gl.linkProgram(shaderProgram)
62
63
if(!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
64
alert('Failed to setup shaders')
65
}
66
67
gl.useProgram(shaderProgram)
68
69
shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, 'vertexPos')
70
//gl.enableVertexAttribArray(shaderProgram.vertextPositionAttribute)
71
72
}
73
74
function initBuffer() {
75
buffer = gl.createBuffer()
76
77
gl.bindBuffer(gl.ARRAY_BUFFER, buffer)
78
79
const triangleVertices = [
80
0.0, 0.5, 0.0,
81
-0.5, -0.5, 0.0,
82
0.5, -0.5, 0.0
83
]
84
85
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(triangleVertices), gl.STATIC_DRAW)
86
87
buffer.itemSize = 3
88
buffer.numberOfItems = 3
89
console.log(shaderProgram)
90
}
91
92
function draw() {
93
gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight)
94
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
95
96
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,
97
buffer.itemSize, gl.FLOAT, false, 0, 0);
98
gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);
99
100
//Draw the triangle
101
gl.drawArrays(gl.TRIANGLES, 0, buffer.numberOfItems)
102
103
requestAnimationFrame(draw);
104
}
105
106
startup()
JavaScript
1
1
1
<canvas id="myCanvas" width="500" height="500"></canvas>