什么是BufferedGeometry

时间:2013-02-23 11:49:43

标签: three.js

有人可以向我解释一下BufferedGeometry在三个上下文中的含义吗?它与普通几何有什么不同。他们不是对显卡进行相同的调用吗?此外,在制作地形解决方案时,使用BufferedGeometry会提高速度。目前我已经创建了一个地形解决方案,它使用了数百个彼此相邻的小网格。与使用单个PlaneGeometry对象相比,此方法的速度略有提高(可能是因为可以更容易地应用mip映射和剔除)。然而它仍然不是很好,性能在大风景上变得不稳定 - 我想知道我是否应该追求BufferedGeometry或者只是接受我现在的解决方案并将其限制在小地图上? 谢谢:))

2 个答案:

答案 0 :(得分:1)

缓冲几何是将数据发送到gpu的另一种方式。是的,这是一个提高速度,所以你可以尝试一下。

答案 1 :(得分:0)

几何看起来像这样

class Geometry {

   this.vertices = []; //javascript array
   this.faces = [];    //another javascript array
   this.uvs = [];
   ...
}

它只是一个JS类

这些数组包含一些复杂的东西,其他类和结构。

this.vertices[0]将是THREE.Vector3,这是另一个类 - 有数据和方法,但数据只有三个浮点数,所以它非常简单。可能是一个数组[x,y,z]而不是一个带有成员的对象,但是你不会有这些方法。

this.faces[0]更复杂。它将indecis保持为顶点,它形成一个三角形(a,b,c),但它也可以保存像face normal(另一个vec3),切线,binormal,per face颜色等等。

三,这也是存储vertexNormals的地方。

WebGL不知道如何解释这些东西。它理解typedArrays,因此为了在GPU上开始使用Geometry,它需要转换为WebGL友好格式。

这就是BufferGeometry。它是相同的数据,以不同的方式组织,更低级别的gpu友好。

没有javascript类,没有方法,没有引用。您必须知道如何填充这些数组并管理偏移量和大小。

三个JS对象THREE.Vector3变成一个Float32Array(9) [xyzxyzxyz]。 Face没有空间存储所有这些东西,它只是另一个阵列中的另一个订单:

Uint16Array(3)[0,1,2](意思是:在顶点0,1和2中创建一个三角形,意思是在偏移0 * 3,1 * 3和2 * 3处查找该顶点数组

这是它的主旨。更快,更少内存,灵活性更低。

如果要使用着色器操纵地形,则应使用bufferGeometry。如果你想做&#34的查找;找到这个三角形的最近邻居,或者这个顶点"你最有可能需要结构,所以你要么自己构建一些东西,要么使用Geometry