我正在绘制几个与单个glDrawElements
调用重叠的alpha混合三角形。
索引将三角形列回到前面,此顺序对于正确的可视化非常重要。
我可以依赖此操作的结果与使用不同的绘制调用以相同顺序绘制三角形时完全相同吗?
我问这个是因为我不确定某些硬件是否会进行某种优化,并且只使用索引来获取有关所绘制图元的信息,而忽略实际的图元顺序。
答案 0 :(得分:7)
对于第二个GuyRT的回答,我查看了GL4.4 core spec:
glDrawElements
描述如下(强调我的):
此命令构造一个 序列的几何图元 连续将计数顶点的元素传递给GL。
在2.1节中,可以找到以下声明(强调我的):
命令总是按接收顺序处理, [...] 这意味着,例如,必须绘制一个基元 完全在任何后续的影响帧缓冲之前。
一个可能读取此内容仅对通过不同的绘制调用(命令)呈现的原始元素有效,但是,在7.12.1中,对该语句的更一般的解释读取还有一些进一步的确认(再次,我的重点):
相同着色器类型的调用的相对顺序是 未定义。在处理原始B时由着色器发布的商店 即使原始A,也可能在原始A的商店之前完成 在原语B之前指定。这甚至适用于片段 着色器; 将片段着色器输出写入帧缓冲区 按原始顺序,由片段着色器调用执行的存储是 不
答案 1 :(得分:3)
是的,您可以依赖于索引数组中指定的顺序,并且该片段将与数组中先前指定的三角形结果正确混合。
我找不到这方面的参考,但我的UI渲染代码依赖于这种行为(我认为这是一种常见的技术)。
答案 2 :(得分:1)
据我所知,OpenGL没有说明在任何类型的单个绘制调用中呈现的三角形的顺序。这样做会适得其反,因为它会对实现产生不良约束。
考虑到现代渲染硬件几乎总是多处理器,因此绘制调用中的各个三角形几乎肯定是并行渲染的。如果需要按特定顺序渲染以进行Alpha混合,则需要拆分几何体。或者,您可以调查各种与顺序无关的透明度算法。