如果您要使用不同的着色器和/或渲染状态渲染一堆粒子,并且具有一定程度的透明度,那么按深度对所有粒子进行排序的幼稚解决方案可能会非常低效,因为它可能会进行一些大批量绘制调用到许多较小的批处理调用中,这些绘制调用之间需要进行昂贵的渲染状态切换。例如添加混合,无论绘制顺序如何,其结果都相同。内存,或它们的某种组合。

有没有人知道任何实用的解决方案(快速/较低的额外内存要求/不需要绝对正确性)来应对这种情况?

#1 楼

第一种选择应该是使所有粒子都能够通过同一管道。也许使用超级着色器。这样就可以全部批处理。

正ieee浮点数可以像无符号整数一样排序。并且有O(n)个算法可以对这些算法进行排序,例如基数排序。

评论


$ \ begingroup $
通过存储桶排序,您也可以接近n,或者至少小于n log n,这很简单。如果您从BSP / occ树开始,甚至更好,那么免费获得cameara遮挡剔除甚至可以使其小于N。
$ \ endgroup $
– joojaa
17年9月15日在13:03

$ \ begingroup $
对于实时图形工作,BSP和八叉树有点被高估了。所需的所有指针追逐都不利于高速缓存性能。
$ \ endgroup $
–棘轮怪胎
17年9月15日在13:13

$ \ begingroup $
如果您的存储桶很大,那么您可以毫不费力地将工作分摊,但仍然具有跳跃很少的优点
$ \ endgroup $
– joojaa
17年9月15日在13:25

$ \ begingroup $
对我来说,“超级着色器”是这里的神奇调味料,也是一个不错的选择。谢谢!
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
17 Sep 15 '13:42



$ \ begingroup $
如果您有大量粒子,您还可以使用Bitonic Sort使用计算着色器在GPU上对它们进行排序。它是n log n(我认为),但是并行化非常快。旧的DirectX 2010 SDK中有一个有效的实现。
$ \ endgroup $
– russ
17年9月16日在11:54

#2 楼

使用诸如气泡排序之类的算法,在每个渲染周期将粒子按Z排序,当元素以较小的步长改变位置时,这种方法很好。如果视角变化不大,则随着时间的流逝,错误将变得很少,以至于无法察觉。通过调整每个周期执行多少排序,可以轻松地根据目标平台在质量和性能之间进行配置。