目录
前言
环境光遮蔽(AO Ambient Occlusion),是来描绘物体和物体相交或靠近的时候遮挡周围漫反射光线的效果,直观上给我们玩家的感受主要体现在画面的明暗度上,未开启AO特效的画面光照稍亮一些;而开启AO特效之后,局部的细节画面尤其是暗部阴影会更加明显一些。
P1
Crytek开发了一种用于《孤岛危机》的动态屏幕空间环境遮挡(SSAO)方法。 他们使用zbuffer作为唯一的输入,在全屏通道中计算环境遮挡。
SSAO流程图
深度缓冲
- 深度缓冲中的depth值用于当前视点下的场景的每一个像素距离相机
- 的一个粗略表达,用于重构像素相机空间中的坐标(Z),来近似重构该视
- 点下的三维场景。
法 线缓冲
- 相机空间中的法线信息,用于重构每个像素的“法线-切线-副法线”
- 构成的坐标轴,用于计算法线半球中的采样随机向量(随机向量用于判断和描述该像素的AO强度)
法向半球
- 黑色表示我们需要计算的样本;
- 蓝色向量表示样本的法向量;
- 白色、灰色为采样点(很明显,采样点的多少影响最后的渲染的效果),其中灰色表示被挡采样点(深度大于周围),据此判断最终Ao的强度
图2表示法向球形采样(后背抛弃),原因是该方式采样导致平整的墙面也会显得灰蒙蒙的,因为核心中一半的样本都会在墙这个几何体上。
SSAO实现
首先获取屏幕深度和屏幕法线信息
C#
shader
其中DecodeDepthNormal()在”UnityCG.cginc"中
重建世界坐标
1、计算样本屏幕坐标(利用Unity内置的函数)
2、转化至NDC空间中
3、计算相机空间中至远屏幕方向(内置变量_ProjectionParams.z 存放相机远平面值far)
4、矩阵变 换至相机空间中的样本相对相机的方向
5、重建相机空间中的样本坐标(在像素着色器中)
最后乘以V矩阵的逆,得到世界空间下坐标
构建法向量正交基
1、设置法向量
2、利用uv至采样一张Noise贴图(如右图4x4像素(可选择其他尺寸)的Noise贴图),或者随机向量。
3、求出切向量,再利用函数cross叉积求副切线向量
AO采样核心
1、传入给定的随机采样向量,并通过法向量正交基转化至法线半球中的向量
2、获取随机坐标点
3、转换至屏幕空间坐标
4、计算随机向量转化至屏幕空间后对应的深度值,并判断累加AO
累加
1、加入样本深度和随机点的深度值的范围判定
2、 判断深度值大小的时候,增加一变量,来改善随机点深度值和自身一样或者非常接近问题
3、法线半球中随机采样后的点x、y(切线平面)距离样本使ao平滑
4、累加
模糊
使用双边滤波,使细节保留的情况下模糊高频噪声。
UnityShader-BilateralFilter(双边滤波,磨皮滤镜)_unity 双边滤波_puppet_master的博客-CSDN博客
P2
各AO技术性能
待