three BatchedMesh 批处理网格

451 阅读6分钟

BatchedMesh 是 Three.js 中一种用于批处理多个网格(Mesh)的技术,主要目的是提高渲染性能。通过将多个具有相同材质的几何体合并为一个网格来减少 WebGL 渲染的 draw call 数量,从而提高性能。这在渲染场景中有大量重复对象时非常有用。

BatchedMesh 有六个属性十二个方法

BatchedMesh( maxInstanceCount : Integer, maxVertexCount : Integer, maxIndexCount : Integer, material : Material, ) maxInstanceCount - 计划添加的单个几何体的最大数量。 maxVertexCount - 所有几何体使用的最大顶点数。 maxIndexCount - 所有几何图形使用的最大索引数。 material - Material 的一个实例。默认是新的 MeshBasicMaterial。

基础使用示例

    // 创建几何体
    const box = new THREE.BoxGeometry(1, 1, 1);
    const sphere = new THREE.SphereGeometry(0.5, 32, 32); // 修正为球体几何体
    const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
    // 初始化并添加几何体到批量网格中
    const batchedMesh = new THREE.BatchedMesh(10, 5000, 10000, material);
    const boxId = batchedMesh.addInstance(batchedMesh.addGeometry(box));
    const sphereId = batchedMesh.addInstance(batchedMesh.addGeometry(sphere));
    // 设置几何体的位置
    const boxMatrix = new THREE.Matrix4().makeTranslation(-1.5, 0, 0); // 将方块放置到左侧
    const sphereMatrix = new THREE.Matrix4().makeTranslation(1.5, 0, 0); // 将球体放置到右侧
    batchedMesh.setMatrixAt(boxId, boxMatrix);
    batchedMesh.setMatrixAt(sphereId, sphereMatrix);
    // 将批量网格添加到场景中
    scene.add(batchedMesh);
    
    // 计算批处理后的 boundingBox
    batchedMesh.computeBoundingBox();

    // 获取 BatchedMesh 的 boundingBox
    console.log(batchedMesh.boundingBox); // { "isBox3": true, "min": { "x": -2, "y": -0.5, "z": -0.5 }, "max": { "x": 2, "y": 0.5, "z": 0.5 } }
    
    // 计算批处理后的 boundingSphere
    batchedMesh.computeBoundingSphere();
    // 获取 BatchedMesh 的 boundingSphere
    console.log(batchedMesh.boundingSphere); //  { "isSphere": true, "center": { "x": -0.18301269236086037, "y": 0, "z": 0 }, "radius": 2.1830127114235784 }
    

属性

  • boundingBox : Box3 该边界框包围了 BatchedMesh 的所有实例。可以用 .computeBoundingBox() 进行计算。默认为 null。
  • boundingSphere : Sphere 该边界球包围了 BatchedMesh 的所有实例。可以用 .computeBoundingSphere() 进行计算。默认为 null。
  • perObjectFrustumCulled : Boolean 如果为 true,则 BatchedMesh 内的各个对象将被视锥体剔除。默认为 true。 性能影响:当 perObjectFrustumCulled 为 true 时,会有额外的计算开销,因为每个子对象都需要进行单独的视锥体检测。对于场景中子对象数量非常多的情况,可能会导致性能下降。 适用场景:在大规模场景或有很多分散对象时,开启这个选项可以提升性能;但如果子对象密集或变化不大,禁用该属性(设置为 false)可能会提高整体渲染效率。
  • sortObjects : Boolean 如果为 true,则对 BatchedMesh 中的各个对象进行排序以改善与过度绘制相关的工件。如果材质被标记为“透明”,则对象将从后到前渲染,如果没有,则它们从前到后渲染。默认为 true。 sortObjects: Boolean 用于控制是否对场景中的对象进行排序,默认值为 true。对于有透明对象的场景,启用该属性有助于确保渲染顺序正确,而在没有透明对象或性能要求较高的场景中,可以选择禁用此属性以优化性能。
  • maxInstanceCount : Integer 只读,BatchedMesh 中可以存储的单个几何体的最大数量。
  • isBatchedMesh : Boolean 用于检查给定对象是否属于 BatchedMesh 类型的只读标志。

方法

  • computeBoundingBox () : undefined 计算边界框,更新 .boundingBox 属性。 默认情况下不计算边界框。它们需要显式计算,否则就是 null。
  • computeBoundingSphere () : undefined 计算边界球,更新 .boundingSphere 属性。 默认情况下不计算边界球。它们需要显式计算,否则就是 null。
  • dispose () : undefined 释放该实例分配的GPU相关资源。每当您的应用程序中不再使用此实例时,请调用此方法。
  • setCustomSort ( sortFunction : Function ) : this 对渲染之前运行的函数进行排序。该函数需要一个要排序的项目列表和一个相机。列表中的对象包含一个“z”字段,用于执行深度排序。
    // 向 Group 中添加多个子对象(假设已添加)
    batchedMesh.addGeometry(mesh1);
    batchedMesh.addGeometry(mesh2);
    batchedMesh.addGeometry(mesh3);
    // 使用 setCustomSort 自定义排序逻辑
    batchedMesh.setCustomSort((a, b) => {
        return a.position.x - b.position.x;  // 根据 position.x 进行排序
    });
    // 将 Group 添加到场景中
    scene.add(group);
  • getMatrixAt ( index : Integer, matrix : Matrix4 ) : Matrix4 index: 实例的索引。值必须在 [0, count] 范围内。 matrix: 这个 4x4 矩阵将被设置为定义实例的局部变换矩阵。 获取定义实例的局部变换矩阵。
  • getVisibleAt ( index : Integer ) : Boolean index: 实例的索引。值必须在 [0, count] 范围内。 获取给定实例是否标记为“可见”。
  • setMatrixAt ( index : Integer, matrix : Matrix4 ) : this index: 实例的索引。值必须在 [0, count] 范围内。 matrix: 表示单个实例的局部变换的 4x4 矩阵。 将给定的局部变换矩阵设置为定义的实例。
  • setVisibleAt ( index : Integer, visible : Boolean ) : this index: 实例的索引。值必须在 [0, count] 范围内。 visible: 指示可见性状态的布尔值。 设置给定索引处对象的可见性。
  • addGeometry ( geometry : BufferGeometry, reservedVertexRange : Integer, [param:Integer reservedIndexRange] ) : Integer geometry: 要添加到 BatchedMesh 中的几何体。 reservedVertexRange: 可选参数,指定为添加的几何体保留的顶点缓冲区空间量。如果计划稍后在此索引处设置大于原始几何图形的新几何图形,则这是必要的。默认为给定几何顶点缓冲区的长度。 reservedIndexRange: 可选参数,指定为添加的几何体保留的索引缓冲区空间量。如果计划稍后在此索引处设置大于原始几何图形的新几何图形,则这是必要的。默认为给定几何索引缓冲区的长度。 将给定几何体添加到 BatchedMesh 并返回引用它的关联索引。
-   **geometry: BufferGeometry**:要添加的几何体。这是一个 `BufferGeometry` 对象,表示网格的形状和结构。
-   **reservedVertexRange: Integer**:为添加的几何体保留的顶点范围。这个参数指定了该几何体在批处理网格中的顶点数量,确保在该范围内不会有其他几何体的顶点占用。这对于管理复杂的网格结构很有用,尤其是在需要精确控制每个几何体的顶点索引时。
-   **reservedIndexRange: Integer**(可选):为添加的几何体保留的索引范围。如果不提供该参数,默认值为 `0`。该值表示在索引数组中保留的索引数量。这对于包含索引缓冲区的几何体尤为重要,能够帮助你更好地管理几何体之间的关系。
  • setGeometryAt ( index : Integer, geometry : BufferGeometry ) : Integer index: 用该几何图形替换哪个几何图形索引。 geometry: 在给定几何索引处替换的几何。 用提供的几何图形替换 index 的几何图形。如果索引处没有为几何体保留足够的空间,则会引发错误。
  • getInstanceCountAt ( index : Integer ) : Integer index:实例的索引。值必须在 [0, count] 范围内。 获取索引处几何体的实例计数。如果未配置实例计数,则返回 null。
  • setInstanceCountAt ( index : Integer, instanceCount : Integer ) : Integer index:配置实例计数的几何索引。 instanceCount:给定几何索引的要渲染的实例数。 设置索引处几何体的实例计数。