如何在OpenGL中处理每个三角形的许多变量?

时间:2014-05-27 01:19:49

标签: opengl glsl shader

我正在使用OpenGL,并且对于传递值PER TRIANGLE(或者在我的情况下,四边形)的标准方法并不完全满意,这些值需要将其转换为片段着色器,即将它们分配给每个顶点。原始并将它们传递通过顶点着色器,可能在片段着色器中被不必要地插入(除非使用“flat”指令)(换句话说,每个片段不变)。

是否有某种方法可以存储需要在片段着色器中访问的值PER三角形(或四边形),使得每个顶点不需要冗余副本?是这样,这种方式比3x(或4x)数据移动代码CPU端的可能开销要好吗?

我知道使用几何着色器将值扩展到新顶点,但我听说几何着色器在非最新硬件上非常慢。是这样的吗?

2 个答案:

答案 0 :(得分:4)

OpenGL片段语言支持gl_PrimitiveID输入变量,该变量将是当前处理片段的基元索引(每个绘制调用从0开始)。这可以用作保存每个基元数据的某些数据存储的索引。

根据每个基元所需的数据量以及基本数量,可以使用不同的选项。对于少量基元,您可以设置一个统一的数组并将其索引。

对于相当多的原语,我建议使用texture buffer object (TBO)。这基本上是一个普通的缓冲区对象,可以通过texelFetch GLSL操作在随机位置以只读方式访问。请注意,TBO不是真正的纹理,它们只重用现有的纹理对象接口。在内部,它仍然是从缓冲区对象获取数据,并且它非常有效,没有纹理管道的开销。

此方法的唯一问题是您无法轻松混合不同的数据类型。您必须为TBO定义基本数据类型,每次获取都将获得该格式的数据。如果你只需要一些浮点数/向量每个基元,这根本不是问题。如果你是每个基元需要一些整数和一些浮点数,你可以使用不同的TBO,每种类型一个,或者使用现代GLSL(> = 3.30),你可以使用整数类型作为TBO并将整数位重新解释为浮点数intBitsToFloat(),所以你也可以解决这个限制。

答案 1 :(得分:2)

您可以在顶点数组中使用一个元素来渲染多个顶点。它被称为实例顶点属性