我正在使用webgl处理高度图算法。我以为我有它工作,但我意识到我的网格生成的一个严重问题。如果我设置网格大小> 128次迭代,发生了一些奇怪的事情:网格在z轴上停止生长,最终得到的是矩形而不是平方网格。
这是我正在使用的代码:
/*
v1---v0
| / |
| / |
| / |
v2---v3
*/
var size = 5; // max size of terrain
var width = 128; // texture width
var l = size/width;
this.vertices = [];
for(var j=0; j<width; j++){ // y
for(var i=0; i<width; i++){ // x
var p0 = new Point3D(l*(i+1), 0, l * (j+1)); // Upper right
var p1 = new Point3D(l*i, 0, l * (j+1)); // Upper left
var p2 = new Point3D(l*i, 0, l * j); // Bottom left
var p3 = new Point3D(l*(i+1), 0, l * j); // Bottom right
var base = this.vertices.length/3;
this.vertices.push(p0.x, p0.y, p0.z); // v0
this.vertices.push(p1.x, p1.y, p1.z); // v1
this.vertices.push(p2.x, p2.y, p2.z); // v2
this.vertices.push(p3.x, p3.y, p3.z); // v3
// Add indices
this.indices.push(base); // 0
this.indices.push(base+1); // 1
this.indices.push(base+2); // 2
this.indices.push(base); // 0
this.indices.push(base+2); // 2
this.indices.push(base+3); // 3
}
}
/*** Later in my draw method: *****/
{....}
gl.drawElements(gl.LINE_STRIP, this.mesh.vjsBuffer.numItems, gl.UNSIGNED_SHORT, 0);
如果我使用size = 128它可以正常工作;这是结果(大的垂直'''代表0,0,0):
当我尝试使用256x256或更高的图像尺寸时出现问题:
注意中间的图像如何在z轴上停止生长!
经过一些反复试验后,我发现限制为128.如果我使用129或更高,网格会停止增长并开始收缩。
答案 0 :(得分:2)
我终于找到了问题所在。事实证明,WebGL每个ELEMENT_ARRAY_BUFFER的限制为65536个索引。因此,如果您尝试加载具有大量顶点的对象,则会导致意外行为。
似乎有几种解决方案可以解决这个问题:
1)启用gl扩展&#34; OES_element_index_uint&#34;绑定索引缓冲区时使用Uint32Array。
2)将你的网格拆分成块并在当时渲染1
3)不要使用gl.drawElements而是使用gl.drawArrays。
我最终使用了第三种选择。请记住,这可能不是最有效的方法,因为您需要多次定义相同的顶点。
结果现在是一个外观漂亮的地形(在计算法线和应用光照后):http://goo.gl/EhE815