例如,如果glDraw *调用绘图GL_TRIANGLES读取一组按顺序指定顶点A,B,C,D,E和F的VBO,那么可以预期在一次几何着色器的调用中,以下情况属实:
人们会期望在另一个调用中,以下情况属实:
等等。
但是,我发现在我找到的任何文件中都没有明确保证。我想如果OpenGL以改变CW / CCW排序的方式任意重新排序顶点,那么许多人的正常查找代码(以及其他类似的东西)可能会失败。但也许允许这样的事情,例如:
OpenGL可以进行重新排序,还是保证不进行重新排序?
答案 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;几何着色器输入原语":
三角形(三角形)
对三角形进行操作的几何着色器是 适用于
TRIANGLES
,TRIANGLE_STRIP
和TRIANGLE_FAN
原语 类型。每个程序调用都有三个顶点。 第一个,第二个和第三个顶点指的是第一个, 分别是三角形的第二和第三个顶点。
这与10.1.8节的引用一起使得它非常清楚,绘制调用的确切顺序可以保证显示在每个几何着色器调用中。
但是,不同几何着色器调用的顺序当然是未定义的,如7.12.1"着色器内存访问顺序"中所述:
相同着色器类型的调用的相对顺序是 undefined。在处理原始B时由着色器发出的商店 即使原始A,也可能在原始A的商店之前完成 在原语B之前指定。这甚至适用于片段 着色器;片段着色器输出始终写入 framebuffer以原始顺序,由片段着色器执行的存储 调用不是。
但无论如何,这是并行架构的预期,所以这里没什么意外。