javascript - 如何快速更新一个大的 BufferGeometry?

标签 javascript three.js buffer

我正在使用 BufferGeometry 来绘制构成地形的数千个立方体,但是如果我需要更改其中一个立方体的位置,我很难找到如何更新几何体。例如,我有这段代码来初始化我的几何图形:(我正在对 this example 的更新版本进行测试)

// 12 triangles per cube (6 quads)
var triangles = 12 * 150000;

var geometry = new THREE.BufferGeometry();
geometry.attributes = {

    position: {
        itemSize: 3,
        array: new Float32Array( triangles * 3 * 3 ),
        numItems: triangles * 3 * 3
    },

    normal: {
        itemSize: 3,
        array: new Float32Array( triangles * 3 * 3 ),
        numItems: triangles * 3 * 3
    },

    color: {
        itemSize: 3,
        array: new Float32Array( triangles * 3 * 3 ),
        numItems: triangles * 3 * 3
    }
}

positions = geometry.attributes.position.array;
normals = geometry.attributes.normal.array;
colors = geometry.attributes.color.array;

如果我移动一个立方体,在我这样做之前它不会显示为已移动:

geometry.attributes.position.needsUpdate = true;

这会导致 FPS 在更新时下降。还有其他方法可以做到这一点吗?当我只改变一个立方体(12 个三 Angular 形/36 个顶点)时,似乎有点不必要。虽然它可能是 - 我还没有检查 needsUpdate 实际做了什么。猜测它再次将数组发送到着色器。

我想我可以将几何体拆分成单独的较小 BufferGeometries,但我不确定这是否有助于提高整体性能。据我了解,更多的几何图形 = 更少的 FPS。

如果有人知道我将如何做到这一点,我将不胜感激! :) 除了更新问题,BufferGeometry 似乎正是我所需要的。谢谢!

最佳答案

r71 threejs 支持 bufferSubData .

使用 DynamicBufferAttribute , (或者正确设置 updateRange)

var positionAttr = geometry.attributes.position 
// if not using DynamicBufferAttribute initialize updateRange:
// positionAttr.updateRange = {};
positionAttr.updateRange.offset = 0; // where to start updating
positionAttr.updateRange.count = 1; // how many vertices to update
positionAttr.needsUpdate = true;

关于javascript - 如何快速更新一个大的 BufferGeometry?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17410761/

相关文章:

javascript - Three.js 中的初始 Sprite 大小

javascript - 使用 Jquery 或 Javascript 为 Three.js 中的 CylinderGeometry 设置新尺寸

OpenGL 3.3、GLSL 1.5 : How to setup a Texture Buffer Object containing various texture2D?

node.js - 使用 Node.js 将二进制数据推送到 Amazon S3

javascript - Jquery 动画在关闭时出现两次

javascript - Starfield canvas程序占用CPU过多

javascript - THREE.js 如何停止 chop 由 2D Canvas 制成的纹理中的文本

java - 将 CharBuffer 转换为 ByteBuffer

javascript - VueJS 使用 prop 作为数据属性值

javascript - $.browser.msie 在 jQuery 1.9 中不再工作。替代品在哪里?