由于性能问题绘制了数千个相似的三角形(具有不同的属性),我想使用一次调用drawElements来绘制所有这些。但是为了绘制每个三角形及其各自的属性(例如:世界位置,颜色,方向),我相信我需要将数组缓冲区发送到我的顶点着色器,其中数组是所有三角形属性的列表。
如果这种做法确实是标准的做法,那么我很高兴知道我的理论是正确的。我只需要知道如何将数组缓冲区发送到着色器。请注意,目前我知道如何发送多个属性和制服(虽然它们在内存中不是连续的,这正是我正在寻找的。)
如果没有,如果驻地专家可以指出我正确的方向,我会很感激。
我有一个相关的问题,因为我在实际实施VBO时遇到了麻烦。 How to include model matrix to a VBO?
答案 0 :(得分:1)
你的理论是正确的,让我澄清一些事情......
您只能通过使用属性的指针将“顶点数组”发送到顶点着色器,因此这部分代码保持几乎相同。您所做的似乎是2个优化,将整个缓冲区放在GPU上并使用交错的顶点数据。
要将整个缓冲区放在GPU上,您需要使用注释中已提到的VBO。通过这样做,您可以在GPU上创建一个原始缓冲区,您可以将所需的任何数据放入其中,甚至可以在运行时根据需要进行修改。在你的情况下,这将是顶点数据。要使用非交错数据,您可能会为每个,位置,颜色,方向创建一个缓冲区......
要使用交错数据,您需要将它们按顺序放入缓冲区中,如果可能,最好创建一个包含所有顶点数据(单个顶点,而不是整个数组)的数据结构,并将它们发送到缓冲区(一个简单的原始数组也可以工作)。这种结构的C例子:
typedef union {
struct {
float x,y,z; //position
float r,g,b,a; //color
float ox,oy,oz; //orientation
};
struct {
float position[3];
float color[4];
float orientation[3];
};
}Vertex;
在使用此数据时,您需要做的是设置正确的指针。在VBO中,您从NULL
(0)开始,这将代表在这种情况下的位置,设置您必须使用的颜色((float *)NULL)+3
或使用一些便利,例如offsetof(Vertex, color)
in C.使用它还需要设置步幅,即Vertex
结构的大小,以便您可以使用sizeof(Vertex)
或硬编码sizeof(float)*(3+4+3)
。
在此之后,您需要注意的是正确的缓冲区绑定/解除绑定,而其余代码应完全相同。