半透明排序总结

OIT(Order Independent Transparency)

a). Depth Peeling(深度剥离)

image-20230817143032060

  • 优点:
    • 遍历都是无序的,也就是说不依赖对物体的排序,所以也就不会出现半透明排序的问题;
    • 基本无硬件要求
  • 缺点:
    • 需要重复多次Pass进行深度剥离,性能开销大;

b). Per-Pixel Linked Lists(L.L)

v2-90dde925b1db37ccedb64859560a1ea1_b

在 Pixel Shader 中使用两个可写的纹理(DX11,SM 5.0,UAV),一个屏幕大小的链表头纹理(Start Offset buffer),一个屏幕大小 N 倍的链表节点纹理( Fragment & Link buffer)。链表头纹理的每个像素存储每个像素链表在节点纹理中的偏移量。

v2-fd030b2ba60255a3d750c02fc4c272cb_b

  • 优点:
    • 比 Depth Peeling 快了很多。性能开销也比 Depth Peeling 更加节省
  • 缺点:
    • 节点纹理具体需要多大无法事先做准确的预估,因此显存的具体消耗不可控(因此多用于离线渲染)
    • 仅支持DX11、SM5.0以上;

c). MLAB(Multi-Layer Alpha Blending)

不像 A-buffer 对每一层片元都进行存储,而是根据深度 z 将片元划分为多组,先对每组的片元混合后,只存储这一组的颜色、透明度和深度,最后对各组按顺序进行混合。

v2-81773fb4095f15c89300030d4fc36226_b

  • 优点: 内存大小固定,无L.L的问题;
  • 缺点: 对于单个层内,不透明顺序未知,可能造成Artifact;

d). Weighted Sum & Weighted Averaging(WS & WA)

从传统的“逐层 over”的算法出发,列出其展开式,分析其中不依赖排序的因子,从而进行简化近似。

  • 优点:开销小;
  • 缺点:在alpha较大时有明显的Artifact;

e). Adaptive Transparency

Adaptive Transparency,简称 AT,是 Intel 提出的一种 OIT 技术。其核心思想是通过修改经典混合公式本身来改进 Per-Pixel Linked Lists 方法的内存和性能问题。

  • 引入能见度函数(阶梯下降);

其他做法

a). PreZ(详见百人计划3.5 Early-z和Z-prepass)

  • 第一个Pass(Z-Prepass):仅写入深度;

  • 第二个Pass:关闭深度写入,并将深度测试比较符改为等于;

b). 顶点顺序

模型保存为OBJ(FBX等),其中每个顶点都有顶点编号,引擎渲染就会按顶点编号的顺序进行渲染。

对于一个多层的面,可以先创建内部的点,在创建外部的点,保证内部顶点编号小于外部,使其先渲染内部再渲染外部。

Shader学习 (19)如何获得正确的半透明排序 - 九猫的文章 - 知乎