我一直在阅读openGL规范,试图找到这个问题的答案,没有运气。我试图弄清楚OpenGL是否保证绘制调用(如GLDrawElements或GLDrawArrays)将按照它们在VBO中出现的顺序绘制元素,或者是否可以按任意顺序自由处理这些基元的片段。
例如,如果我有一个顶点缓冲区,其中30个顶点代表10个三角形,每个顶点具有相同的坐标。是否总是会出现对应于顶点0,1和2的三角形将首先渲染(因此在底部);并且对应于顶点28,29,30的三角形总是最后渲染(因此在顶部)?
答案 0 :(得分:13)
规范非常谨慎地定义渲染所有内容的顺序。按顺序处理顶点数据的数组,这导致以特定顺序生成基元。据说每个图元按顺序进行光栅化,后来的图元不能光栅化,直到之前的图元完成。
当然,这就是OpenGL所说的应该如何表现的。实现可以(并且确实)通过一次栅格化和处理多个基元来作弊。 然而,他们仍然会遵守“似乎”规则。所以他们在内部作弊,但仍然会将结果写成 ,好像 它已经按顺序执行。
是的,您可以依赖特定的订单。除非你使用perform incoherent memory accesses的着色器;然后所有的投注都是关于着色器写的。
答案 1 :(得分:2)
虽然它们实际上可能以不同的顺序绘制并在不同的时间完成,但在最后一个光栅操作管道阶段,任何混合(或深度/模板/ alpha测试)将按照以下顺序完成:发布了三角形。
您可以使用不通勤的混合方程渲染某些对象来确认这一点,例如:
glBlendFunc(GL_ONE, GL_DST_COLOR);
如果最终的帧缓冲内容是按照可以绘制基元的相同任意顺序编写的,那么在这样的例子中,你会看到一个看起来类似于Z-fighting的效果。
这就是为什么它被称为片段着色器(与像素着色器相对),因为它不是像素,因为在片段阶段之后它还没有被写入帧缓冲器;仅在光栅操作阶段之后。