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

问题描述 投票:0回答:1

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

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

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

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

opengl-es opengl-es-2.0 webgl vertex-shader
1个回答
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的颜色或使用一些便利,如在C中的offsetof(Vertex, color)。你需要设置步幅,这将是Vertex结构的大小,所以你可以使用sizeof(Vertex)或硬编码sizeof(float)*(3+4+3)

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

© www.soinside.com 2019 - 2024. All rights reserved.