绘制像素的顺序是否取决于glDrawElements中的索引?

Bor*_*rov 2 opengl

我正在绘制几个与单个glDrawElements调用重叠的alpha混合三角形.

索引将三角形列回到前面,此顺序对于正确的可视化非常重要.

我可以依赖此操作的结果与使用不同的绘制调用以相同顺序绘制三角形时完全相同吗?

我问这个是因为我不确定某些硬件是否会进行某种优化,并且只使用索引来获取有关绘制的基元的信息并忽略实际的基本顺序.

der*_*ass 8

为了第二个GuyRT的答案,我查看了GL4.4核心规范:

glDrawElements 描述如下(强调我的):

该命令通过连续地将计数顶点的元素传递给GL来构造一系列几何图元.

在2.1节中,可以找到以下声明(强调我的):

命令总是按它们被接收的顺序处理,[...] 这意味着,例如,在任何后一个原语影响帧缓冲区之前必须完全绘制一个原语.

有人可能会认为这只对通过不同的绘制调用(命令)呈现的原始数据有效,但是,在7.12.1中,对于该语句的更一般的解释读数还有一些进一步的确认(同样,我的重点):

相同着色器类型的调用的相对顺序是未定义的.在处理基元B时由着色器发出的存储可能在基元A的存储之前完成,即使在基元B之前指定基元A.这甚至适用于片段着色器; 片段着色器输出以原始顺序写入帧缓冲区,而片段着色器调用执行的存储不是.


Guy*_*yRT 4

是的,您可以依赖与索引数组中指定的顺序相同的顺序,并且片段将与数组中先前指定的三角形的结果正确混合。

我找不到这方面的参考,但我的 UI 渲染代码依赖于这种行为(我认为这是一种常见的技术)。

  • 我 99% 确信这是正确的。我唯一的疑问是在规范中没有找到明确的保证。附录 A(不变性)可能暗示了这一点,但我不这么认为。我当前使用此代码的代码仅在 Nvidia 560 和 RasberryPi(使用 ES 2)上运行。我想我过去曾在向公众发布的项目中使用过这种技术(抱歉 - 很久以前)。我确实记得问过这个问题并收到了这个答案。我还记得读过有关在混合到目标缓冲区之前按基元对像素进行排序的管道的信息。抱歉,我不能再含糊了。 (2认同)