一种基于场景多方向体素化的多光源场景加速绘制方法与流程

文档序号:19615545发布日期:2020-01-07 08:06阅读:257来源:国知局
一种基于场景多方向体素化的多光源场景加速绘制方法与流程

本发明属于实时渲染技术领域,具体涉及一种基于场景多方向体素化的多光源场景加速绘制方法。



背景技术:

在计算机图形应用的很多场景中都会使用大量的动态光源,绘制含有多光源的复杂场景,对于增强图形的真实感沉浸感是一个非常重要的途径。在现有的图形硬件条件下,虽然已经可以实现对一些包含复杂几何模型的场景进行交互式的操作,但是对含有大量动态光源的场景进行绘制,速度还是比较慢,有待于提高。

光照计算是一个耗时的工作,因为它涉及到了光线和场景的可见性计算。尽管图形处理器可以快速地绘制复杂的场景,但是如果对于上千个光源,使用暴力方法上千遍地绘制复杂的几何场景还是极其耗时的。

阴影图方法是进行包含少量光源场景实时绘制的常用方法。阴影图是以光源位置为视点对几何场景进行绘制,从而得到场景的几何近似。它可以被gpu进行并行处理。然而,如果场景中的光源数较多,要为每个光源绘制一遍场景,生成对应的阴影图,时间开销过大。

ritscheletal.的论文中介绍了连贯阴影图,它由一些被压缩的深度图构成,这些深度图是预先从n个方向对场景进行绘制生成的,这里的n比光源的数量要小很多。在计算每条光线的可见度时,首先需要根据光线方向选取从最相近方向绘制的阴影图,然后进行深度比较来确定光线是否遮挡。在此方法的基础上,连贯表面阴影图方法(cssm)被提出。该方法支持场景间接光照计算。虚拟面光源是由一组虚拟点光源组成,虚拟面光源的可见性可以利用扩展抛物线投影的cssms来计算,这避免了对每个虚拟点光源的单独计算。

不完美的阴影图(ism)是为针对多点光源场景绘制的阴影图的技术。为了提高绘制效率,不完美的阴影图的分辨率较低,并且对几何场景的采样点进行分批绘制。ism是多光源实时绘制中常用的方法,所以本文在结论部分给出了本文的方法和ism方法的比较。

层次化场景几何近似方法一直被用于加速阴影图的绘制中。例如,隐式可见性方法使用了一种基于片状结构的四叉树表面近似方法,manylods使用了场景几何层次划分方法。虚拟阴影图方法将阴影投射场景几何划分成簇,为其绘制适当分辨率的立方体贴图,从而提高多光源复杂场景的绘制效率。

矩阵行列抽样(mrcs)通过输出样本/光源对,来为输出样本和光源组计算典型阴影图。个别样本/光源对的可见性会被相关的典型阴影图代替。随后光源聚合方法会减少需要生成的典型阴影图的数量。mrcs算法可以在gpu中实现,它减少了需要进行实际确定的可见性数量,因此提高了计算效率。另外,通过减少光源簇和输出图像的可见性估计可进一步提高该算法的效率。

对于存在大量光源的场景,从这些光源绘制的阴影图之间存在冗余,随着场景复杂性和光源数量的增加,阴影贴图之间的冗余也会增加。本文方法对场景进行多方向的体素化,从而形成场景的三维几何近似数据,实现固定时间下光线-场景的求交。在本文方法中,虽然多方向的体素化数据也存在着冗余,但冗余与光线方向的离散化密切相关,在多光源或者复杂的场景中的冗余不会增加。本文所用的方法没有聚合光源,本文计算了场景中每条光线的可见性,提供了高质量的阴影效果。

目前,许多基于光线跟踪的算法对几何场景进行近似来加速可见性的计算。微面绘制方法使用点的层次结构进行场景的近似计算,这可以加速动态场景中光线的遍历和几何场景的更新。光线跟踪方法还可以通过对几何场景的体素化来进行加速。本文所用的方法也借鉴了几何场景的体素化的思想,使用多方向体素化数据进一步减少了光线-场景求交的开销。

还有一些基于光线跟踪的方法采用对光源的简化来加速可见性判定。八叉树的层次结构用于实现基于位置和影响范围的光源聚合。光源被分在许多松散的集合中,各个顶点的光源向量通过pca进行压缩,在低频光照环境下实现了高质量和高帧频的绘制效果。光源切割是基于二叉树中多光源阴影绘制的常用方法。对于输出的每个像素样本,在二叉树找到一个合适的切割,利用切割中的光源进行该像素的多光源光照计算,该方法假设所有光线均为可见。预计算光源切割方法对此方法进行了扩展,预计算了光源的可见性,因此它适合于光源不发生变化的静态场景。随后提出的双向光源分割方法可以处理动态场景。

另外一些光线跟踪方法对光源和几何场景都进行了近似。例如可见度聚合利用稀疏矩阵将场景几何与光源进行分组,非零子矩阵相当于场景几何与光源簇的可见度交集。这类方法提高了近似计算的效率。



技术实现要素:

本发明要解决的技术问题是:提供一种多光源场景绘制的加速方法,并利用gpu硬件的计算能力,提高了计算与绘制效率,该方法主要利用了二维体素化的方法和提出的一种快速的可见性判断的方法。

本发明解决上述技术问题的技术方案为:一种基于场景多方向体素化的多光源场景加速绘制方法,该方法包括如下步骤:

步骤(1)、首先将方向进行离散化,设定方向上角度的增量k,然后计算每一个方向下场景的包围盒和坐标轴的方向,将每个方向下场景体素化后保存在二维体素化数组v中;

步骤(2)、确定相机的位置,由相机的位置渲染场景,得到输出图像,同时记录每个像素的位置、法向和颜色信息线;

步骤(3)、确定每个灯的位置,对于输出图像的每个像素,使用gpu并行计算每个像素的亮度值,gpu的每个线程处理一个像素;

步骤(4)、首先根据相机位置计算出输出图像,根据输出图像的点和灯的位置确定光线r,根据r的方向计算对应的离散化方向(θ,φ),然后根据方向找v中找到光线穿过的一列格子,根据这列格子中有无三角形面片确定该光线是否被遮挡,统计所有未遮挡的灯的个数,从而确定该点的亮度。

进一步的,步骤(1)具体包括:设定方向的角度增量k及包围盒的分辨率n,k确定出所有的方向,在显存中申请对应大小的缓存,从每个方向对场景进行一次体素化;体素化的时候从x,y,z每个方向利用opengl渲染管线渲染一次场景,在shader中利用得到的片元确定被占位的格子。

总之,与之前的方法相比,本发明能够快速地绘制具有大量光源的场景并且能得到较好的效果。本发明主要有两点贡献:第一,给出了多方向体素化的方法。第二,提出了一种快速的可见性判断的方法。

附图说明

图1为一种基于场景多方向体素化的多光源场景加速绘制方法整体流程图;

图2为计算θ,φ示意图;

图3为光线和对应方向体素化结果相交列示意图;

图4为静态场景实验结果;

图5为动态场景实验结果;

图6为我们的方法和ism方法的误差图;

图7为我们的方法和ism方法所有场景对比。

具体实施方式

下面结合附图以及本发明的具体实施方式进一步说明本发明。

本发明一种基于场景多方向体素化的多光源场景加速绘制方法,包括如下步骤:

1)多方向的场景体素化

首先将方向进行离散化,设定方向上角度的增量k,然后计算每一个方向下场景的包围盒和坐标轴的方向。具体到体素化的具体过程是这样进行的:对物体走一遍opengl的渲染管线。最后,在pixelshader中对得到的每一个片元进行计算,使用预计算出的每个方向下的坐标轴和半径计算得到在每个方向下的cell的坐标。

最后是关于体素化的存储问题。由于对于每个体素单元,它的取值为0或者1,所以我们可以将每列相邻的多个体素单元的状态用多个整数来表示,比如32位的整数可以表示连续的32个格子的状态。这样我们需要的总的bit为s=90*90*128*128*128,每8个bit是一个字节,所以需要的总的内存为s/8=1.978g。因此,就得到了一个二维的体素化数组v。

2)光线可见性的判断

首先根据相机位置计算出输出图像,根据输出图像的点和灯的位置确定光线r。根据r的方向计算对应的离散化方向(θ,φ),然后根据方向找v中找到光线穿过的一列格子,从而进行该光线是否被近似场景所遮挡的结果。

如图2所示,在θ=30,φ=42时的离散方向值与光线方向最为接近,k=2(k是方向离散化的步长),因此光线-场景求交需要使用体素化数据为v[30/2][42/2]中存储的体素化数组。

光线-场景的交点可以通过v[θ/k][φ/k]计算得到。每个体素中如果存在几何信息,标记为1,否则为0。光线的两个端点会投影在这行体素上。通过移位操作,得到这行体素删减后的长度。其中光线与场景相交的数据包含至少一位非零数据则说明相交。在图3中,该行体素有32位。整行信息为00000010000000001111111100000000。从i=4到i=27是光线段被裁减的范围,即001000000000111111110000,可以看出数据不为0,所以此光线与场景相交(在兔子模型的耳朵和身体上)。

具体实施例如下:

1)固定时间光线-场景的求交

光线-场景的求交计算可以通过对几何场景近似来进行加速。几何场景的多方向体素化通过算法1进行计算。

算法1几何场景多方向体素化算法

输入:三角形表示的三维模型s

输出:多方向体素化的结果,采用二维数组v存储。

算法步骤:

(1)设定每个方向的角度的增量k;

(2)算法遍历两个方向的角度θ和φ,并且每次增加k度;

(3)初始化设

通过深度剥离方法(depthpeeling)计算v[θ/k][φ/k],对于包含几何场景多边形面片的体素置1,空体素置0。然后当前层通过反复的深度剥离进行计算,直到深度的最后一层为止。

深度剥离是利用前一次的深度缓存值来计算当前值的方法。将当前层加入到体素化信息中,并将上一层更改为当前层,为下一次深度剥离做好准备。深度剥离会在正交投影下执行三次,分别在x轴,y轴,z轴方向上各执行一次。此三重投影使得表面定向的取样更具鲁棒性。例如,如果只沿z轴方向进行深度剥离,将会漏掉平行于z轴方向的表面。

事实上如果设定角度增量k=2度,将会产生大小为90×90的体素化数组。如果单方向体素化的分辨率为128×128×128,体素化信息的每行会有128位,等于4个32位的整数型大小,每个体素化信息需要256kb,存体素化信息的二维数组大小将近2gb。

光线r和体素化二维数组v的求交采用了算法2进行计算。

算法2光线的可见性判断算法

输入:二维的体素化数组v,角度增量k以及光线r;

输出:一个布尔值,即光线是否和场景有交点;

算法步骤:

(1)由光线r的方向确定角度θ和φ;

(2)由θ和φ找到光线r在v[θ/k][φ/k]中穿过的一行row;

(3)由光线r的端点确定row的一个子区间,如果子区间不为0,则相交,否则不相交。

首先根据r的方向计算对应的离散化方向(θ,φ),然后根据生成几何场景多方向体素化结果中用到的k来获取对应方向的场景体素化结果v[θ/k][φ/k],从而进行该光线是否被近似场景所遮挡的结果。

2)动态多光源的实时绘制

固定时间内光线-场景加速求交方法使得动态多光源场景能够进行实时绘制,绘制采用了算法3。

算法3静态场景动态多光源实时绘制算法

输入:场景s,相机位置c,n个光源的集合l,二维体素化数组v,角度增量;

输出:从相机c看到的场景s的光照情况;

算法步骤:

(1)在无照明条件下绘制输出图像i。

(2)枚举i的每一个像素p,计算其光照强度。对于一个确定的p,枚举每一个光源li,由p和li会确定一条光线r,借助于算法2可得到li是否会照射到p。这样就得到了p的亮度。

图4展示了实验的3个静态场景。其中第一行为我们的方法对于不同场景的渲染结果,第二行为光线跟踪方法结果。

3)包含刚体运动对象的场景

一些场景中会有多种对象,每类种对象又有多个实例,各个实例在场景中进行不同的运动。本文采用算法4对这类场景的多光源绘制进行支持。

算法4对包含刚体运动对象的场景光线可见性判定算法

输入:对于静态场景的二维体素化数组v0,每种动态对象doti的多方向体素化数组vi,当前每个动态对象实例doj的坐标csj,光线r;

输出:一个布尔值,如果即光线是否和场景有交点;

算法步骤:

(1)使用算法2判断是否和v0有交点,若相交,则返回遮挡;

(2)否则,算法会枚举每一个动态对象实例doj,设其类型为doti,根据csj将光线r变换到vi的坐标系下rj,然后同样使用算法2计算rj是否与vi有交点。若有则返回遮挡;

(3)若光线与所有动态物体都不相交,返回不遮挡;否则返回遮挡。

当光线首先与场景的静态部分求交时,如果没有交点,光线将会转换到场景中每个对象实例的局部坐标系,之后光线会与该种对象的多方向体素化结果求交。例如,对于图5中左边的飞机场景,预先计算出了两个体素化二维数组:一个是建筑物vb,另一个是飞机vp;然后光线r与场景vb的求交,如果无交点,则需要与vp求交来获取是否被遮挡。

图5展示了动态实验场景效果,其中第一行为我们的方法对于不同场景的渲染结果,第二行为光线跟踪方法结果。

4)包含变形对象的场景

对于包含非刚体运动对象或者可变形对象的场景,可以采用算法5在每帧中重新生成场景的多方向体素化结果。

算法5包含变形对象的场景的多方向体素化算法

输入:当前帧的动态场景s,角度增量k;

输出:多方向体素化结果数组v;

算法步骤:

(1)按照算法1中的方法计算v[0][0]。

(2)枚举两个方向的转角(θ,φ),将v[0][0]旋转θ,φ的角度得到v[θ/k][φ/k]。

本发明没有采用深度剥离计算场景多方向体素化数据,只是用算法1计算了初始的体素化数据v[0][0]。然后采用旋转初始的体素化数据的方式计算其它方向的体素化数据。一个包含场景多边形面片的体素(i,j,t),在旋转坐标系之后对应的体素点为(i',j’,t’)。通过旋转初始的体素化信息来计算其它体素信息虽然在计算精度上稍有损失,但比从原始场景中进行多方向深度剥离的计算方法要快很多。

下面将本发明方法与光线跟踪在绘制速度上进行了对比。对于光线跟踪方法,本发明使用了nvidiaoptix的层次包围盒(bvh)对其进行加速。表1给出了本发明方法的每帧渲染时间以及对相对于光线跟踪方法的加速比。可以看出本发明方法比光线跟踪方法更为高效。

表1与光线追踪方法的速度对比。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1