OpenGL 4.0和DirectX 11提供了原子操作(atomic
operation),为GPU上并行创建链表数据结构提供了便利。基于此算法的per-pixel link lists可以应用到order independent transparency,实现像素的程序化混合,实现顺序无关的半透明效果,避免了程序员在api层面对于略显无力的排序的折磨。
Per-Pixel Link List
PPLL的实现需要三个数据结构:头结点指针Buffer、链表Node
Buffer、结点计数器。 -
头结点指针Buffer:每个像素位置又一个链表,所以叫per-pixel link lists,头指针Buffer的大小是framebuffer的大小,存储的是头结点在Node
Buffer中的位置,初始化为一个空符号,比如-1; - 链表Node
Buffer:存储所有结点数据,可以是任意数据,next字段是必需的,指向链表下一个结点;不需要初始化,只需要分配足够大小。
-
结点计数器:用于分配下一个Node Buffer位置来存储数据,使用原子操作累加。初始化为0。
