将对象数组发送到顶点着色器是否可以?

时间:2014-07-04 00:03:44

标签: opengl-es opengl-es-2.0 webgl vertex-shader

由于性能问题绘制了数千个相似的三角形(具有不同的属性),我想使用一次调用drawElements来绘制所有这些。但是为了绘制每个三角形及其各自的属性(例如:世界位置,颜色,方向),我相信我需要将数组缓冲区发送到我的顶点着色器,其中数组是所有三角形属性的列表。

如果这种做法确实是标准的做法,那么我很高兴知道我的理论是正确的。我只需要知道如何将数组缓冲区发送到着色器。请注意,目前我知道如何发送多个属性和制服(虽然它们在内存中不是连续的,这正是我正在寻找的。)

如果没有,如果驻地专家可以指出我正确的方向,我会很感激。

我有一个相关的问题,因为我在实际实施VBO时遇到了麻烦。 How to include model matrix to a VBO?

1 个答案:

答案 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)

在此之后,您需要注意的是正确的缓冲区绑定/解除绑定,而其余代码应完全相同。