【问题标题】:THREE.js: merging indexed geometries into buffer geometryTHREE.js:将索引几何合并到缓冲区几何中
【发布时间】:2015-08-31 16:52:13
【问题描述】:

我正在尝试将大量索引几何(如 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) 时,这可以正常工作,但是当我超过这个数字时,我的索引会变得混乱,从而导致不正确的三角形。

这是少于 65535 个面

这是更多(注意中心的工件)

当我缓冲更复杂的几何体(如 SphereGeometries)时,这一点更加明显(球体不应连接):

我的猜测是,当通过调用 BufferGeometry.computeOffsets() 将缓冲区几何体分块为偏移量时,就会出现问题。我尝试了块大小和索引排序的不同组合,但我还没有找到解决方案。

我必须:

a) 在缓冲索引时考虑块大小

b) 根据我的“预制件”中的面数计算块大小

c) 做 a 和 b 的组合

d) 完全做其他事情

任何指针将不胜感激。

【问题讨论】:

标签: three.js buffer


【解决方案1】:

索引属性存储在Uint16Array中

Uint16 不能引用高于 65535 的位置,因为它会溢出(uint16 刚好到 2^16)

最简单的方法是将索引属性缓冲区更改为 LJ 建议的 Uint32Array

(浏览器需要支持 OES_element_index_uint 扩展,但大多数浏览器都支持)

【讨论】:

  • 谢谢。使用 Unit32Array 确实解决了这个问题(我忘了我必须更改实际的数组声明),但我可能必须为不支持扩展的浏览器实现后备。计算正确的索引缓冲区大小/偏移量/索引...数字的方法是什么?
  • 简单的方法是划分你的几何图形,这样每个位置最多只能有 65535 个位置(因此位置属性缓冲区长度小于 65535*3)
  • 困难的方法是自己合并缓冲区几何体,这样您的索引最多只能达到 65535,当您需要引用更高的位置时,您只需从该偏移量创建另一个绘图调用并从那里开始索引,这实际上会为 webGL 创建与拥有更多几何图形一样多的绘图调用,并且对于它带来的小幅性能提升来说很难实现
  • 顺便说一下,您可以检查扩展支持here OES_element_index_uint 被超过 95% 的浏览器支持
猜你喜欢
  • 2016-12-04
  • 2021-12-21
  • 2021-11-16
  • 2023-03-03
  • 1970-01-01
  • 2019-07-07
  • 2021-06-17
  • 1970-01-01
  • 2022-10-07
相关资源
最近更新 更多