Ambient Occlusion 环境遮挡
能够增强立体感,是在表面中,只有部分可以看到,其他的一部分被其他几何遮挡住了。
早期的AO
使用射线跟踪离线计算AO并将结果存储到纹理中,这在对象建模过程中得到了广泛的应用。
这个方法也是空间换时间,所以要额外存储成本且只适用于静态对象。
SSAO
思想:首先将场景渲染到一副带有深度值的贴图,对于这个贴图中的每个片段,都会根据他周围的深度值计算一个遮蔽因子,这个因子会在之后用于减弱环境光照
但是有一半会出现问题,例如一个球在平面上有一半是采样不到的。
改进
HBAO(Horizon-based Ambient Occlution),这个算法的核心思想就是根据附近遮挡的仰角高度去积分计算遮挡百分比,这里有一个attenuation function就是要判断仰角遮挡物与当前点的距离,如果过远就置零不去计算。
但是上面的都没有考虑到角度问题,实际上直射下来的光照贡献度和斜照的贡献度是不同的,基于解决这个问题,提出了GTAO(Ground Truth-based Ambient Occlution),并且这个算法拟合出了光照在表面弹射的性质。
GTAO
现在较前沿的遮挡方案
Ray-Tracing Ambient Occlusion 光线追踪环境遮挡
用RTT硬件从每个屏幕像素投射射线
1 spp(每像素样本)适用于远场遮挡。
使用2-4 spp,可恢复接触区的详细遮挡。
雾效
Depth Fog
雾效最简单的方式就是Depth Fog,按照距离进行遮挡,其中最常用的就是二阶的指数型雾。
Height Fog
此外,还有一种体积型的雾,这种雾是有一定高度的,当前高度在这个高度以下,值就是雾的值,当前高度在这个高度以上时,雾的值是指数降低的。在我们在雾外看雾内的东西,我们只能用Ray Marching的方法进行积分,雾的浓度值与通透值线性相关,可以直接将浓度作为通透值。
Voxel-based Volumetric Fog
现在技术要求雾更加具有体积感视线类似于丁达尔效应的效果,Voxel-based Volumetric Fog这个算法将视锥进行体素化(Voxelize),在这些体素化的部分进行各种Marching的计算,之后以视场大小为基准进行存储。
抗锯齿
混叠是由高频信号和有限的渲染分辨率采样不足引起的一系列渲染伪影。
基于屏幕的抗混叠方案的一般策略是使用采样模式获取更多的样本,然后加权和样本产生像素颜色。
SSAA & MSAA
基础的算法有SSAA(Super-sample AA),这种算法就是将原有分辨率增加一倍去计算当前像素的颜色占比,这样将会产生额外的z-buffer存储。MSAA(Multi-sample AA)做出了优化,每个像素有4个采样点,当像素在三角形中心(四个采样点相同)则只作一次shading,当像素在三角形边缘(四个采样点不同)则进行多次shading之后取比例。这个方法仍然需要四倍的buffer,但节省了shading的时间。
现在常用的方法:
FXAA
快速估算的抗锯齿方法(Fast Approximate AA),不再使用更高精度的buffer去存储,而是对图像边缘进行插值。第一步是获得边界,就是先将图像投影到亮度空间,再进行十字形滤波,如果上下左右综合色差超过某个阈值的时候,则判断为边界点。之后根据上下左右的像素插值确定颜色突变方向,与突变方向像素点形成一个像素对,对像素对取均值,根据相邻像素对均值可以计算出边缘长度。 然后根据当前像素对在边缘的位置,判断加权比例。
TAA
时域的抗锯齿(Temporal AA)主要思想是将过去帧与当前帧进行加权计算。
后处理(美颜)
Bloom Effect 布卢姆效应
布卢姆的物理基础是,在现实世界里,镜头永远不能聚焦完美无缺 即使是一个完美的镜头,也会将输入的图像与Airy盘相转换。通俗来说就是发光物体的光晕效果。
如何产生光晕效果,首先要取出发光的部分,即映射到亮度空间,取出大于某个阈值的部分。第二步进行一次高斯模糊,为了减少计算,我们先将图像降采样,降到一定程度进行blur,之后再与原图相加再上采样,这样避免用到较大的Kernel运算。最终我们将高斯模糊后的图与原图进行相加即可。
Tone Mapping
现在的画面基本都是HDR,也就是光直射的地方会特别亮,阴影的地方特别暗,所以我们需要一个曝光曲线将亮度限制在一个范围当中。
较著名的曲线
Color Grading
Color Grading是表达情绪的要点。在制作上是用了LUT的方法,即从一个颜色空间到另一个颜色空间的映射。