我试图将大量索引几何(如SphereGeometry)合并到一个缓冲区几何体中。
索引几何图形是我的预制'。
首先,我'压扁'预制件的索引如下:
var prefabFaceCount = prefabGeometry.faces.length;
for (var i = 0; i < prefabFaceCount; i++) {
var face = prefabGeometry.faces[i];
prefabIndices.push(face.a, face.b, face.c);
}
然后,我为每个预制件重复带有偏移量的索引,如下所示:
var prefabIndexCount = prefabGeometry.faces.length * 3;
var prefabVertexCount = prefabGeometry.vertices.length;
for (var i = 0; i < prefabCount; i++) {
for (var k = 0; k < prefabIndexCount; k++) {
bufferIndices[i * prefabIndexCount + k] = prefabIndices[k] + i * prefabVertexCount;
}
}
当我的面数少于65535(prefabFaceCount * prefabCount)时,这样可以正常工作,但是当我超过这个数字时,我的指数会搞乱,导致三角形不正确。
当我在缓冲更复杂的几何体如SphereGeometries(不应连接球体)时,这更为明显:
我的猜测是,当缓冲区域测量通过调用BufferGeometry.computeOffsets()分块为偏移量时会出现问题。我尝试过不同的块大小和索引排序组合,但我还没有找到解决方案。
我必须:
a)在缓冲索引时考虑块大小
b)根据我预制&#39;
中的面孔数量计算块大小c)做a和b的组合
d)完全做其他事情
任何指针都会非常感激。
答案 0 :(得分:1)
索引属性存储在Uint16Array
中Uint16无法引用高于65535的位置,因为它会溢出(uint16只会到2 ^ 16)
最简单的方法是将索引属性缓冲区更改为UJ32Array,如LJ建议的那样
(浏览器需要支持OES_element_index_uint扩展,但大多数浏览器都支持)