首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实例化是否适用于由具有不同几何体的ExtrudeGeometry网格组成的Three.js场景?

实例化是否适用于由具有不同几何体的ExtrudeGeometry网格组成的Three.js场景?
EN

Stack Overflow用户
提问于 2021-06-08 05:08:06
回答 1查看 70关注 0票数 2

我有一个由许多建筑物组成的Three.js场景,这些建筑物是通过堆叠ExtrudeGeometry网格形成的(想想Mapbox GL JS中的建筑物):

我使用THREE.ShapeTHREE.ExtrudeGeometry (我使用react-three-fiber)创建这些网格:

代码语言:javascript
复制
function coordsToShape(coords) {
  const shape = new Shape();
  let [x, z] = coords[0];
  shape.moveTo(x, z);
  for (const [x, z] of coords.slice(1)) {
    shape.lineTo(x, z);
  }
  return shape;
}

function Floor(props) {
  const {coords, bottom, top, color} = props;

  const shape = coordsToShape(coords);
  const geom = new ExtrudeGeometry(shape, {depth: top - bottom, bevelEnabled: false});

  return (
    <mesh castShadow geometry={geom} position={[0, bottom, 0]} rotation-x={-Math.PI / 2}>
      <meshPhongMaterial color={color} />
    </mesh>
  )
}

然后我堆叠地板来生成场景:

代码语言:javascript
复制
export default function App() {
  return (
    <Canvas>
      { /* lights, controls, etc. */ }
      <GroundPlane />
      <Floor coords={coords1} bottom={0} top={1} color="skyblue" />
      <Floor coords={coords2} bottom={1} top={3} color="pink" />
      <Floor coords={coords3} bottom={0} top={1} color="aqua" />
      <Floor coords={coords4} bottom={1} top={3} color="orange" />
    </Canvas>
  )
}

完整代码/演示here。这将导致一个网格用于地平面,一个网格用于每个建筑截面,因此总共有五个网格。

我已经read,使用instancing来减少网格的数量是一个好主意。实例化是否与此场景相关?大多数实例示例显示的identical geometries具有不同的颜色、位置和旋转。但是几何形状可以改变吗?我应该使用mergeBufferGeometries吗?但如果我这样做了,我还能获得性能上的胜利吗?因为我已经有了坐标数组,所以我也很乐意直接使用它们来构造一个大的坐标缓冲区。

EN

回答 1

Stack Overflow用户

发布于 2021-06-08 16:57:53

是否与此场景相关?

如果要渲染大量具有相同几何体和材质但具有不同变换(以及其他每个实例的属性,如颜色)的对象,则通常使用实例化。

只有当几何体都可以共享相同的材质时,合并几何体才有意义。因此,如果您需要每个对象不同的颜色,您可以通过定义顶点颜色数据来实现。此外,几何图形应该被认为是静态的,因为如果数据已经合并,执行单独的转换是复杂的。

这两种方法都旨在减少应用程序中绘制调用的数量,这是一个重要的性能指标。尽可能地尝试使用它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67878720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档