OpenGL:如何将具有可变大小的向量传递给着色器?

时间:2014-04-17 20:58:05

标签: opengl

将可变大小的数据(对于每个顶点不是唯一的,而是对顶点组通用)传递到着色器的有效方法是什么?

例如,我有三个顶点数不同的多边形。每个多边形具有不同的颜色并均匀着色(每个多边形的片段具有相同的颜色)。将顶点属性中的多边形颜色作为向量包含多边形中每个顶点的相同颜色值似乎无效。我的想法是为每个多边形分配一个唯一的数字(从零开始),创建一个具有三个颜色值的矢量(每个多边形一种颜色),并为每个顶点传递一个颜色值(四个浮点数),但多边形顶点所属的数字(一个整数)。然后让着色器使用多边形数作为索引从颜色的矢量中获取多边形颜色。

多边形的颜色值可以通过“着色器存储块”在可变长度的矢量(编译期间未指定大小的矢量)中传递,然后着色器可以访问它。

是否有其他方法(可能是常用技术)将可变大小的矢量传递给着色器?

2 个答案:

答案 0 :(得分:1)

这正是Buffer Texture Objects的用例。

答案 1 :(得分:0)

最简单的方法是管理除顶点数据之外的颜色,并将其统一传递给着色器。但只有当矢量中的每个顶点的颜色相同时。然而,如果每个基元(或每个顶点)的颜色变化都不介意,那么通过索引等进行计算所隐含的开销比简单地将每个顶点的数据刷新到视频内存更糟糕! (除非这已经成为你的瓶颈,但它现在不应该与硬件相关)

要快速刷新矢量中的数据进行渲染,最好的方法是创建一个 vertex buffer object

你基本上创建了一个庞大的顶点池(和索引,具体取决于你的精确用法)。使用glDrawElements(或glDrawArray),您可以控制要呈现的类型的原始数量。

保留一个顶点缓冲区对象,其中包含您在预先中可能需要的最大假定内存大小,因此您可以避免一次又一次地重新创建它的开销。初始化要渲染的基元数量为0.每次向量更改时,将数据复制到顶点缓冲区对象,从向量中的第一个顶点到最后一个顶点。修改要渲染的基元数。就是这样,剩下的完整开销只是将向量刷新到顶点缓冲区对象。没有复杂的簿记或类似要求。