由于性能问题绘制了数千个相似的三角形(具有不同的属性),我想使用一次调用drawElements来绘制所有这些。但是为了绘制每个三角形及其各自的属性(例如:世界位置,颜色,方向),我相信我需要将一个数组缓冲区发送到我的顶点着色器,其中数组是所有三角形属性的列表。
如果这种方法确实是标准的方法,那么我很高兴知道我的理论是正确的。我只需要知道如何将数组缓冲区发送到着色器。请注意,目前我知道如何发送多个属性和制服(虽然它们在内存中不连续,这是我正在寻找的)。
如果没有,如果驻地专家可以指出我正确的方向,我将不胜感激。
我有一个相关的问题,因为我在实际实现VBO时遇到了麻烦。 How to include model matrix to a VBO?
你确实理论正确,让我清楚一些事情......
您只能通过使用属性的指针“将顶点数组”发送到顶点着色器,因此这部分代码保持几乎相同。您所做的似乎是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
的颜色或使用一些便利,如在C中的offsetof(Vertex, color)
。你需要设置步幅,这将是Vertex
结构的大小,所以你可以使用sizeof(Vertex)
或硬编码sizeof(float)*(3+4+3)
。
在此之后,您需要注意的是正确的缓冲区绑定/解除绑定,而其余代码应该完全相同。