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

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

http://www.gdcvault.com/

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的链表队头。构造出存储的数据结构后,算法本身就变得很简单了,只有两步:

  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。

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

限制

当然,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等。

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

[ZZ] KlayGE 游戏引擎 之 Order Independent Transparency(OIT)的更多相关文章

  1. (转)KlayGE游戏引擎 :高效的GBUFFER管理方式

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=3304 个顶点.这样的数据对GPU来说是很头疼的.所以引擎往往需要在Buffer上做一些工作来 ...

  2. Order Independent Transparency

    http://on-demand.gputechconf.com/gtc/2014/presentations/S4385-order-independent-transparency-opengl. ...

  3. 最先进的开源游戏引擎KlayGE 4.4发布

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2785 随着半年一个新版本的周期,今天KlayGE 4.4正式发布了!在这个版本的开发中,多名 ...

  4. 最先进的开源游戏引擎KlayGE 4.3发布

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2536 经过KlayGE团队半年来的努力,今天KlayGE 4.3正式发布了!在这个版本的开发 ...

  5. 游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)

    (转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)   重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering ...

  6. (转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)

    重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering Path Details 正向渲染路径细节 Forward Rend ...

  7. 游戏引擎架构 (Jason Gregory 著)

    第一部分 基础 第1章 导论 (已看) 第2章 专业工具 (已看) 第3章 游戏软件工程基础 (已看) 第4章 游戏所需的三维数学 (已看) 第二部分 低阶引擎系统 第5章 游戏支持系统 (已看) 第 ...

  8. 游戏引擎网络开发者的64做与不做(二A):协议与API

    [编者按]在这个系列之前的文章"游戏引擎网络开发者的64做与不做(一):客户端方面"中,Sergey介绍了游戏引擎添加网络支持时在客户端方面的注意点.本文,Sergey则将结合实战 ...

  9. Cocos2d-android游戏引擎-介绍

    一.游戏引擎概念 什么是游戏引擎       游戏引擎是指一些已编写好的可编辑游戏系统或者一些交互式实时图像应用程序的核心组件.这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计 ...

随机推荐

  1. javascript输出AscII码扩展集中的字符

    function test(){ var c=""; for(var i=1;i<65536;i++){ if((i%10)==0){ c+=i+':\t'+String.f ...

  2. hadoop中常见元素的解释

    secondarynamenode 图: secondarynamenode根据文件的的大小对namenode的编辑日志和镜像日志 进行合并. 光从字面上来理解,很容易让一些初学者先入为主的认为:Se ...

  3. php 获取当前时间

    <?php echo $showtime=date("Y-m-d H:i:s");?>

  4. ajax该什么时候用

    第一.请求的提交是为了页面数据的显示,这时候用户一般不希望看到页面的刷新,是使用AJAX的一个最佳时候. 第二.如果请求提交后,用户能从页面感觉到提交结果,这时候,也最好不要有页面刷新,推荐使用AJA ...

  5. kmp算法详解

    转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...

  6. C++学习网站总结(转)

    总结帖: http://club.topsage.com/thread-361504-1-1.html Visual C++ (VC) / MFC 电子书下载: Visual C++ 2008 入门经 ...

  7. matlab练习程序(图像球面化)

    十一没什么事干,接着看图像算法. 这个球面化算法最初是在ps上的球面化滤镜中看到的,感觉挺有意思,就研究了一下. 算法的详细推导可以在这篇博客中找到,我比较懒,只在纸上推了一遍,就不在博客上编辑了. ...

  8. 用indexOf判断设备

    通过userAgent去判断,先判断是否为移动端,可以判断是iOS终端和Android终端,也可以具体到应用进行判断微信,微博,qq访问. <!DOCTYPE html> <html ...

  9. 递推DP URAL 1119 Metro

    题目传送门 /* 题意:已知起点(1,1),终点(n,m):从一个点水平或垂直走到相邻的点距离+1,还有k个抄近道的对角线+sqrt (2.0): 递推DP:仿照JayYe,处理的很巧妙,学习:) 好 ...

  10. BZOJ3775 : 点和直线

    设第$i$条直线的解析式为$a_ix+b_iy+c_i=0$,$d_i=a_i^2+b_i^2$,则要求一个点$(x,y)$,使得$\sum\left(\frac{\left|a_ix+b_iy+c_ ...