一、环境光遮蔽Ambient Occlusion
我的理解是AO,表示正半球上有多少部分能够看到,实际上就是计算渲染方程中的可见性函数,目的是突出阴影。
1.1 SSAO
他的流程是:
- 获取到场景的深度图
- 在一个着色点的(正)半球随机散布采样点,如果采样点的深度比深度图中的深度更大(更远离相机),那这个点就应该加入ao值
- 所有的采样点ao值取平均
1.2 HBAO
他的流程是:
- 将其周围360的角度进行均分,每个方向分别做RayMarching
- RayMarching之后可以得到一个以为的高度场(就一个角度,如下图中h(θ)的θ)
- 根据点P和它的法线N,计算出它的切面角(也是一个角度,如下图中t(θ)的θ)
- 根据前面求出的角度,我们可以求出当前方向的环境遮蔽值
HBAO在实现的时候可能出现的问题:Low-Tessellation 、不连续、噪声等,
HBAO有个问题,没考虑不同方向光的贡献度不同
1.3 GTAO
GTAO的流程如下:
- 求出每个slice的 horizon angle
- 根据angle求slice的 visibility ( 注意根据法线做Cosine Weight)
- 根据经验公式做Mult Bounce ( 下图第二张)
1.4 RTAO
实时的光追肯定不能一个像素开高spp,每个像素的spp会分布在时序上
二、雾效
2.1 深度雾
2.2 高度雾
2.3 体素雾
我们会对相机空间进行体素切分,我们存储结构尽量和屏幕保持一致
体素雾的实现可以去看论文,也可以看知乎大神的文章:体渲染探秘(二)基于VoxelVolume实现体积雾 - 知乎
三、抗锯齿
可参考我的实时渲染–光栅化
四、后处理
物理真实的需要比如光晕;风格化的设计比如像素风,二次元风格等。
4.1 Bloom(泛光):
Bloom的实现原理:我们首先根据一个阈值提取出图像中的较亮区域,把它们存储在一张渲染纹理中,再利用高斯模糊对这张渲染纹理进行模糊处理,模拟光线扩散的效果,最后再将其和原图像进行混合,得到最终的效果。
然后高斯模糊中使用一个高斯核进行卷积计算,这个二维高斯核采样次数过高,但是我们能够进行将其拆分成两个一维高斯核来进行卷积计算
4.2 Toon Mapping
色调映射功能的目的是将宽范围的高动态范围(HDR)颜色映射到显示器可以输出的标准动态范围(SDR)
(简单地说就是让亮处暗一点,让暗处亮一点)
4.3 Color Grading
color grading的核心思想就是颜色映射,根据当前颜色映射到另外的颜色。
五、渲染管线
5.1前向渲染
根据距离摄像机的远近绘制,最远的物体最后绘制,这样来说天空盒是最后绘制的。但是对于透明的物体,需要先绘制远距离的物体。根据远处物体绘制出来的颜色然后再对近处物体绘制时需要作为参考元素。
但是前向渲染不适合计算大量光源的场景
5.2 延迟渲染
延迟渲染的流程:
第一个流程会先把几何信息放到GBuffer中,不考虑光的影响
第二个流程就几何信息进行光照运算
延迟渲染在计算光照的时候,需要注意的是每个光源创建一个包围盒来算他对于pixel的贡献,这样计算才能正确获得光照加速
延迟渲染优缺点:
优点
- 光照只计算可见的片段
- 来自G-Buffer的数据可以用于后处理
缺点
- 高内存和带宽成本
- 不支持透明对象
- 对MSAA不友好
5.3 TBR
对于TBR来讲,整个光栅化和像素处理会被分为一个个Tile进行处理,通常为16×16大小的Tile。TBR的结构通过On-Chip Buffers来储存Tiling后的Depth Buffer和Color buffer。
5.4 Forward+
5.5 Cluster Based Rendering:
文章推荐:Cluster Based Deferred Lighting(1) - 知乎
5.6 Visibility Buffer:
5.7 挑战
- 复杂的并行工作需要与复杂的资源依赖性同步
- 大量生命周期小于一帧的瞬态资源
- 复杂资源状态管理
- 不需要大量的用户低级知识,就可以利用新暴露的GPU特性