Opengl es 可以将对象数组发送到顶点着色器吗?

Opengl es 可以将对象数组发送到顶点着色器吗?,opengl-es,opengl-es-2.0,webgl,vertex-shader,Opengl Es,Opengl Es 2.0,Webgl,Vertex Shader,由于绘制数千个类似的三角形(具有不同的属性)存在性能问题,我想使用一个对抽屉元素的调用来绘制所有这些三角形。但为了绘制每个三角形及其各自的属性(例如:世界位置、颜色、方向),我认为我需要向顶点着色器发送一个数组缓冲区,其中数组是所有三角形属性的列表 如果这种方法确实是标准的方法,那么我很高兴知道我的理论是正确的。我只需要知道如何将数组缓冲区发送到着色器。请注意,目前我知道如何发送多个属性和制服(尽管它们在内存中不是连续的,这是我正在寻找的) 如果不是的话,如果一位常驻专家能为我指出正确的方向,我

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

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

如果不是的话,如果一位常驻专家能为我指出正确的方向,我将不胜感激

我有一个相关的问题,因为我在实际实现VBO时遇到了困难。
你的理论是正确的,让我澄清几件事

您只能通过使用属性的指针“发送顶点数组”到顶点着色器,因此代码的这一部分基本保持不变。您似乎正在寻找的是2种优化,将整个缓冲区放在GPU上,并使用交错顶点数据

要将整个缓冲区放在GPU上,您需要使用VBOs,如注释中所述。通过这样做,您可以在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中的
偏移(顶点,颜色)
。这样,您还需要设置跨距,这将是
Vertex
结构的大小,因此您可以使用
sizeof(Vertex)
或硬编码
sizeof(float)*(3+4+3)


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

听起来您正在寻找顶点缓冲区对象(VBO)。快速搜索此VBO和OpenGL ES 2.0会产生各种各样的示例。对于如何实现此功能,我仍然非常困惑。我需要一个概念性的例子/教程/图表/详细的解释。具体地说,如果我有一个包含多个对象的缓冲区,顶点着色器如何知道它当前处于哪个“对象索引”上(或者这是开发人员自动/透明的)?这是我对VBO看到的最详细的解释。不幸的是,它仍然模糊不清。您能提供一个工作示例或在线参考吗?具体来说,我需要一个向VBO缓冲区发送数据对象数组的示例。此外,何时应将此类数据发送到缓冲区-每个渲染周期,还是在初始化时间内发送一次?这些数据将一直保留,直到您显式删除它们。如果可能,请在初始化时尝试创建此数组。您可以在通过glBufferData创建缓冲区时直接发送数据,但此数据参数可以为NULL,您可以稍后发送数据。其他方法是使用子数据或获取直接指向数据的指针,在那里您可以随心所欲。我希望这可能有助于澄清一些问题: