我正在尝试使用WebGL绘制5161个立方体。问题在于,并非所有的立方体都被绘制出来。经过一些搜索,我认为这是因为我在一个VBO调用中传递了太多的顶点。您可以在此处查看jsfiddle:http://jsfiddle.net/n5fjhe21/。您可以使用 QWERASDF 和箭头键进行移动,但现在实现不太好。
但这样速度不够快,因为我学到了,传入新的BufferData是很慢的。所以我的问题是,在这种情况下应该怎么做?我找不到任何处理此问题的WebGL资源。我的感觉倾向于创建多个VBO对象,但我想先确保我朝着正确的方向前进。作为跟进问题,假设需要绘制许多立方体,每个立方体都有唯一的位置 (x,y,z) 和方向 (rX,rY,rZ),那么要如何实现呢?谢谢。
我的绘图调用以前是这样的:
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 是一个 Cube 数组。
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和render:
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),那么要如何实现呢?谢谢。