title: Visibility Buffer
date: 2022-04-07 12:00
count: true
tags:


# Visibility Buffer

Visibility Buffer 解决了传统延迟渲染的几个问题:

  1. 带宽高;
  2. 对于可见性和着色阶段的不完美的分离,会造成 Overdraw;
  3. 不能使用 MSAA。

Visibility Buffer 通常需要这些信息:

(1)InstanceID,表示当前像素属于哪个 Instance(16~24 bits);

(2)PrimitiveID,表示当前像素属于 Instance 的哪个三角形(8~16 bits);

(3)Barycentric Coord,代表当前像素位于三角形内的位置,用重心坐标表示(16 bits);

(4)Depth Buffer,代表当前像素的深度(16~24 bits);

(5)MaterialID,表示当前像素属于哪个材质(8~16 bits);

以上,我们只需要存储大约 8~12 Bytes/Pixel 即可表示场景中所有几何体的材质信息,同时,我们需要维护一个全局的顶点数据和材质贴图表,表中存储了当前帧所有几何体的顶点数据,以及材质参数和贴图。在光照着色阶段,只需要根据 InstanceID 和 PrimitiveID 从全局的 Vertex Buffer 中索引到相关三角形的信息;进一步地,根据像该素的重心坐标,对 Vertex Buffer 内的顶点信息(UV,Tangent Space 等)进行插值得到逐像素信息;再进一步地,根据 MaterialID 去索引相关的材质信息,执行贴图采样等操作,并输入到光照计算环节最终完成着色,有时这类方法也被称为 Deferred Texturing


VBuffer 管线有三个阶段:

Untitled

直观地看,Visibility Buffer 减少了着色所需要信息的储存带宽,此外,它将光照计算相关的几何信息和贴图信息读取延迟到了着色阶段,于是那些屏幕不可见的像素不必再读取这些数据,而是只需要读取顶点位置即可。基于这两个原因,Visibility Buffer 在分辨率较高的复杂场景下,带宽开销相比传统 G-Buffer 大大降低。但同时维护全局的几何、材质数据,增加了引擎设计的复杂度,同时也降低了材质系统的灵活度,有时候还需要借助 Bindless Texture 等尚未全硬件平台支持的 Graphics API,不利于兼容。