SSAO全称“Screen-Space Ambient Occlusion” (屏幕空间环境光遮蔽)。其最先运用于 Crysis(孤岛危机) 游戏中,通过GPU的 shader实现
SSAO通过采样象素周围的信息,并进行简单的深度值对比来计算物体身上环境光照无法到达的范围,从而可以近似地表现出物体身上在环境光照下产生的轮廓阴影。可以利用“逐象素场景深度计算”技术计算得出的深度值直接参与运算。
现在的效果确实错误还比较大,应该先进行简单的空间划分(或类似处理)然后计算。
不过个人认为这种方法只是近似地模拟,效果并不正确,但确实能增强场景的层次感,让画面更细腻,让场景细节更加明显。
不同于显卡驱动中普通的AO选项,burnout的SSAO是全动态的,无需预处理,无loading时间,无需消耗内存,不使用CPU,全由GPU处理,对GPU有较大的消耗
SSAO默认是关闭的,可以在游戏视频选项中打开
评测
在7950GT下跑,加了ssao后,下降了15%。而且,显卡性能越低,下降的越厉害。效率消耗主要是在于要多渲染一遍场景到深度以及之后进行的ssao处理。这遍可以进行优化,如果物体的纹理不带alpha,则可以把他们都合在一批或几批渲染。至于深度图的尺寸 ,我采用了与窗口一样的尺寸,这样精度高。也可以采用低分辨率,但效果会有锯齿,还需要进行模糊处理才比较自然。当然,如果本来就用了延迟渲染技术,本来就有深度图了,那就可以直接拿来用了。
与PRT对比
PRT用于静态场景确实是个比较好的方案,毕竟可以预计算。但是对于动态的场景,还需要动态更新。另外,PRT的质量依赖于
网格的细分程度,要是模型太简,则效果也糟糕。
因此 ,PRT对于虚拟现实项目里的高楼大厦等场景(这些模型都是很精简的)来说,就显得不合适了
目前已发行的游戏中,运用SSAO的游戏有
Crysis(孤岛危机)
Burnout(TM) Paradise The Ultimate Box(
火爆狂飙5天堂)
帝国:全面战争
另外,星际争霸2的开发也运用到了SSAO
什么是SSAO?
从HL2开始,众多游戏公司开始对于如何表现“间接光照”进行研究,这些昙花一现的技术有:
运用于HL2的radiosity Normal Maps技术,效果比较垃圾
运用于Stalker的GI(?)技术,算法不好,开销巨大。
初期Crytek准备运用在Crysis上的Photon Mapping(光子映射)技术,开销同样比较垃圾,被抛弃。
随后Crytek又准备运用在Crysis上的Real-Time Ambient Map(实时环境光照贴图,简称RAM),这个是与之前Stalker使用的技术比较类似的,也是最接近SSAO的一个技术。
不过Crytek不愧为“间接光照”研究上的先锋,其技术员对于RAM进行了改进,新的算法成为了如今的SSAO
SSAO开与关的区别所在
SSAO(Screen-Space Ambient Occlusion)是一个纯粹的渲染技术,或者说,是一个算法。虽然从上文知道是为了实现“间接光照”的效果,不过从技术上讲,就是一个对于AO(Ambient Occlusion环境光吸收,也就是NV 185.20驱动加入的那个,一个渲染技术,我们可以在Maya等3D软件中可以见到)的一个逼近函数,并且以此为据进行实时渲染。
SSAO比起185.20驱动中AO的优点:
与场景复杂性无关
无数据预处理,无loading时间,无
系统内存分配
动态渲染
每个像素工作方式始终一致
无CPU占用,完全通过GPU执行
与流行显卡的管线整合相当容易
缺点也是有的:
由于采样全部在可见点上进行的,对于不可见点的遮挡影响会有错误的估算。
颗粒感比较重,需要与动态模糊紧密配合才能取得较好效果。
SSAO屏幕空间环境光遮蔽的运作方式
其实了解了AO环境光遮蔽的原理,SSAO(屏幕空间环境光遮蔽)已经可以融会贯通,SSAO通过采样像素周围的信息,并进行简单的深度值对比来计算物体身上环境光照无法到达的范围,从而可以近似地表现出物体身上在环境光照下产生的轮廓阴影。
具体的运作方式上,SSAO会利用GPU计算出指定像素的空间坐标,然后以此坐标为基点,在周围选择数个采样点进行采样,然后将采样点的空间坐标投影回屏幕坐标,对深度缓冲进行采样,最后得到采样点的深度值,再进行后续计算,最终得到一个遮挡值。
SSAO实现了较好的全局光照效果