0

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

4

2 回答 2

1

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

于 2013-02-23T12:48:15.157 回答
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]更复杂。它将不确定性保存到顶点中,从而形成一个三角形(a,b,c),但它也可以保存诸如面法线(另一个 vec3)、切线、副法线、每个面颜色等之类的东西。

三,这里也是存放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。如果您想进行诸如“查找此三角形或此顶点的最近邻居”之类的查找,您很可能需要结构,因此您要么自己构建一些东西,要么使用Geometry.

于 2016-08-09T18:06:11.333 回答