转载请注明出处为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. Android 判断app是否在前台运行

    <!-- 前台还是后台 --> <uses-permission android:name="android.permission.GET_TASKS" /> ...

  2. cut mysqladmin

    [root@86 ~]# mysqladmin -uroot -p123456 -S /tmp/mysql.sock status Uptime: 112403 Threads: 17 Questio ...

  3. 免费电子书:微软Azure基础之Azure Automation

    (此文章同时发表在本人微信公众号"dotNET每日精华文章") Azure Automation是Azure内置的一项自动化运维基础功能,微软为了让大家更快上手使用这项功能,特意推 ...

  4. ML 03、机器学习的三要素

    机器学习算法原理.实现与实践——机器学习的三要素 1 模型 在监督学习中,模型就是所要学习的条件概率分布或决策函数.模型的假设空间包含所有可能的条件概率分布或决策函数.例如,假设决策函数是输入变量的线 ...

  5. 【HTML5】Server-Sent服务器发送事件

    Server-Sent 事件 - 单向消息传递 Server-Sent 事件指的是网页自动获取来自服务器的更新. 以前也可能做到这一点,前提是网页不得不询问是否有可用的更新.通过服务器发送事件,更新能 ...

  6. Android 设计中的.9.png

    在 Android 的设计过程中,为了适配不同的手机分辨率,图片大多需要拉伸或者压缩,这样就出现了可以任意调整大小的一种图片格式“.9.png”.这种图片是用于Android开发的一种特殊的图片格式, ...

  7. HUST1024 dance party(最大流)

    题目大概说有n男n女,男的每回合要和不同女的跳舞,男女都有自己喜欢一起跳舞的对象,他们最多能容忍和k个不喜欢的人跳舞,问舞会最多能进行几个回合. 二分枚举回合用最大流判断:男和女各拆成两点i.i'和j ...

  8. FZU2219 StarCraft(哈夫曼树)

    一个工人可以变成两个工人,这样可以画出一颗二叉树,那么就是在叶子上建的建筑. 问题的时间花费,可以看作是这颗二叉树中各个叶子的深度*k+叶子对应建筑耗费时间中的最大值. 容易想到,类似哈夫曼树一样,从 ...

  9. CodeForces Round 197 Div2

    这次出的题水爆了,借着这个机会终于把CF的号变蓝了.A. Helpful Mathstime limit per test2 secondsmemory limit per test256 megab ...

  10. 【POJ】2318 TOYS(计算几何基础+暴力)

    http://poj.org/problem?id=2318 第一次完全是$O(n^2)$的暴力为什么被卡了-QAQ(一定是常数太大了...) 后来排序了下点然后单调搞了搞..(然而还是可以随便造出让 ...