基于Canny边缘检测算法的交错采样延迟渲染
2022-08-23安徽理工大学姚晔
安徽理工大学 姚晔
全局光照一直是渲染领域中非常重要的一环,这种技术的引入可以使实时渲染画面更加的逼真,可是其对于计算资源的要求非常高。交错采样延迟渲染的核心思想是分块重组Gbuffer中的纹理,通过对应位置的组合由原画面像素构成的多个小场景,让每个小场景都独立计算均分的虚拟点光源下的光照计算,计算完成后将像素还原到原画面中。通过这种方法,可以较好的降低计算复杂度。基于Canny边缘检测算法的高斯滤波器能够较好的识别图像边缘,在交错采样合并小场景后可以较好的将像素上的光照分到周围像素上去,抑制了画面上的网格效果和亮点。
1 延迟渲染技术
延迟渲染就是将光照/渲染计算推迟到第二步进行计算,片段着色器和顶点着色器不在第一个渲染Pass中进行着色操作,着色这一步被延迟到第二个渲染通道中执行了。其中,第一次渲染仅将纹理坐标、法线向量、位置坐标、反射系数等简单几何信息存储在缓存中,称之为Gbuffer。
延迟渲染的最大优点是让每一次光照计算都变成有效计算,因为在延迟渲染的第一个通道可以获取整张画面中能被看见的所有像素的几何信息,这样在第二个通道进行着色的时候,所有的光照计算都是有效的,避免了计算资源的浪费。此外,在增加新的光源时,也不需要改动材质Shader,而材质Shader也不需要产生光照,节省了指令数。
2 交错采样延迟渲染
交错采样延迟渲染是在延迟渲染基础上的光照计算加速算法。它具有传统延迟渲染的优势,通过第一个Pass获取的几何信息,可以避免对不可见部分的着色计算。
相比较传统的延迟渲染,交错采样延迟渲染的主要差异在光照计算部分。在该方法下,需要将Gbuffer中的纹理进行分块重组,通过对应位置的组合由原画面像素构成的多个小场景,让每个小场景都独立计算均分的虚拟点光源下的光照计算,计算完成后将像素还原到原画面中。
2.1 分块重组
首先需要在Gbuffer中对纹理进行分块重组。若要对场景进行4×4分块,即把大场景像素按照16个小块为一组均分,其中每行每列各4个。如图1所示,框中为4×4像素组。
图1 分块示意图Fig.1 Schematic diagram of partitioning
分块后,再用公式(1)和公式(2)将每组中同位置的像素按顺序重新组合成16个相似的小场景,如图2所示。
图2 重组示意图Fig.2 Schematic diagram of recombination
图2中的16个小场景是由原画面中完全不相同的像素构成的,但是看起来会十分相似。分块公式如式(1)、式(2)所示:
其中width
,height
为小块的宽度和长度,numX
,numY
是分块的数量,x
,y
是原始像素的位置。分块重组得到右图后,开始对每个小场景进行独立的光照计算。2.2 计算光照
计算光照和传统的计算一样,在实时渲染中,有光照方程,如式(3)所示:
其中,L
为输出光照,L
为直接光照,f
为BRDF项,V
为能见度。在交错采样中,将VPL均匀的分给分块后的每一个小场景。因为将VPL均分,所以在最后计算光照的结果时,需要乘以分块数的倍数。否则用均分的亮度计算出的结果会为原本的结果的1/16。当然,这样得出的结果是不够准确的,所以在间接光照上应用该方法。
2.3 组合
组合就是分块的逆过程,可以通过公式(4)和公式(5)将小场景中的像素恢复回大场景。公式如下:
其中width
,height
为小块的宽度和长度,numX
、numY
是分块X
、Y
方向的数量,x
,y
是像素的位置。组合后,还需要对画面进行高斯模糊,来减少目前画面会出现的亮点和网格效果。3 基于Canny算子的边缘检测算法的高斯滤波器
使用高斯滤波器来消除画面的网格效果和亮点,首先就需要一个边缘检测算法,这样在进行高斯模糊的时候,就能够更好的保留画面中的清晰边缘。特别是在进行多次高斯模糊后,随着画面亮点减少和网格效果减少,如果没有边缘检测算法,画面会有较强的失真。引入边缘检测算法后边缘的效果会更好。
3.1 Canny边缘检测
引入边缘检测是为了在高斯模糊前检测到边缘信息,从而让高斯模糊效果在边缘前停止。目前常见的边缘检测算法有Canny算子和LOG算子。俩算子相比优劣情况如表1所示。相同的尺度下LOG算子的边缘检测所检测到的边缘细节要更多,但是其抗噪效果较差,故采用抗噪效果更好的Canny算子边缘检测算法。
表1 Canny算子和LOG算子优劣比较Tab.1 The comparison between Canny operator and LOG operator
Canny边缘检测的步骤大致如下:
(1)通过高斯滤波来得到平滑后的图像。尽量消除图像中噪声的影响,并尽可能保存边缘细节。
(2)计算梯度的幅值和方向,使用Sobel算子来计算像素梯度。
(3)采用非极大值像素梯度抑制,这样可以消除边缘检测带来的杂散响应。
(4)利用双阈值的算法,判断边缘点。定义高低阈值,不断调整来获得准确的边缘效果。
(5)孤立弱边缘抑制,查看弱边缘像素以及周围的8个领域像素,若其中有一个像素为强边缘像素,则保留该弱边缘为强边缘,也就是真边缘点。
3.2 高斯模糊
高斯模糊是通过正态分布,让每个像素的权值根据像素点到中心距离的不同而变化。二维高斯模型如公式(6)所示:
高斯模糊是通过高斯滤波达成的。低通的高斯滤波就是模糊,而高通的高斯滤波则是锐化。高斯模糊在交错采样的延迟渲染中非常重要,在使用一个像素去替代周围的光照时,会将所有光照结果集中到一个像素之中,这样周围本应收到光照的像素则没有被计算影响。通过高斯模糊,可以将单个像素上的光照结果像周围像素分散,以达到更好的画面效果。同时,通过高斯模糊,可以降低图像的细节层次,特别是减少分块重组后画面的网格效果。
4 融合结果
最后要对图像进行高斯模糊,为了防止纹理也被模糊,所以在计算光照时纹理不包含在内,计算完之后再进行融合,结果如图3所示。
图3 使用Canny边缘检测的高斯模糊实验结果图Fig.3 Result of Gaussian blur based on Canny edge detection
而未使用Canny边缘检测的高斯模糊后结果如图4所示。
图4 未使用Canny边缘检测的高斯模糊实验结果图Fig.4 Result of Gaussian blur not based on Canny edge detection
可以看到,使用了Canny边缘检测的高斯模糊后,画面的边缘更加清晰。
本文在交错采样延迟渲染的基础上使用了Canny边缘检测的高斯模糊。在计算时间上相较传统延迟渲染减少了numX
×numY
倍,效率较为优秀。引入Canny边缘检测的高斯模糊后,边缘更加清晰。画面中仍然有网格现象,通过多次高斯模糊后会有改善。