GAMES104 07.游戏中渲染管线、后处理和其他的一切
Ambient Occulsion
在每个可看见的点处,它的可看见的正半球面,只有部分可以染上环境光,另一部分则被其他物体遮挡,主要体现在阴影的真实程度上。
Precomputer AO
- 提前烘培出的一张AO纹理
- 仅适用于静态对象
Screen Space Ambient Occlusion(SSAO)
- 从screen打出一条射线,击中一个点p,在那个点生成一个球,球内随机采样多个点。
- 从camera中再次向球内采样点射出射线,比较采样点位置和
depth buffer
。 - 根据被遮挡和未被遮挡的数量关系估计AO
- $A(p) = 1 - \frac{Occulsion}{N}$ 在实际生产环境中,发现这个公式是错误的。后改进为
SSAO+
。
SSAO+
以点p的法线为中心,构造一个半球,再做 3.
的工作。
Horizon-based Ambient Occlsuion(HBAO)
从某个点发射ray,去找能看到天顶的最大仰角,找一圈后积分就可以得到被遮挡面积。
是的,孩子们,还是我 Ray Marching
😎。
Ground Truth-based Ambient Occlusion(GTAO)
使用多项式方程拟合积分方程,算出AO。
Ray-Tracing Ambient Occlusion
从每个像素往外射线
雾效
Depth Fog
Height Fog
一定高度下的雾,浓度都是最大值,高度之上按对数的速度递减
Voxel-base Volumetric Fog
- 把视锥的切面按固定的值均分。
- 进行
Ray Marching
。(还是我😎)
抗锯齿
- Edge Sampling
- Texture Sampling
- Specular Sampling
Super-sample Anti-aliasing(SSAA) and Multi-sample AA(MSAA)
- SSAA:4倍渲染分辨率、4倍z-buffer、4倍frame-buffer、4倍光栅化,最后再滤波
- MSAA:4倍z-buffer、4倍frame-buffer、4倍光栅化,最后只对需要的像素计算权重来shading(边缘)
Fast Approximate Anti-aliasing(FFAA)
先把颜色转换到亮度空间,然后用一个十字形滤波找到边界,对于一个像素点M,找到它上下左右的邻居,求出五个点最大最小值的插值,检查是否超过某个阈值,超过则是边界。
找到一个像素对,如
图FFAA-1
中的 MN ,从 M 出发,沿 MN 的垂直方向寻找最近的颜色变化点,作为边的两端。然后比较左右两端的到M这个像素对的长度,根据长度决定如何混合。
Temporal Anti-aliasing(TAA)
当前帧,与前一帧进行混合。
缺点:会有一点错位,没做好会出现残影。
后处理
Bloom Effect
Detect Bright Area by Threshold
Luminance(Y)
$Y = R_{lin} * 0.2126 + G_{lin} * 0.7152 + B_{lin} * 0.0722$
Gaussian Blur
Tone Mapping
宽容度不够时,我们需要用曲线将画面调回正常。
业内比较知名的两条曲线:Filmic s-curve & ACES
Color Grading
将颜色值作为坐标,在LUT中查询得到新的颜色。
渲染管线
Forward Rendering
按顺序渲染:遍历每一个mesh,遍历每一束光,计算shading
Transparent Sorting
有透明物质的话,先绘制不透明物质,多个透明物质需要由远及近地绘制
Deferred Rendering
- 先渲染一遍存到
Geomtry Buffer(G-Buffer)
- 对于每个像素,计算每一个光的效果
优点:方便加点光源,容易debug。 缺点:G-Buffer 会导致频繁内存读,消耗大。
Tile-based Rendering
Light Culling by Tiles
每个 tile 拥有⼀个光源列表,在着色时,只对列表里的光源进行计算,就不用对整个场景进行计算。
Depth Range Optimization
按深度分出一个区域,一个光源只照一个范围内的物体
Forward+(Tile - based Forward) Rendering
一个一个Tile来绘制。
Cluster-based Rendering
Visibility Buffer
G-Buffer把所有信息写在了一起,我们现在把几何信息和材质信息剥离开来:某个像素属于某个集合体,然后反向去查材质信息。
在现在几何体远远大于像素量的情况下,这么做效率高很多。
Frame Graph
把引擎里的各个模块通过有向无环图连接在一起,通过系统自动检查模块间的依赖关系、管理内存释放。
核心思想:当一个系统足够复杂时,我们定义一个图形化的语言,把模块之间的依赖关系、前后关系表达出来。才能更好地把系统管理起来。
V-sync & G-sync
Screen Tearing
V-sync
等frame buffer写完以后,等到显示器刷新后一整个显示,不允许写到一半的时候进行刷新。
Variable Refresh Rate
显示器动态帧率。