技术方案比较的前提是(精选4篇)

时间:2025-06-02 00:46:10 admin 今日美文

技术方案比较的前提是 第1篇

我们在计算环境反射的时候通常直接使用当前像素从法线贴图中取出的法线进行,但是这个像素可能周边会存在一些遮挡,导致直接使用常规法线进行采样得到的结果不甚精准;

我们在进行光照计算的时候,直接使用未考虑周边遮挡的法线进行计算,得到的结果可能跟真实结果也会有一些差距;

如果考虑周边遮挡关系,将当前像素的法线做一个偏离,指向未被遮挡区域的中心点方向(即可以理解Bent Normal指的是未被遮挡区域的平均方向),那么上面提到的两个问题就可以得到很好的处理,而根据周边遮挡关系对常规法线进行处理计算后输出的新的法线,我们称之为Bent Normal。

使用Bent Normal有如下的一些好处:

技术方案比较的前提是 第2篇

HBAO是horizon based ambient occlusion的缩写,而HDAO是High Definition Ambient Occlusion的缩写,其实这两者是等价的,只是后者是AMD给出的称呼而前者是NVidia给出的名字。

与SSAO一样,HBAO也是一个基于深度贴图+法线贴图实现的后处理过程,可以直接通过一个PS来完成。

在某个点P上的遮挡信息AO可以简单的用如下的公式来表示:其中表示的是在整个球体空间内各个方向上的可见性函数,当从点出发,以为方向的射线遇到碰撞时返回为1,否则返回0,而表示的则是线性衰减函数(用于指示光源亮度的衰减,这个在SSAO中没有体现,而是将各个点的亮度数据做了简化处理,直接等同起来了)。

下面介绍下HBAO的实现原理。如上图(a)小图所示,我们用球面坐标系来进行表达,其中待计算点P到相机之间的连线用于表示球面坐标系的上方向,指向整个球面的天顶(zenith),而方位角(ezimuth angle)表示的是与垂直的球心横截面Plane上,指向北方的方向(是法线吗?不是,那怎么确定哪个方向是北方,是用真实的北方方向投影到这个平面上吗,还是用法线投影到平面上?无所谓,这里只需要选定一个方向作为积分的起始位置即可)到对应射线(这里的射线是各个采样方向的射线吗?是的)在此面上的投影方向的顺时针夹角,而仰角(elevation angle)表示的是对应射线与前面的横截面的夹角。

之后,如前面(b)小图所示,用一条直线(这条直线我们称之为horizon line,水平线,虽然看起来好像并不是水平的?)来对球面进行拆分,这条水平线用一个有符号的水平角来表示,水平角表示的是实际上是这条水平线的仰角,这个水平角的定义为从与法线垂直且穿过P点的平面出发不断增加仰角直到不发生碰撞的最小仰角。

在这种情况下,如果点P周围的高度信息是连续的话,那么处于水平线下方的射线必定会与周边场景发生碰撞,因而也就无需再做进一步的射线相交检测了,因此前面的公式()可以改写成如下形式(即只考虑会发生碰撞的区域,将球面积分做了展开):

表示的是横截面上的积分方向,表示的是垂直于水平面的夹角方向(这里进行的是以视线方向作为up的上半球面采样),仰角的起始与终止积分点分别为与(这里这个余弦代表的是什么意思?这是球面积分公式中的积分项,任何需要进行球面积分的函数在转换为双重角度积分的时候,都需要乘上这一项),前面说过是水平线的仰角,而实际上指的是tangent angle,即当前点的切线(视线V垂直的横截面与法线N垂直的横截面之间在对应时的夹角,参考前面的图,其实可以理解为视线与法线之间的夹角)对应的仰角,因为要考虑符号,所以这个值在这个示意图中是一个负数。相对于公式()中的整而言,这里只考虑了朝向法线的半球区域,与之前SSAO的半球区域是一致的。

如果线性衰减函数其中指的是P点到方向上的水平点(也就是碰撞点?)之间的距离,其中表示的是射线的作用范围,也就是积分球面的半径,在这种情况下就变得与无关,可以单独提取出来,先完成内部积分:

这个公式还是一个连续的积分,在PS执行的时候还是需要通过蒙特卡洛算法将之转换成累加形式,累加形式给出如下(对于某个像素而言,其法线与视线方向是确定的,那么对于任何的而言,视线与法线的夹角,也就是tangent angle是不变的,因此下面的累加直接使用来表示P点位置的tangent angle):

需要注意的是,这里的累加跟前面的积分公式比起来,少了前面的部分,这是因为蒙特卡罗累加需要在原积分函数的基础上除以各个采样点的概率函数,而这里的概率函数是均匀概率,其概率函数也就是,所以就与前面的正好抵消了。

这个公式中的N表示的是P点发出的射线的数目,而对于每条射线,要通过遍历射线上的多个深度sample(具体的sample数取决于AO的覆盖半径R)才能确定下对应的,如前面实现原理示意图的(c)小图所示,至于则是各个方向的输入光亮度(简化处理可以直接取)。

此外,如下图所示:

正弦可以转换成余弦,之后转换成常用的点乘指令:

在使用regular sample pattern的时候,很容易出现SSAO的banding artifacts,同样,这里可以对每个像素的射线角度分布进行随机化处理,对于每条射线上的sample distance也进行一遍随机化处理,这样可以大大提升显示质量。

下面来给出HBAO的具体实施步骤:

上面介绍了的HBAO的算法的基本思想,但是在实际使用中,这个算法还会遇到一些问题,参考文献[5]为其中一些问题给出了对应的解决方案,感兴趣的同学可以移步前往观摩。

相对于SSAO而言,HBAO算法更加的物理正确,因此其效果也更加的接近真实,但是其性能消耗要远远超出SSAO(在NVIDIA显卡上有做加速),在实施过程中为了减少消耗,通常会在1/2分辨率情况下进行计算,但是这种做法一方面依然比SSAO算法要慢,而另一方面又会导致效果存在闪烁,Louis Bavoil为了解决这个问题,进一步对原算法进行了优化,提出了新一代的HBAO算法,我们通常称之为HBAO+。

技术方案比较的前提是 第3篇

在介绍具体的实现细节之前,先给出HBAO+与HBAO的效果对比,总的来说,HBAO+的执行速度是HBAO的三倍,而且能够呈现更为丰富的细节,听起来很神奇,那么到底是如何做到的呢,我们一起来深入了解一下。

总的来说,HBAO+算法实际上是HBAO算法加上Cache-Efficient Post-Processing算法的结果,而Cache-Efficient Post-Processing算法是通过将全分辨率的AO输出拆分成多张子图的AO输出,而每张子图的AO输出都是用固定的采样pattern,只是在各个子图之间做随机来降低cache miss率从而提升算法性能的,具体可以参考此前做过的关于Cache-Efficient Post-Processing的学习分享,从这个角度我们也知道,Cache-Efficient Post-Processing实际上不只是可以用在HBAO上,还可以用于其他的AO乃至更广泛的类似算法上。

下面给出上面几种算法在GTX 680上以1920x1080分辨率进行渲染时的执行效率对比(数据来源):

HBAO+的问题在于在开启TAA的时候,由于前面帧数累加过来的数据的影响,在动态场景中或者相机突然移动的情况下,AO效果会有残影(要反应一会儿才能跟上?)。

技术方案比较的前提是 第4篇

SSAO是Screen Space Ambient Occlusion的缩写,是Crytek公司2007年在《Crysis》中首次提出的实时AO方案。

SSAO方案是通过后处理过程完成的,即只需要一个PS即可,整个过程所依赖的资源贴图为一张屏幕空间的深度贴图以及一张屏幕空间的法线贴图(也可以通过深度贴图推导出来)。

具体实现原理用文字描述的话大概可以概括为:

这个方案的实施效果取决于每个像素发射的射线数目与长度,如果数目过多,长度过长,可能会导致性能的急剧下降,而如果数目不足,则可能会导致带状误差,如下图所示:

为了在保证AO质量的前提下尽可能的减少采样点数目(射线数目),在发出射线的时候,启用一个随机算法,使得每个像素的出射射线方向是打乱的,这样可以明显降低前面提到的带状误差,虽然实际上误差总量并没有变化,但是由于人眼对于规律性的误差容忍度较低,这种做法还是能提高显示的质量,之后如果在噪声的基础上加上一个模糊处理,还能进一步提升显示质量,如上图右边的小图所示。

此方案实施的对比结果如下图所示,可以看到,在开启了SSAO的场景中,其效果还是有非常明显的变化的。

SSAO的优点在于:

SSAO的问题在于: