Я пытаюсь нарисовать 5161 кубов с помощью webGL. Проблема в том, что не все кубы рисуются. При некотором поиске я думаю, что это потому, что я пропускаю слишком много вершин в одном вызове VBO. Вы можете посмотреть здесь jsfiddle: http://jsfiddle.net/n5fjhe21/. Вы можете перемещаться с помощью клавиш QWERASDF и стрелок, но это не так хорошо реализовано прямо сейчас.webgl как рисовать много кубов
Мой вызов отрисовки используется выглядеть следующим образом:
function render(){
gl.uniformMatrix4fv(u_matrixLoc, false, new Float32Array(pMatrix));
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
gl.drawElements(gl.TRIANGLES, data.triangles.length, gl.UNSIGNED_SHORT, 0);
}
Так что я хотел бы сделать это data.pushData() один раз и оказывать по мере необходимости; Это было быстро. glObject - это массив кубов.
data.pushData = function(){
// pushData once then call drawElements on every render call doesnt work as I hit some kind of limit;
// not all cubes are drawn; I think the draw calls must be split up;
data.vertices = [];
data.uv = [];
data.triangles = [];
var vertexOffset = 0;
glObjects.forEach(function pushingObject(o){
data.vertices.push.apply(data.vertices,o.vertices);
data.uv.push.apply(data.uv,o.uv);
o.triangles.forEach(function pushingTriangles(index){
data.triangles.push(index+vertexOffset);
});
vertexOffset += o.vertices.length/3; // change to component length later
});
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data.vertices),gl.DYNAMIC_DRAW);
gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data.uv),gl.STATIC_DRAW);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, triangleBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(data.triangles), gl.DYNAMIC_DRAW);
};
Но проблема (я думаю) заключается в том, что я пропускаю слишком много вершин одновременно. Так что я пытался объединить pushData и делают вместе:
data.render = function(){
data.vertices = [];
data.uv = [];
data.triangles = [];
var vertexOffset = 0;
glObjects.forEach(function pushingObject(o){
if (vertexOffset + o.vertices.length > 65536){
vertexOffset = 0;
glDraw();
data.vertices.length = 0;
data.uv.length = 0;
data.triangles.length = 0;
}
data.vertices.push.apply(data.vertices,o.vertices);
data.uv.push.apply(data.uv,o.uv);
o.triangles.forEach(function pushingTriangles(index){
data.triangles.push(index+vertexOffset);
});
vertexOffset += o.vertices.length/3; // change to component length later
});
glDraw();
function glDraw(){
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data.vertices),gl.STATIC_DRAW);
gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data.uv),gl.STATIC_DRAW);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, triangleBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(data.triangles), gl.STATIC_DRAW);
gl.drawElements(gl.TRIANGLES, data.triangles.length, gl.UNSIGNED_SHORT, 0);
}
};
Но это не достаточно быстро, потому что, как я узнал, проходя в новом bufferData медленно. Поэтому мой вопрос: что он делает в этой ситуации? Мне не удалось найти какой-либо ресурс webgl, который справляется с этим. Мое чувство склоняется к созданию нескольких объектов VBO, но я хочу убедиться, что сначала пойду в правильном направлении. И в качестве последующего вопроса предположим, что нужно нарисовать много кубов с единственной позицией (x, y, z) и ориентацией (rX, rY, rZ), как это можно реализовать? Заранее спасибо.