如果我使用GL_LINES
或GL_LINE_STRIP
绘制多段线,是否可以假定顶点索引较低的线段首先绘制到帧缓冲区?就像,当我使用顶点v0,v1,v2指定一条线带时,我可以假设首先渲染段v0v1,然后渲染v1v2吗?
答案 0 :(得分:3)
OpenGL标准的定义是,一切都将“表现为”一切都以特定顺序执行。这样,它为几乎所有事物定义了严格的顺序。
对于渲染命令中的顶点和图元,是的,有一个顺序。具体来说,一切都按照您提交数据的顺序进行。在glDrawArrays/Elements
调用中,从头到尾依次提取每个顶点。随着顶点被转换为图元,该装配对生成的图元进行排序。这些基元是按其入射顶点遇到的顺序生成的。
或者更确切地说,OpenGL的行为就像“遵循”提交顺序一样。然而,事实是,您唯一能了解其中任何一个是否正确的地方是它们的片段被放入帧缓冲区的顺序。因此,实现可以异步处理基元,然后根据提交顺序对这些基元中的各个像素数据进行混合。
但是这些是实现细节。关键是,如果在同一绘制调用中渲染2条线,并且它们重叠并且启用了混合功能,则OpenGL 保证,它们的渲染方式将类似于由前两个顶点形成的线阵列中的顶点被完全渲染,然后渲染了从以后的顶点形成的线。因此,它们将按该顺序混合。
在OpenGL中唯一无顺序的渲染操作是incoherent memory accesses和tessellation生成的图元的顺序。后者仅允许它们在该补丁中无序;必须先渲染(仿佛)来自一个细分化补丁中的所有图元,然后再渲染之后的任何图元。