转载请注明出处为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. mysql_1

    1.mysql> select NOW();等效于select user()\g+---------------------+| NOW()               |+---------- ...

  2. tuple元组(C++11及以后,如C++14)

    类tuple与array最本质的区别当数tuple元组元素类型可以不一样,而统一数组array的元素类型必须一样. 本文主要举例: tuple_size Example 123456789101112 ...

  3. Log4Net异常日志记录在asp.net mvc3.0的应用(转载)

    这篇博客写的很好:http://www.cnblogs.com/qianlifeng/archive/2011/04/22/2024856.html 前言 log4net是.Net下一个非常优秀的开源 ...

  4. Android JNI(转)

    JNI,全称Java Native Interface,是用于让运行在JVM中的Java代码和运行在JVM外的Native代码(主要是C或者C++)沟通的桥梁.代码编写者即可以使用JNI从Java的程 ...

  5. android native开发时:java.lang.UnsatisfiedLinkError: Native method not found的处理

    这个异常一般是由于JNI的链接器不能正常识别C++的函数名造成的.处理的方法是用exern "C" {},来包裹需要export的C++的native方法. 如果native的方法 ...

  6. Spring的自定义标签

    当Spring拿到一个元素时首先要做的是根据命名空间进行解析,如果是默认的命名空间,则使用parseDefaultElement方法进行元素解析,否则使用parseCustom Element方法进行 ...

  7. 简单几何(四边形形状) UVA 11800 Determine the Shape

    题目传送门 题意:给了四个点,判断能构成什么图形,有优先规则 分析:正方形和矩形按照点积为0和长度判断,菱形和平行四边形按向量相等和长度判断,梯形按照叉积为0判平行.因为四个点是任意给出的,首先要进行 ...

  8. html基本标签练习

    Alt  显示工具栏 f2修改文件名称 内联元素:<div>只占一行</div> 块级元素:<span></span> 以utf8无bom格式编码 安装 ...

  9. Revit二次开发示例:DisableCommand

    Revit API 不支持调用Revit内部命令,但可以用RevitCommandId重写它们(包含任意选项卡,菜单和右键命令).使用RevitCommandId.LookupCommandId()可 ...

  10. 游戏 window

    using UnityEngine; using System.Collections; public class YY : MonoBehaviour { ,,,); ,,,); // Use th ...