[gpu pro]MultiFragments Effects on the GPU using bucket sort

来源:互联网 发布:server数据库基础知识 编辑:程序博客网 时间:2024/04/29 07:38

这篇文章牵连的东西比较多,一些思路比较有意思,实用性在realtime game rendering里面比较有限,但是如果用于一些工具对于模型的处理应该会有一些用武之地。

multi fragments effects

这个是指以order independent translucensy为代表的,这种多个fragments之间需要一定交互的效果。

就目前来看最好的算法应该是direct compute使用fragment list来做了。

depth peeling

这个是处理order independent translucency早起经典的算法。

相关的文章可以看:

  • file:///F:/drive/SkyDrive/HardCore/render/transparent/order_independent_transparency.pdf
  • file:///F:/drive/SkyDrive/HardCore/render/transparent/DualDepthPeeling.pdf

使用多个depth,多个rendertarget,把scene render多遍,一层层这样画过去的方式。
比如,第一遍构建了离camera最近的depth和rendertarget,然后再画一遍,保留比第一遍depth值大的fragments中,depth值最小的,以此类推。
后面硬件能力越来越强,比如在dual depth peeling,nv使用当时最新硬件(g80架构)里面支持floating point mrt, max的blending operation,所以算法得到改进。

dual depth peeling
是从两个方向向中间同时做peeling,

使用一个rgbaf32的rendertarget作为depth peeling buffer,两个rgba8的render target一个记录前到后的,一个是后到前的。
这里会有一个问题就是,我们不能拿一个fragment的depth值和存depth的rendertarget里面的值做比较,如果符合条件就写入depth render target。
这样会造成read-modify-write hazard。
处理的方法是使用max的blending operation。

比较操作仍然在pixel shader里面做,输出的时候使用max的blending operation,这里floating point的威力就显现出来了,由于一个是front to back,一个是back to front,全用理应是一个max,一个是min,那么我们可以把第二个取一个反,输出(depth0,-depth1),这样都用max就可以了。

bucket sort
这里的bucket sort和标准做法的思想是一样的:http://en.wikipedia.org/wiki/Bucket_sort
核心思想是切割。
利用新硬件有更大数量的mrt(bucket sort用到了8个,简直丧心病狂了),把depth区域分成了n等份,一个fragment落到那里,就写到哪里,这样一遍就构建好了。
最后compoe到一起就好。
但是很多情况depth分布不是这么平均,一个做法是对于比较密集的地方,再来一个或多个pass,进行细分。
另外一个做法是做一个叫depth histogram的buffer,一个rgbaf32的rendertarget有32x4个bit,8个就是1024个,这样把depth range分成了1024每一个fragment落在其中的一个,如果再细就不管了。
这样现来一个geometry pass,把depth histogram构建好,再来一遍就可以根据这个histogram来做adaptive(而不是上面这种平均分)的构建了。

总之想法是有点小变态,多种方法融合灵活应用,虽然实战性差点,但是颇有启发性,我喜欢。