Games202-7 A Glimpse of Industrial Solution
a). Anti-Aliasing
a.1). Temporal Anti-Aliasing (TAA)
- 复用先前帧的样本,假设画面不动,就可在单个像素内随时间规律移动感知点,进行(加权)平均;
- 为何规律移动感知点: 随机采样会引入高频噪声;
- 如画面移动,则和频域降噪相同,使用Motion vector找到对应像素,再规律移动感知点。同时也可引入Clamp和Detection的操作;
a.2). MSAA vs. SSAA
SSAA:
- 相当于用更大分辨率渲染后降采样,做2倍的SSAA,相当于一个像素做4次shading;
- 质量最好,但是性能开销大;
MSAA:
在一个像素内,同一个图元只着色一次;(如图,0、2、3为图元A,着色一次(左边的绿点);1为图元B,着色一次;)
- 因此,MSAA会维护一张表,表中记录当前感知点记录的color(albedo?) 和 深度
在像素间复用样本;
a.3). Image Based Anti-Aliasing Solution
a.4). Note
- G-buffers一定不能做抗锯齿
b). Temporal Super Resolution
- 通过深度学习告诉管线,如何使用历史帧的信息;
c). Deferred Shading(详见百人计划图形3.4 延迟渲染管线)
主要解决大量光照渲染和overdraw(传统渲染如果从后往前渲染,那所有fragment都会被shaded一次)的方案。
可以将延迟渲染(Deferred Rendering)理解为先将所有物体都先绘制到屏幕空间的缓冲(即G-buffer,Geometric Buffer,几何缓冲区)中,再逐光源对该缓冲进行着色的过程,从而避免了因计算被深度测试丢弃的片元的着色而产生的不必要的开销。也就是说延迟渲染基本思想是,先执行深度测试(应该也包括其他测试),再进行着色计算,将本来在物空间(三维空间)进行光照计算放到了像空间(二维空间)进行处理。
对应于正向渲染O(m*n)的 复杂度,经典的延迟渲染复杂度为O(n+m)。
c.1). 流程
可以将延迟渲染理解为两个Pass的过程:
几何处理阶段(Geometry Pass)。这个阶段中,我们获取对象的各种几何信息(Position、Normal、Albedo、Specular等),并将第二步所需的各种数据储存(也就是渲染)到多个G-buffer中;
- 由于有深度测试,所以最终写入G-buffer中的,都是离摄像机最近的片元的集合属性,这就意味着,在G-buffer中的片元必定要进行光照计算。
光照处理阶段(Lighting Pass)。在这个pass中,我们只需渲染出一个屏幕大小的二维矩形,使用第一步在G-buffer中存储的数据对此矩阵的每一个片段计算场景的光照;光照计算的过程还是和正向渲染以前一样,只是现在我们需要从对应的G-buffer而不是顶点着色器(和一些uniform变量)那里获取输入变量了。
c.2). 延迟渲染的优缺点
优点:
- Complexity: O(#fragment #light) -> O(#vis. frag. #light)
- 只渲染可见的像素,节省计算量
- 用更少的shader
- 对后处理支持良好(例如深度信息:直接拿G-buffer中的就行。而前向渲染需要单独Pass再渲染一张深度图)
- 在大量光源的场景优势尤其明显;
缺点:
- 内存开销较大,且占用了大量的显存带宽;
- 需要传递G-Buffer;
- 有时需要用到G-Buffer的信息,如深度图做后处理,那将不会进行Clear;
- 只能用同一套Lighting Pass;
- 对透明物体的渲染存在问题。在这点上需要结合正向渲染进行渲染;
- 对多重采样抗锯齿(MultiSampling Anti-Aliasing, MSAA)等硬件抗锯齿的支持不友好,主要因为需开启MRT;
- MSAA是依赖于子像素,而Deffered shading处在光栅化之后(单个像素内值相等),传输数据是通过G-Buffer;
- 但可使用TAA
问FXAA、FSAA与MSAA有什么区别?效果和性能上哪个好? - 文刀秋二的回答 - 知乎
https://catlikecoding.com/unity/tutorials/rendering/part-13/
- 内存开销较大,且占用了大量的显存带宽;
d). Tiled Shading
- 基于Deferred Shading
- 并不是所有光源都会对Tile有贡献
- Complexity: O(#vis. frag. #light) -> O(#vis. frag. avg #light per tile)
e). Clustered Shading(群组渲染)
- 在Tiled Shading的基础上再对Depth分段;
- Complexity: O(#vis. frag. avg #light per tile) -> O(#vis. frag. avg #light per cluster)
f). Level of Detail Solutions
- cascaded: 级联
- 生成时,不同Level之间有一定重叠,用于过渡时Lerp