и спасибо вам заранее.
Я новичок в Webgl и не совсем понимаю связь между методом drawElements и текущим буфером вершин, который я хочу нарисовать. Я примерно понимаю, что происходит для метода drawArray (например, создание буфера, привязка его к контексту, заполнение его данными, указание на соответствующий атрибут, рисование). Но когда я пытаюсь сделать то же самое с массивом индексов и меньшим количеством данных вершин, я сталкиваюсь с ошибкой такого типа:
[.Offscreen-For-WebGL-0x7fae2b940800]GL ERROR :GL_INVALID_OPERATION : glDrawElements: bound to target 0x8893 : no buffer
Возможно, подсказка моего кода может вам помочь.
const cube = new Program(renderer.gl, vertex3d, fragment); // my webgl program
const cubeData = new Cube(); // Only array of vertices/indices
const cubeVertexPosition = new ArrayBuffer(renderer.gl, cubeData.vertices, 'STATIC_DRAW'); // ARRAY_BUFFER
const cubeVertexIndices = new IndexBuffer(renderer.gl, renderer.gl.UNSIGNED_SHORT, cubeData.indices, 'STATIC_DRAW'); // ELEMENT_ARRAY_BUFFER
cubeVertexPosition.attribute('aPosition', 3, 'FLOAT', false); // define attribute corresponding in vertex shader
cubeVertexPosition.attributePointer(cube); // enableVertexAttribArray + vertexAttribPointer
[...]
cubeVertexIndices.draw('TRIANGLES', 0, 36); // drawElements with gl.UNSIGNED_SHORT type
Мне удалось нарисовать его с помощью drawArray :)
([[...] - только преобразование матриц для униформы);
Может быть, у вас есть быстрые советы, которые могли бы помочь мне понять эту черную магию,
Большое спасибо !
drawElements
. Вы вызываетеbindBuffer
сELEMENT_ARRAY_BUFFER
какtarget
, тогда у вас есть привязка буфера элементов (индексов), вы вызываетеbindBuffer
сARRAY_BUFFER
, у вас есть привязка буфера атрибутов (вершин). Это так просто. Я редактирую свой ответ, чтобы указать эту часть. 11.11.2017