[ZZ] KlayGE 游戏引擎 之 Order Independent Transparency(OIT)

转载请注明出处为KlayGE游戏引擎,本文的永久连接为http://www.klayge.org/?p=2233web

http://dogasshole.iteye.com/blog/1429665算法

http://www.gdcvault.com/api

 

2009年AMD在发布HD 5800的时候也发布了一个Order Independent Transparency(OIT)的demo,但只有介绍,没有多少能够参考的东西。GDC 2010上的OIT and GI using DX11 linked lists才给出了比较完整的算法细节。虽然说这几年也有很多新的OIT算法出现,但做为具备标杆意义的OIT算法,Per-Pixel Linked Lists仍是值得实现到KlayGE的开发版本中,以作对比。数据结构

算法

顾名思义,Per-Pixel Linked Lists的意思就是每一个pixel上一个链表,存放属于该pixel的全部fragment。这种不均匀的数据结构对GPU来讲是很要命的。框架

在Per-Pixel Linked Lists中,链表须要两个额外的buffer,一个称为fragments buffer,须要是屏幕尺寸的N倍,负责存放全部的fragment;另外一个是start offset buffer,和屏幕尺寸相同,存放每一个pixel的链表队头。构造出存储的数据结构后,算法自己就变得很简单了,只有两步:ssh

  1. PS计算出shading后的颜色,让fragments buffer自带的计数器加一,获得一个空间后把颜色和深度存进去,同时更新该像素位置对应的start offset buffer。
  2. 在post process里,PS从start offset buffer读到队头,由此索引这个pixel的整个链表,根据深度进行排序,而后按顺序作alpha blending。

因而可知,该算法只须要在原有流水线PS里加上几行,同时多一个全屏post process便可完成。全部的fragment只须要通过PS一次,绝无浪费。相对于之前流行的OIT方法Depth Peeling来讲,在相同层数的状况下,Per-Pixel Linked Lists的结果与其彻底相同,并无近似计算,但理论性能要高得多。由于Depth Peeling若是要peeling N层,全部的fragment就要生成N次,并丢弃大部分fragment,就剩下须要剥离的那层fragment。wordpress

实际测试的结果也证明了以前的分析,一样的结果,在NVS 4200M上,Per-Pixel Linked Lists能够跑到62.47FPS,而Depth Peeling只能46.05FPS。post

Per-Pixel Linked Lists

限制

固然,Per-Pixel Linked Lists至少要在D3D11的硬件上才能实现。以前的硬件不支持PS写入UAV,也没有附在buffer上的原子计数器。因此除非用GPGPU的方法实现一个软件光栅化,不然无法绕开这些限制。性能

另外一个明显的限制来自于空间占用。由于没法事先知道链表会有多长,fragments buffer只能申请一个比较大的空间,可能会浪费很多,也可能会溢出。并且由于fragment添加的顺序是乱的,无法像Depth Peeling那样只要前几层。因此,这个方法的空间消耗是不可控的。测试

除了OIT还能作什么

理论上,全部非近似的OIT方法,都能用来作voxelization。在去年的一篇blog将来属于SVO?中就提到了如何用从conservative rasterize配合Per-Pixel Linked Lists,在一个pass内直接把mesh转成voxel表达。

因为存储了场景的全部fragment,甚至能够直接在里面作光线跟踪。不过显然这么作不如就用SVO那套框架有效率了。

 

 

 

 

http://dogasshole.iteye.com/blog/1429665

http://www.gdcvault.com/这里能够下到。

 

per pixel link list能够作到order independent translucency rendering。

以前一直恶心你们的这个东西终于能够在dx11干掉了,screenshot:

 

 

纠缠api没什么意思,比较有意义的是能够作到能够给每一个pixel创建一个linklist这件事情:

 

这个太nice了,除了order independent translucency,不少酷的算法均可以作到了像:translucency deferred lighting等。

 

这个性能消耗估计也会“物有所值”了。

相关文章
相关标签/搜索