究竟什么是PlaneBufferGeometry以及它与PlaneGeometry的不同之处? (R69)
答案 0 :(得分:20)
PlaneBufferGeometry
是PlaneGeometry
的低内存替代品。对象本身在很多方面都有所不同。例如,顶点位于PlaneBufferGeometry位于PlaneBufferGeometry.attributes.position
而不是PlaneGeometry.vertices
你可以快速查看浏览器控制台以找出更多的差异,但据我所知,由于顶点通常间隔均匀(X
和Y
)彼此之间,只需要给出高度(Z
)来定位顶点。
答案 1 :(得分:3)
主要区别在于Geometry和BufferGeometry。
Geometry是一种“用户友好的”,面向对象的数据结构,而BufferGeometry是一种数据结构,可以更直接地映射到着色器程序中数据的使用方式。 BufferGeometry更快,内存更少,但Geometry在某些方面更灵活,可以更轻松地完成某些操作。
我几乎没有使用Geometry的经验,因为我发现BufferGeometry在大多数情况下都可以完成工作。学习和使用着色器使用的实际数据结构非常有用。
对于PlaneBufferGeometry,您可以像这样访问顶点位置:
let pos = geometry.getAttribute("position");
let pa = pos.array;
然后设置如下的z值:
var hVerts = geometry.heightSegments + 1;
var wVerts = geometry.widthSegments + 1;
for (let j = 0; j < hVerts; j++) {
for (let i = 0; i < wVerts; i++) {
//+0 is x, +1 is y.
pa[3*(j*wVerts+i)+2] = Math.random();
}
}
pos.needsUpdate = true;
geometry.computeVertexNormals();
随机性就是一个例子。如果你在内循环中let x = pa[3*(j*wVerts+i)];
和let y = pa[3*(j*wVerts+i)+1];
,你也可以(另一个例子)绘制x,y的函数。为了在PlaneBufferGeometry情况下获得小的性能优势,而在外部循环中使用let y = (0.5-j/(hVerts-1))*geometry.height
。
geometry.computeVertexNormals();
。如果您不提供或计算法线,则材质将使用默认平面法线,它们都直接指向原始平面。
请注意,沿着维度的顶点数量比沿同一维度的段数量多一个。
另请注意(违反直觉)y值相对于j索引翻转:vertices.push( x, - y, 0 );
(source)