Рисуем куб
Для начала, в функции initBuffers(), изменим информацию о вершинах и их цвете, а так же добавим индексы, которые помогут определить, как выводить треугольники.
function initBuffers() { vertices_buffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, vertices_buffer); var vertices = [ -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0 ]; gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); color_buffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer); var colors = [ 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0 ]; gl.bufferData( gl.ARRAY_BUFFER, new Float32Array( colors ), gl.STATIC_DRAW ); index_buffer = gl.createBuffer(); gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, index_buffer ); var indices = [ 0, 1, 2, 2, 3, 0, 2, 6, 7, 7, 3, 2, 0, 1, 5, 5, 4, 0, 6, 5, 4, 4, 7, 6, 1, 5, 6, 6, 2, 1, 0, 4, 7, 7, 3, 0 ]; gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW ); }
Далее изменим функцию initBuffers(). Для того чтобы вывести куб, воспользуемся командой drawElements(). Следует отметить, что значение переменной vertices равно размеру массива indices.
function drawScene(delta) { gl.clearColor(0.0, 0.0, 0.0, 1.0); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); perspectiveMatrix = makePerspective(45, 600.0/400.0, 0.1, 100.0); loadIdentity(); mvPushMatrix(); mvTranslate([-0.0, 0.0, -6.0]); mvRotate(sqrRot, [1, 0, 0.7]); gl.bindBuffer(gl.ARRAY_BUFFER, vertices_buffer); gl.vertexAttribPointer(vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0); gl.enableVertexAttribArray(vertexPositionAttribute); gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer); gl.vertexAttribPointer(vertexColorAttribute, 4, gl.FLOAT, false, 0, 0); gl.enableVertexAttribArray(vertexColorAttribute); gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, index_buffer ); setMatrixUniforms(); var vertices = 36; gl.drawElements( gl.TRIANGLES, vertices, gl.UNSIGNED_SHORT, 0 ); mvPopMatrix(); sqrRot -= delta * 40; }
Ниже представлен результат работы программы.