【问题标题】:Is it okay to send an array of objects to vertex shader?可以将对象数组发送到顶点着色器吗?
【发布时间】:2014-07-04 00:03:44
【问题描述】:

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

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

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

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

【问题讨论】:

  • 听起来您正在寻找顶点缓冲区对象 (VBO) 快速搜索此 VBO 和 OpenGL ES 2.0 会产生各种样本。
  • 我对如何实现这一点仍然非常多云/困惑。我需要一个概念性示例/教程/图表/详细说明。具体来说,如果我有一个包含多个对象的缓冲区,顶点着色器如何知道它当前位于哪个“对象索引”上(或者这对开发人员来说是自动/透明的)?

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


【解决方案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)

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

【讨论】:

  • 这是我见过的关于 VBO 的最详细的解释。不幸的是,它仍然很模糊。您能否提供一个工作示例或在线参考资料?
  • 具体来说,我需要一个将数据对象数组发送到 VBO 缓冲区的示例。此外,这些数据应该何时发送到缓冲区 - 每个渲染周期,还是在初始化期间一次?
  • 这些数据将一直存在,直到您明确删除它们。如果可能,请在初始化时尝试创建此数组。您可以在通过 glBufferData 创建缓冲区时直接发送数据,但此数据参数可以为 NULL,您可以稍后发送数据。然后其他方法是使用 subData 或获取指向数据的直接指针,您可以在其中做任何您想做的事情。我希望这可能有助于澄清一些事情:en.wikipedia.org/wiki/Vertex_Buffer_Object
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多