19.SSAO

文章详细介绍了环境光遮蔽(AO)的概念及其对画面效果的影响,特别是动态屏幕空间环境遮蔽(SSAO)的实现过程,包括深度缓冲、法线缓冲和法向半球的计算。此外,还讨论了Unity中SSAO的Shader实现,以及使用双边滤波进行细节保留的模糊处理,以优化最终的视觉效果。
摘要由CSDN通过智能技术生成

目录

前言

P1

P2


前言

环境光遮蔽(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技术性能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值