实例化 vs bufferGeometry vs interleavedBuffer

Posted

技术标签:

【中文标题】实例化 vs bufferGeometry vs interleavedBuffer【英文标题】:instancing vs bufferGeometry vs interleavedBuffer 【发布时间】:2018-01-31 14:48:32 【问题描述】:

我需要绘制数千个具有位置、大小和颜色属性的点和线,并且它们的位置是动态的(拖动时交互)。

直到现在我都在使用缓冲区几何,但现在我发现了另外两个东西

    实例化 交错缓冲区

我想知道这些是什么以及它们是如何工作的?它们的优点和缺点是什么?它们更适合我的情况还是简单的缓冲区几何最适合我?

你能给我这三者的完整比较吗?

【问题讨论】:

两者不一定竞争。您可能仍会使用缓冲区(交错或不交错),但如果您需要多次绘制大量相同对象但具有不同位置(或其他属性),则立即绘制它们。 【参考方案1】:

交错意味着您无需创建多个 VBO 来包含您的数据,而是创建一个并混合您的数据。而不是一个带有v1,v1,v1,v2,v2,v2... 的缓冲区和另一个带有c1,c1,c1,c2,c2,c2.... 的缓冲区,而是一个带有不同指针的v1,v1,v1,c1,c1,c1,v2,v2,v2,c2,c2,c2...

我不确定这有什么好处,希望有更多经验的人能更好地回答这个问题。我不确定如果你想混合类型会发生什么,比如纹理坐标的精度较低。不确定这是否是一个好习惯。

不利的一面是,如果您必须循环并更新位置(例如,而不是颜色),则该循环可能会比仅排成一行时稍微复杂一些。


实例化是指您在多个几何实例中使用一个属性。

一种类型是,比如说一个立方体,v1,v1,v1,v2,v2,v2....v24,24,24,24 个顶点描述一个属性中具有锐利边缘的立方体。你可以有另一个有 24 个法线的,另一个有不确定的。如果你想把它定位在某个地方,你可以使用制服,并在位置属性上对其进行一些操作。

如果您想制作 16683 个立方体,每个立方体都有一个单独的位置,您可以发出具有相同立方体边界(属性)的绘制调用,但每次都更改位置统一。

您可以为多维数据集的多个实例创建另一个实例属性pos1,pos1,pos1.....pos16683,pos16683,pos16683,其中包含 16683 个位置。当您发出绑定了这些属性的实例化绘制调用时,您可以在该调用中绘制立方体的所有 16683 个实例。您将拥有另一个属性,而不是使用位置制服。

对于您的点,这是没有意义的,因为它们以 1:1 的比例映射到属性。这意味着,您在该属性内部分配一个点的位置,并且不再需要使用某种制服对其进行转换。通过实例化,您可以将您的观点转化为更复杂的东西,比如立方体。

【讨论】:

以上是关于实例化 vs bufferGeometry vs interleavedBuffer的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC:将模型作为参数传递给控制器​​方法VS显式实例化它

抽象类VS接口

Python3学习之路~6.3 类变量 VS 实例变量

ABP框架 - 介绍 VS2017调试器无法附加到IIS进程(w3wp.exe) c# 动态实例化一个泛型类

提示 未将对象引用设置到对象的实例 怎么处理?

VS提示“非静态的字段,方法或属性要求对象引用”