11

我一直在阅读openGL规范,试图找到这个问题的答案,但没有运气。我试图弄清楚OpenGL是否保证诸如GLDrawElements或GLDrawArrays之类的绘制调用将按照它们在VBO中出现的顺序精确地绘制元素,或者是否可以自由地以任何顺序处理这些图元的片段。

例如,如果我有一个顶点缓冲区,它有 30 个顶点,代表 10 个三角形,每个三角形都有相同的坐标。会不会总是先渲染顶点 0、1 和 2 对应的三角形(因此在底部);并且对应于顶点 28、29、30 的三角形总是最后渲染(因此在顶部)?

4

2 回答 2

14

该规范非常谨慎地定义了所有内容的渲染顺序。顶点数据数组按顺序处理,从而导致以特定顺序生成图元。据说每个图元都按顺序光栅化,并且在前面的图元完成之前,后面的图元不能光栅化。

当然,这就是 OpenGL 所说的它应该表现的方式。实现可以(并且确实)通过一次光栅化和处理多个基元来作弊。但是,他们仍然会遵守“好像”规则。所以他们在内部作弊,但仍然会写出结果,就好像它都是按顺序执行的一样。

所以是的,你可以依赖一个特定的顺序。除非您使用的是执行不连贯内存访问的着色器;然后所有的赌注都用于着色器写入。

于 2013-08-05T18:34:11.183 回答
2

尽管它们实际上可能以不同的顺序绘制并在不同的时间完成,但在最后一个光栅操作管道阶段,任何混合(或深度/模板/alpha测试)都将按照三角形发出的顺序完成.

您可以通过使用不通勤的混合方程渲染某些对象来确认这一点,例如:

glBlendFunc(GL_ONE, GL_DST_COLOR);

如果最终帧缓冲区内容的写入顺序与绘制图元的任意顺序相同,那么在这样的示例中,您会看到类似于 Z 战斗的效果。

这就是为什么它被称为片段着色器(而不是像素着色器)的原因,因为它还不是像素,因为在片段阶段之后它还没有被写入帧缓冲区;只有在光栅运算阶段之后。

于 2013-08-06T15:57:09.983 回答