基于改进体素锥追踪的大规模场景光照计算
2020-06-07喻光继罗伟泰吴肖云
喻光继,罗伟泰,吴肖云
(1.广西财经学院信息与统计学院,南宁530003; 2.广西自然资源职业技术学院公共基础部,南宁530100)
(∗通信作者电子邮箱luoweitai@126.com)
0 引言
计算机技术的发展,使得虚拟现实技术的应用越来越深入,而全局光照是虚拟世界真实感的重要组成[1],但由于对于大规模复杂场景的全局光照计算,计算量和资源占用难以满足实时性要求[2],因此,需要有效的存储结构和计算方法来优化全局光照在大规模场景中的计算[3]。
光线追踪[4]和体素锥结构[5]是常用的全局光照计算方法,其通常采用八叉树等结构加速存储计算:薛俊杰等[6]采用多级小波分解及多级系数编码,增加细节信息,实现多分辨率渲染;Blumensath等[7]提出稀疏体素与八叉树索引相结合的信息存储结构,提高了间接光照的计算效率,但存储空间需求较大;Wang等[8]优化了稀疏体素八叉树,但节点编码仍占用较多资源;Kämpe等[9]采用稀疏体素有向无环图(Sparse Voxel Directed Acyclic Graph,SVDAG)结构减少冗余共享节点的存储;袁昱纬等[10]以帧间复用对SVDAG结构进行改进,以避开重复合并;郭向坤等[11]采用 CPU(Central Processing Unit)与GPU(Graphics Processing Unit)协同的并行扫描线优化大规模场景体素化。
体素锥追踪在复杂光照计算时取得较好效果[6-10],但八叉树及改进结构[7]在大规模实时渲染时,体素数随场景规模而剧增,且由于结构不具有各向异性,遍历查找困难耗时[12-13],为此,针对大规模复杂场景提出基于改进体素锥滤波器追踪的全局光照计算算法,以级联纹理结构优化信息存储,基于法线加权累积计算光照衰减,基于级联纹理结构改进锥波滤器以优化体素的动态计算查找。
1 改进体素追踪算法原理
1.1 级联纹理结构优化场景体素化
本文采用级联体素纹理结构表达场景,代替原有的三角形表达,该结构依据人眼的距离敏感性,将场景划分为互嵌套的距离图元网格[14]。区域离人眼越近,其网格越小以便高分辨率地精细描述景物,网格以相互嵌套正方体形状,沿视角方向延展,其三层网络示意图如图1所示,文中取n=6。
级联结构中的基本纹素与体素对应,为保护结构各向异性存储体素的6个面信息,从而以合理的方式由近及远将场景覆盖,体素的各向异性保证了光照计算的准确性,且有利于体素间的三线性插值和硬件加速查找。
1.2 直接光照
直接光照的计算及其分布通常与光线的传输方程相关,物体p点的光线传输方程为:
式中:Ω为p点所处半球空间,ω0、ωi为光线出射和入射角;L0、Le、Li分别为出射、发射和入射的辐射照度;f为双向反射函数(Bidirectional Reflection Distribution Function,BRDF),cosθi=n⋅ωi为入射光在p点的法线n的衰减,ωi为光线方向矢量。
直接光照计算时采用体素多三角形面片法向均值计算cosθi,某些体素会因法线反向而无法正确接收光照,为此,提出基于法线加权累积的光照衰减计算方法,即:
式中:k为三角形面片的数目,n j为各面片的法线,V为法线衰减值,ns、Ls为坐标轴分量。
1.3 各向异性过滤
为保持光线追踪时采样的一致性,需建立各向异性的辐射体层级。如图2所示为三维纹理生成贴图的过程,在体素划分的基础上,对各坐标轴求和并计算均值;采样时根据光照入射角插值计算其辐射值。每次入射辐射度收集后都需各向异性过滤,本文对直接和间接光照都进行了入射辐射度收集和各向异性过滤。
图2 各向异性过滤与采样Fig.2 Anisotropic filteringand sampling
1.4 改进的光照体素锥追踪计算
间接光照需要计算半球内的所有积分,计算量巨大,为此,提出基于级联纹理的改进锥滤波器追踪算法。在光照采集时,以级联体素的法向量均值作为起始点,定义k个锥波滤器,漫反射模拟为60o光圈值的6个锥体,而高光反射模拟为10o光圈值的单椎体。
改进锥滤波器依次排列样本模块,并与级联等级对应,如图3(a)所示,各模块到锥顶点p的距离l与角度β确定了当前采样模块的直径r,再结合体素宽度Ws,则可计算得到体素所处的级联等级d:
图3 锥滤波器与级联纹理Fig.3 Conefilter and cascadingtexture
由d、r及角度β可自行计算体素位置,避免对整个存储结构的遍历。每个锥波滤器计算采样值后,由k=6个锥累积值作为当前体素的光亮值。
在第m步中,锥滤波器需要动态更新辐射度cm及相应的累积遮蔽值am,即:
式中:hc为存储辐射度,ha为存储遮蔽值。直接光照注入后,将各锥滤波器的结果加权乘以反射率,再加上直接光照值,即得到体素的最终光亮度。
2 实验结果与分析
实验选取康奈尔静态场景[13]和 Sponza、Sibenic 以及Cathedral[14]动态场景,从规模、速度和内存消耗等方面对文中算法性能进行测试,环境为:Intel Xeon E5-2643 v4 3.4 GHz,32 GB内存,NVIDIA M4000 8 GB显存。
2.1 级联体素纹理结构性能比较实验
为验证级联体素纹理结构存储的优势,以三维纹理[2]、稀疏八叉树[8]、基于 Morton码的稀疏八叉树(Morton-based Sparse Voxel Octree,MSVO)结构[5]和 SVDAG 结构[10]作为实验比较算法,从体素规模、运行时间及内存消耗3个方面测试对比,实验结果如图4所示。
图4 各算法的体素结构性能比较结果Fig.4 Voxel structureperformancecomparison of different algorithms
从图4(a)实验结果可以看出,三维纹理结构在各场景下的体素规模都最大,而稀疏八叉树、MSVO、SVDAG的体素规模有明显减少,但仍远高于文中级联结构。不同分辨率下的实验结果进一步分析可知,低分辨率时,稀疏八叉树的体素规模与文中结构相差不大;但随着分辨率的增加,规模差异随之增大,主要因为级联纹理按层次划分存储,相邻层呈倍数递增,小规模场景的分层优势不明显,但在高分辨率下仅需增加层数。
从图4(b)结果可以发现,稀疏八叉树及MSVO结构的复杂逻辑不利于快速数据遍历,而级联纹理的分层存储在减小体素规模的同时,更利于数据的遍历和查找,因而极大缩短体素化运行时间。
在内存消耗方面,以像素透明属性作为实验比较统计量,实验结果如图4(c)所示,可以看出,文中结构的6个面信息存储仍具有明显的内存占用优势,且随着分辨率的增加,内存占用呈线性增加。
2.2 渲染效果比较实验
由于间接光照具有更大的渲染难度,为此,以间接光照的渲染效果来比较本文算法与MSVO算法[14]、稀体素锥追踪算法[5]及光驱动体素法[11]四种算法的渲染效果,实验结果如图5所示。
图5 不同算法间接光照渲染效果Fig.5 Indirect illumination renderingeffects of different algorithms
从结果可以看出,光驱动体素法采用体素分散结构与锥追踪融合计算间接光照,可以看出,其渲染的间接光照较柔和,但远区域细节较差,体素锥追踪算法与文中算法的渲染效果与真实场景视觉质量相近,对远区域细节也能够较好地表达,说明文中算法远视域大体积体素渲染,获得与体素锥追踪算法相似的渲染效果。
综合整体实验结果,所提算法在取得较好的渲染效果基础上,极大地降低了体素化规模和内存消耗,缩短了渲染运行时间,有利于大规模复杂场景全局光照的实时绘制。
3 结语
计算机性能的提高使得虚拟现实在军事、教育、娱乐等领域的应用越来越深入,而全局光照的计算和渲染是真实感增强及场景分析等虚拟现实技术的重要组成部分。本文提出一种基于改进体素锥滤波器追踪的全局光照计算算法,算法通过级联纹理结构快速光照信息存储、法线加权累积光照衰减计算和体素动态遍历计算,实现全局光照的高效渲染计算,并避免法线反向问题。实验结果表明,改进算法在降低内存占用、提高渲染速度的同时,保持与经典稀疏体素追踪算法相近的渲染效果。