How to quickly update a large BufferGeometry?

后端 未结 2 970
-上瘾入骨i
-上瘾入骨i 2020-12-05 05:55

I\'m using a BufferGeometry to draw thousands of cubes which makes up the terrain, but having a hard time finding out how to update the geometry if I need to change the posi

2条回答
  •  爱一瞬间的悲伤
    2020-12-05 06:24

    I had the same problem with a very large BufferGeometry when updating a few vertices in it.

    A solution is to use _gl.bufferSubData instead of _gl.bufferData to update just a part of the buffer. (Three js uses only _gl.bufferData).

    So if you update the positions you will do:

    // Create a view of the data to update from index offsetSub to offsetSubEnd

    var view = geometry.attributes.position.array.subarray(offsetSub, offsetSubEnd);

    // Bind the buffer for positions (get the gl context with webglrenderer)

    _gl.bindBuffer(_gl.ARRAY_BUFFER, geometry.attributes.position.buffer);

    // Insert the new values at good index in gpu buffer (offsetGeometry is in byte)

    _gl.bufferSubData(_gl.ARRAY_BUFFER, offsetGeometry,view);

    Note that this solution can be slower if you change a large part of the buffer vertices compared to _gl.bufferData.

提交回复
热议问题