这是我在GameDev SE上回答的问题的跟进。问题很简单,当绘制这些实例时,glDrawArraysInstanced是否在OpenGL中并行?

我的回答是:“ GPU可能会根据多个事物并行执行多个绘制调用,例如,如果两次绘制调用使用相同的顶点着色器。”这是完整的答案。

OP在评论中提到:“我认为它应该是顺序的。毕竟,某些混合模式取决于顺序”

现在,我有点困惑。我的回答是,它仍然可以在有效时并行化它们吗?有人可以澄清吗?

#1 楼

结果应该好像一次是依次执行一个三角形。这很重要,因此每个框架都是确定性的。如果不是这样,则多次绘制同一帧可能会产生不同的结果,并在屏幕上创建闪烁的图像。

但这并不意味着并行是不可能的。顶点可以并行计算。它们的结果将被排序并馈送到光栅化器,光栅化器将为片段着色器阶段提供信号。

像素也一样。通常,可以并行计算和融合来自三角形的一组像素。然后也可以同时填充不重叠的三角形,但是,如果三角形与当前繁忙的三角形重叠,则必须缓存片段着色器的结果,直到完成上一个三角形的相应像素为止,这样才能以正确的顺序进行混合。

评论


$ \ begingroup $
完全有可能同时为重叠的三角形运行像素着色器。重要的是混合是按顺序进行的。像素着色器可以按任何顺序启动混合单元的大量工作,然后可以根据混合三角形的来源重新排列所有这些混合操作的顺序。
$ \ endgroup $
– John Calsbeek
2015年11月5日14:44

$ \ begingroup $
我见过由于同一平面上有多个三角形而确实发生闪烁的情况,但我不记得是在照相机/世界/等情况下发生的。变换是静态的,或者需要移动和重新计算。不过,这是一个极端的情况。
$ \ endgroup $
– JAB
2015年11月5日在16:07

$ \ begingroup $
@JAB听起来您是在指z战。这通常是由于以下事实而发生的:即使两个图元在解析上是共面的,内插器中的量化也会产生一种模式,其中来自两个图元的一些像素是可见的。仅当顶点(或摄影机)移动时,图案才会偏移并引起闪烁,否则干涉图案在帧之间应该保持一致。
$ \ endgroup $
–麋鹿男孩
2015年11月5日17:46

$ \ begingroup $
@MooseBoys就是这样,是的。自从我从事3D图形工作以来已经过去了几年。
$ \ endgroup $
– JAB
2015年11月5日,18:43

$ \ begingroup $
除了仅并行运行多个顶点和像素外,如果有足够的GPU资源可用,并且绘制调用之间没有依赖关系,则还可以同时进行多个绘制调用。
$ \ endgroup $
–内森·里德(Nathan Reed)
2015年11月5日在21:15