提起AO,大家一定会想到SSAO,SSAO不需要美术进行过多的参与,只需要调一下参数就万事大吉了,但是SSAO也有一些缺陷,噪声比较明显,有时候给人的感觉不是ao而是halo让人感觉画面变脏了,至于性能如果用一个quarter精度的搞一下,8600GT下720分辨率也是需要接近2ms的开销,这还是在没有Bilateral Filter下的开销,如果加了Bilateral Filter就会开销更多一些。这篇Paper采用预计算的方式达到很高的AO质量,上个图看下真相:
算法描述:
这篇Papaer的算法分为以下步骤:
预计算部分:对物体周围的3d格子中的每一个点计算Occlusion,然后保存到3d贴图里,每个物体对应一个3d贴图。
运行时:对于渲染的每个像素我们从3d贴图里得到ao。通过以下步骤来获得ao的数据:
1.画一个grid包围盒的后半部分
2.对于每个像素计算它对应的世界位置
3.将世界坐标的位置转化到grid空间
4.根据grid空间计算3d贴图的uv,然后读取对应的ao值。
5.读取的ao值和frame buffer进行alpha blend,这样就可以处理多个Occluder cast到同一个像素的情况了,尽管alpha blend不是一个数学正确的方式,在实际应用中已经表现的足够好了
2-3都是在同一个PS里完成的,简单来说就是将Projection空间的位置转换到Occluder空间,然后采ao的3d贴图即可
float4 worldpos = texRECT(PositionTex, screenpos)
float3 gridpos.xyz = mul(WorldToGridMtx, worldpos)
out.color = tex3D(GridTexture, gridpos.xyz)