在OpenGL中,是否保证几何着色器将以原始顺序接收基元内的顶点?

时间:2015-04-05 03:18:32

标签: opengl geometry-shader

例如,如果glDraw *调用绘图GL_TRIANGLES读取一组按顺序指定顶点A,B,C,D,E和F的VBO,那么可以预期在一次几何着色器的调用中,以下情况属实:

  • gl_in [0]描述了A
  • gl_in [1]描述了B
  • gl_in [2]描述了C

人们会期望在另一个调用中,以下情况属实:

  • gl_in [0]描述了D
  • gl_in [1]描述了E
  • gl_in [2]描述了F

等等。

但是,我发现在我找到的任何文件中都没有明确保证。我想如果OpenGL以改变CW / CCW排序的方式任意重新排序顶点,那么许多人的正常查找代码(以及其他类似的东西)可能会失败。但也许允许这样的事情,例如:

  • gl_in [0]描述了B
  • gl_in [1]描述了C
  • gl_in [2]描述了A

OpenGL可以进行重新排序,还是保证不进行重新排序?

1 个答案:

答案 0 :(得分:2)

我在这里使用OpenGL 4.5 core profile specification,但我所说的对于早期版本来说基本上也是如此。对于早期版本,确切的措辞(以及语句的位置)可能会有所不同(特别是在4.3之前,因为规范在该版本中完全重组)。

从第2.1节和第34节;执行模型" (我的重点):

  

基元由一组一个或多个顶点定义。一个顶点   定义一个点,一个线段的端点或一个角   两边相交的多边形。位置坐标等数据   颜色,法线,纹理坐标等与a相关联   顶点和每个顶点独立处理按顺序处理   一样的方法。这个规则的唯一例外是如果该组的   必须剪裁顶点,以便指示的图元适合a   指定地区;在这种情况下,顶点数据可以被修改并且是新的   顶点创建。剪辑类型

这基本上已经保证它不能重新排序顶点。但是,我们可以找到更具体的语言。现在让我们专注于三角形的示例情况。第10.1.8节"单独的三角形"状态

  

使用模式TRIANGLES指定单独的三角形。在这种情况下,   3i + 1st,3i + 2nd和3i + 3rd顶点(按顺序 )   确定每个i = 0的三角形; 1; ...; n - 1,那里   绘制了3n + k个顶点。 k是0,1或2;如果k不为零,   最后的k个顶点被忽略。对于每个三角形,顶点A是   顶点3i和顶点B是顶点3i + 1.否则,单独的三角形   与三角形条相同。

因此,很清楚三角形顶点的顺序是什么。因此,让我们在11.3节中找到几何着色器:

  

处理顶点后,它们被排列成基元,如   在章节中描述   10.1。

上面定义的顺序与此完全相关。现在关于三角形的部分来自11.3.1和#34;几何着色器输入原语":

  

三角形(三角形)

     

对三角形进行操作的几何着色器是   适用于TRIANGLESTRIANGLE_STRIPTRIANGLE_FAN原语   类型。每个程序调用都有三个顶点。   第一个,第二个和第三个顶点指的是第一个,   分别是三角形的第二和第三个顶点

这与10.1.8节的引用一起使得它非常清楚,绘制调用的确切顺序可以保证显示在每个几何着色器调用中。

但是,不同几何着色器调用的顺序当然是未定义的,如7.12.1"着色器内存访问顺序"中所述:

  

相同着色器类型的调用的相对顺序是   undefined。在处理原始B时由着色器发出的商店   即使原始A,也可能在原始A的商店之前完成   在原语B之前指定。这甚至适用于片段   着色器;片段着色器输出始终写入   framebuffer以原始顺序,由片段着色器执行的存储   调用不是。

但无论如何,这是并行架构的预期,所以这里没什么意外。