一种加速被面光源照射的3D虚拟场景的光线跟踪的方法转让专利

申请号 : CN201010527747.4

文献号 : CN101982838A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陈纯毅杨华民范静涛丁莹冯欣底晓强韩成陈占芳张育力曲福恒权巍从立钢

申请人 : 长春理工大学

摘要 :

本发明公开一种加速被面光源照射的3D虚拟场景的光线跟踪的方法,属于真实感3D虚拟场景绘制技术领域。当前常用蒙特卡洛光线跟踪方法绘制被面光源照射的3D虚拟场景。由于蒙特卡洛光线跟踪方法需要执行大量的光源采样点可见性计算,因此其计算效率不高。本发明通过一个预计算过程获得面光源照射到的几何面片的深度数据,在光线跟踪过程中利用这些深度数据直接计算每个场景点处的光源采样点可见性,避免了可见性测试光线的创建、遍历、求交测试等运算,提高了光线跟踪效率。相对于蒙特卡洛光线跟踪方法,本发明方法可使光线跟踪的速度提高3~4倍。

权利要求 :

1.一种加速被面光源照射的3D虚拟场景的光线跟踪的方法,其特征在于,所需的设备及实现步骤如下:

所需设备:主机系统(101)和GPU计算集群(102);主机系统(101)包括CPU(103)、内存(104)和磁盘(105);

实现步骤:

本方法(010)部分,得到面光源照射到的几何面片的深度数据,具体步骤如下:

步骤(S011):将3D虚拟场景模型数据(A001)从磁盘(105)加载到内存(104)中;

步骤(S012):在CPU(103)上计算面光源轮廓线(201)的外切矩形(202);

步骤(S013):在外切矩形(202)内均匀地选取m行、n列光源采样点,得到一个二维采样点阵列(A002),将其存放在内存(104)中;

步骤(S014):在内存(104)中创建一个m行、n列的掩模矩阵M(A003),掩模矩阵M(A003)中的各个元素与二维采样点阵列(A002)中的各个光源采样点一一对应;掩模矩阵M(A003)的每个元素包含一个标识变量(301)(变量名为tag)、一个深度图指针变量(302)(变量名为depthMapPtr)和一个坐标系变换矩阵变量(303)(变量名为transformMatrix);将掩模矩阵M(A003)的每个元素包含的标识变量(301)设置为0;

步骤(S015):任意选取一个与面光源平面平行的向量作为U方向向量(A004);

步骤(S016):把3D虚拟场景模型数据(A001)送入GPU计算集群(102)的Global Memory中;

步骤(S017):对二维采样点阵列(A002)中的每个光源采样点Sij(下标i为光源采样点Sij在二维采样点阵列(A002)中的行号,下标j为光源采样点Sij在二维采样点阵列(A002)中的列号),判断光源采样点Sij是否在面光源轮廓线(201)之内,如果光源采样点Sij在面光源轮廓线(201)之内,则:第一,将掩模矩阵M(A003)的第i行、j列的元素的标识变量(301)设置为1;

第二,以光源采样点Sij为虚拟相机视点,以面光源平面法向量为虚拟相机视轴正方向(面光源平面法向量与面光源的朝向相同),以U方向向量(A004)为虚拟相机向上方向向量,根据3D虚拟场景与面光源的位置关系设置合适的虚拟相机视场角(A005),根据3D虚拟场景的复杂程度设置合适的虚拟相机分辨率(A006),读取存储于GPU计算集群(102)的Global Memory中的3D虚拟场景模型数据(A001),调用光栅化图形API在GPU计算集群(102)上绘制3D虚拟场景,记录每个像素的深度值,从而得到以光源采样点Sij为虚拟相机视点的深度图(A007);

第三,把深度图(A007)传回内存(104),并将深度图(A007)的内存首地址赋值给掩模矩阵M(A003)的第i行、j列的元素的深度图指针变量(302);

本方法的(020)部分,根据二维采样点阵列(A002)中的每个光源采样点的位置及面光源平面法向量,计算从世界坐标系到以各光源采样点为原点的光源采样点坐标系(B001)的变换矩阵,具体步骤如下:步骤(S021):选取面光源平面法向量作为N方向向量(B002),定义V方向向量(B003)为N方向向量(B002)与U方向向量(A004)的叉乘;

步骤(S022):将U方向向量(A004)、N方向向量(B002)和V方向向量(B003)进行归一化,得到归一化的U方向向量(B004)、归一化的N方向向量(B005)和归一化的V方向向量(B006);

步骤(S023):对于掩模矩阵M(A003)中的每个元素(B007),判断元素(B007)的标识变量(301)是否为1,如果为1,则先计算元素(B007)所在的行号i和列号j,再计算二维采样点阵列(A002)中第i行、j列光源采样点Sij在世界坐标系下的坐标Wij(B008),然后按如下公式计算变换矩阵Tij:其中Ux、Uy、Uz分别为归一化的U方向向量

(B004)的三个分量,Vx、Vy、Vz分别为归一化的N方向向量(B005)的三个分量,Nx、Ny、Nz分别为归一化的V方向向量(B006)的三个分量,最后将Tij赋值给元素(B007)的坐标系变换矩阵变量(303);

本方法的(030)部分,在光线跟踪中利用本方法(010)部分计算出的深度图(A007)来加速绘制被面光源照射的3D虚拟场景,具体步骤如下:步骤(S031):将掩模矩阵M(A003)及其各元素的深度图指针变量(302)指向的所有深度图(A007)送入GPU计算集群(102)的Global Memory中;

步骤(S032):按照正常的光线跟踪流程,从虚拟相机视点发射穿过屏幕像素(C001)的光线(C002),并判断光线(C002)与3D虚拟场景的几何面片(C003)是否相交,如果相交,则计算出交点坐标P(C004),并转步骤(S033),否则屏幕像素(C001)的颜色设置为背景色(C005),并结束对光线(C002)的跟踪;

步骤(S033):对掩模矩阵M(A003)中的每个元素(C006),判断元索(C006)的标识变量(301)是否为1,如果为1,则首先将元素(C006)的坐标系变换矩阵变量(303)赋值给变量T(C007),再计算元素(C006)所在的行号i和列号j,然后读取二维采样点阵列(A002)的第i行、j列光源采样点Sij(C008),并计算光源采样点Sij(C008)在世界坐标系下的坐标Wij(C009),最后将光源采样点Sij(C008)的行号i与列号j、交点坐标P(C004)、坐标Wij(C009)和变量T(C007)打包成一个结构体变量(C010)送入GPU计算集群(102)的Global Memory中;统计掩模矩阵M(A003)中标识变量(301)为1的元素个数(C011),将元素个数(C011)赋值给变量Ns;

步骤(S034):在GPU计算集群(102)上创建Ns个并行线程,各线程分别从GPU计算集群(102)的Global Memory中读取一个结构体变量(C010),并行地做以下计算:第一, 其中Px、Py、Pz分别为存储于结构体变量(C010)中的交点坐标

P(C004)的x、y、z坐标分量,T为存储于结构体变量(C010)中的变量T(C007);

第二, 其中d为步骤(S017)中调用光栅化图形API在GPU计算集

群(102)上绘制3D虚拟场景时的投影面到虚拟相机视点的距离;

第 三, 其 中θv 为 步 骤

(S017)中调用光栅化图形API在GPU计算集群(102)上绘制3D虚拟场景时设置的虚拟相机视场角(A005),N1为步骤(S017)中调用光栅化图形API在GPU计算集群(102)上绘制

3D虚拟场景时设置的虚拟相机垂直分辨率,N2为步骤(S017)中调用光栅化图形API在GPU计算集群(102)上绘制3D虚拟场景时设置的虚拟相机水平分辨率;

第四,根据结构体变量(C010)中保存的行号i与列号j,读取存储于GPU计算集群(102)的Global Memory中的掩模矩阵M(A003)的第i行、j列元素(C012)的深度图指针变量(302)指向的深度图的第l行、k列像素的深度值(C013);计算存储于结构体变量(C010)中的交点坐标P(C004)与存储于结构体变量(C010)中的坐标Wij(C009)之间的距离D(C014);如果深度值(C013)比距离D(C014)小,则表明存储于结构体变量(C010)中的交点坐标P(C004)处的场景点(C015)不能直接被光源采样点Sij照射,光源采样点Sij对场景点(C015)的直接光照贡献Ld(C016)为0,否则计算光源采样点Sij对场景点(C015)的直接光照贡献Ld(C016);最后将直接光照贡献Ld(C016)传回内存(104);

步骤(S035):在CPU(103)上将步骤(S034)中的各线程传回内存(104)的所有直接光照贡献Ld(C016)相加,以得到面光源对交点坐标P(C004)处的场景点的直接光照值;

步骤(S036):按照正常的光线跟踪流程递归地跟踪交点坐标P(C004)处的反射光线(或者折射光线),以便计算交点坐标P(C004)处的场景点的间接光照值;在递归过程中,所有场景点处的直接光照值也按上述过程进行计算;最后根据交点坐标P(C004)处的场景点的直接光照值、间接光照值以及材质数据计算出屏幕像素(C001)的颜色。

说明书 :

一种加速被面光源照射的3D虚拟场景的光线跟踪的方法

技术领域

[0001] 本发明属于真实感3D虚拟场景绘制技术领域,涉及一种加速被面光源照射的3D虚拟场景的光线跟踪的方法。

背景技术

[0002] 真实感3D虚拟场景绘制技术在数字娱乐、影视特效、建筑CAD、广告动画等领域受到人们的广泛关注。目前3D虚拟场景绘制技术虽然已经得到深入的研究,但是如何快速绘制具有高度真实感的3D虚拟场景画面仍然是一个有待进一步解决的难题。传统的光栅化技术不支持全局光照计算,使用其绘制的3D虚拟场景画面往往缺乏真实感。光线跟踪方法能够绘制出反射、折射、阴影等效果,是一种全局光照算法。使用光线跟踪绘制得到的3D虚拟场景画面比使用光栅化技术绘制得到的3D虚拟场景画面的真实感更强。因此光线跟踪方法在真实感3D虚拟场景绘制中得到了广泛应用。
[0003] 当要求高度的真实感时,3D虚拟场景通常使用面光源而非理想的点光源进行照射。通常使用蒙特卡洛光线跟踪方法绘制被面光源照射的3D虚拟场景。蒙特卡洛光线跟踪方法通过对面光源进行重要性采样实现全局光照计算。对每个需要计算光照值的场景点,该方法都需要计算大量的光源采样点的可见性,即判断场景点与光源采样点之间是否存在遮挡。在计算每个光源采样点的可见性时,需要产生一条从场景点出发,射向该光源采样点的可见性测试光线,并用此可见性测试光线遍历场景加速结构,以便确定是否有几何图元与此可见性测试光线相交,进而判断场景点与光源采样点之间是否存在遮挡。由于光线跟踪需要跟踪大量光线的多次反射(或折射)过程,并且需要计算每个反射(或折射)点的光照值,因此上述光源采样点的可见性计算量非常大。这使得蒙特卡洛光线跟踪的计算效率并不高,导致绘制一幅3D虚拟场景画面的时间很长。所以人们迫切需要一种能够加速被面光源照射的3D虚拟场景的光线跟踪的方法。

发明内容

[0004] 本发明的目的在于提供一种加速被面光源照射的3D虚拟场景的光线跟踪的方法。本方法在光线跟踪之前通过一个预计算过程获得面光源照射到的几何面片的深度数据,在光线跟踪过程中利用这些深度数据直接计算每个场景点处的光源采样点可见性,避免了可见性测试光线的创建、遍历、求交测试等运算,提高了光线跟踪效率。本发明的方法所需的设备及其实现步骤如下:
[0005] 1.所需设备:主机系统(101)和GPU计算集群(102);如图1所示,主机系统(101)包括CPU(103)、内存(104)和磁盘(105)。
[0006] 2.实现步骤:
[0007] 本方法(010)部分,得到面光源照射到的几何面片的深度数据,具体步骤如下:
[0008] 步骤(S011):将3D虚拟场景模型数据(A001)从磁盘(105)加载到内存(104)中;
[0009] 步骤(S012):在CPU(103)上计算面光源轮廓线(201)的外切矩形(202);
[0010] 步骤(S013):如图2所示,在外切矩形(202)内均匀地选取m行、n列光源采样点,得到一个二维采样点阵列(A002),将其存放在内存(104)中;
[0011] 步骤(S014):在内存(104)中创建一个m行、n列的掩模矩阵M(A003),掩模矩阵M(A003)中的各个元素与二维采样点阵列(A002)中的各个光源采样点一一对应;掩模矩阵M(A003)的每个元素的数据结构如图3所示,其包含一个标识变量(301)(变量名为tag)、一个深度图指针变量(302)(变量名为depthMapPtr)和一个坐标系变换矩阵变量(303)(变量名为transformMatrix);将掩模矩阵M(A003)的每个元素包含的标识变量(301)设置为0;
[0012] 步骤(S015):任意选取一个与面光源平面平行的向量作为U方向向量(A004);
[0013] 步骤(S016):把3D虚拟场景模型数据(A001)送入GPU计算集群(102)的Global Memory中;
[0014] 步骤(S017):对二维采样点阵列(A002)中的每个光源采样点Sij(下标i为光源采样点Sij在二维采样点阵列(A002)中的行号,下标j为光源采样点Sij在二维采样点阵列(A002)中的列号),判断光源采样点Sij是否在面光源轮廓线(201)之内,如果光源采样点Sij在面光源轮廓线(201)之内,则:
[0015] ①将掩模矩阵M(A003)的第i行、j列的元素的标识变量(301)设置为1;
[0016] ②以光源采样点Sij为虚拟相机视点,以面光源平面法向量为虚拟相机视轴正方向(面光源平面法向量与面光源的朝向相同),以U方向向量(A004)为虚拟相机向上方向向量,根据3D虚拟场景与面光源的位置关系设置合适的虚拟相机视场角(A005),根据3D虚拟场景的复杂程度设置合适的虚拟相机分辨率(A006),读取存储于GPU计算集群(102)的GlobalMemory中的3D虚拟场景模型数据(A001),调用光栅化图形API在GPU计算集群(102)上绘制3D虚拟场景,记录每个像素的深度值,从而得到以光源采样点Sij为虚拟相机视点的深度图(A007);
[0017] ③把深度图(A007)传回内存(104),并将深度图(A007)的内存首地址赋值给掩模矩阵M(A003)的第i行、j列的元素的深度图指针变量(302)。
[0018] 本方法的(020)部分,根据二维采样点阵列(A002)中的每个光源采样点的位置及面光源平面法向量,计算从世界坐标系到以各光源采样点为原点的光源采样点坐标系(B001)的变换矩阵,具体步骤如下:
[0019] 步骤(S021):选取面光源平面法向量作为N方向向量(B002),定义V方向向量(B003)为N方向向量(B002)与U方向向量(A004)的叉乘;
[0020] 步骤(S022):将U方向向量(A004)、N方向向量(B002)和V方向向量(B003)进行归一化,得到归一化的U方向向量(B004)、归一化的N方向向量(B005)和归一化的V方向向量(B006);
[0021] 步骤(S023):对于掩模矩阵M(A003)中的每个元素(B007),判断元素(B007)的标识变量(301)是否为1,如果为1,则先计算元素(B007)所在的行号i和列号j,再计算二维采样点阵列(A002)中第i行、j列光源采样点Sij在世界坐标系下的坐标Wij(B008),然后按如下公式计算变换矩阵Tij:
[0022] 其中Ux、Uy、Uz分别为归一化的U方向向量(B004)的三个分量,Vx、Vy、Vz分别为归一化的N方向向量(B005)的三个分量,Nx、Ny、Nz分别为归一化的V方向向量(B006)的三个分量,最后将Tij赋值给元素(B007)的坐标系变换矩阵变量(303)。
[0023] 本方法的(030)部分,在光线跟踪中利用本方法(010)部分计算出的深度图(A007)来加速绘制被面光源照射的3D虚拟场景,具体步骤如下:
[0024] 步骤(S031):将掩模矩阵M(A003)及其各元素的深度图指针变量(302)指向的所有深度图(A007)送入GPU计算集群(102)的Global Memory中;
[0025] 步骤(S032):按照正常的光线跟踪流程,从虚拟相机视点发射穿过屏幕像素(C001)的光线(C002),并判断光线(C002)与3D虚拟场景的几何面片(C003)是否相交,如果相交,则计算出交点坐标P(C004),并转步骤(S033),否则屏幕像素(C001)的颜色设置为背景色(C005),并结束对光线(C002)的跟踪;
[0026] 步骤(S033):对掩模矩阵M(A003)中的每个元素(C006),判断元素(C006)的标识变量(301)是否为1,如果为1,则首先将元素(C006)的坐标系变换矩阵变量(303)赋值给变量T(C007),再计算元素(C006)所在的行号i和列号j,然后读取二维采样点阵列(A002)的第i行、j列光源采样点Sij(C008),并计算光源采样点Sij(C008)在世界坐标系下的坐标Wij(C009),最后将光源采样点Sij(C008)的行号i与列号j、交点坐标P(C004)、坐标Wij(C009)和变量T(C007)打包成一个结构体变量(C010)送入GPU计算集群(102)的Global Memory中;统计掩模矩阵M(A003)中标识变量(301)为1的元素个数(C011),将元素个数(C011)赋值给变量Ns;
[0027] 步骤(S034):在GPU计算集群(102)上创建Ns个并行线程,各线程分别从GPU计算集群(102)的Global Memory中读取一个结构体变量(C010),并行地做以下计算:
[0028] 其中Px、Py、Pz分别为存储于结构体变量(C010)中的交点坐标P(C004)的x、y、z坐标分量,T为存储于结构体变量(C010)中的变量T(C007);
[0029] 其中d为步骤(S017)中调用光栅化图形API在GPU计算集群(102)上绘制3D虚拟场景时的投影面到虚拟相机视点的距离;
[0030] 其中θv为步 骤(S017)中调用光栅化图形API在GPU计算集群(102)上绘制3D虚拟场景时设置的虚拟相机视场角(A005),N1为步骤(S017)中调用光栅化图形API在GPU计算集群(102)上绘制
3D虚拟场景时设置的虚拟相机垂直分辨率,N2为步骤(S017)中调用光栅化图形API在GPU计算集群(102)上绘制3D虚拟场景时设置的虚拟相机水平分辨率;
[0031] ④根据结构体变量(C010)中保存的行号i与列号j,读取存储于GPU计算集群(102)的Global Memory中的掩模矩阵M(A003)的第i行、j列元素(C012)的深度图指针变量(302)指向的深度图的第l行、k列像素的深度值(C013);计算存储于结构体变量(C010)中的交点坐标P(C004)与存储于结构体变量(C010)中的坐标Wij(C009)之间的距离D(C014);如果深度值(C013)比距离D(C014)小,则表明存储于结构体变量(C010)中的交点坐标P(C004)处的场景点(C015)不能直接被光源采样点Sij照射,光源采样点Sij对场景点(C015)的直接光照贡献Ld(C016)为0,否则计算光源采样点Sij对场景点(C015)的直接光照贡献Ld(C016);最后将直接光照贡献Ld(C016)传回内存(104);
[0032] 步骤(S035):在CPU(103)上将步骤(S034)中的各线程传回内存(104)的所有直接光照贡献Ld(C016)相加,以得到面光源对交点坐标P(C004)处的场景点的直接光照值;
[0033] 步骤(S036):按照正常的光线跟踪流程递归地跟踪交点坐标P(C004)处的反射光线(或者折射光线),以便计算交点坐标P(C004)处的场景点的间接光照值;在递归过程中,所有场景点处的直接光照值也按上述过程进行计算;最后根据交点坐标P(C004)处的场景点的直接光照值、间接光照值以及材质数据计算出屏幕像素(C001)的颜色。
[0034] 有益效果
[0035] 本发明提供了一种加速被面光源照射的3D虚拟场景的光线跟踪的方法。本发明方法与蒙特卡洛光线跟踪方法相比,避免了可见性测试光线的创建、遍历、求交测试等运算,提高了光线跟踪效率。由于使用了掩模矩阵,本发明方法适用于任何轮廓形状的平面面光源。另外,本发明方法利用GPU计算集群并行地计算不同光源采样点对场景点的直接光照值,大大地提高了光线跟踪过程中的光照计算速度。相对于蒙特卡洛光线跟踪方法,本发明方法可使光线跟踪的速度提高3~4倍。

附图说明

[0036] 图1是本发明所需的设备及其连接方式示意图;图2是面光源轮廓线及其外切矩形与二维光源采样点阵列示意图;图3是掩模矩阵的元素的数据结构示意图。

具体实施方式

[0037] 为了使本发明的特征和优点更加清楚明白,下面参照附图结合具体实施例对本发明作进一步的描述。
[0038] 本实施例中的CPU(103)选择Intel XeonTM CPU 3.20GHz,内存(104)选择金士顿8GBDDR3 1333,磁盘(105)选择Buffalo HD-CE 1.5 TU2,GPU计算集群(102)选择AMAX Tesla系列GPU计算集群;软件编程工具选用VC++2008、OpenGL 2.0和CUDA 2.0。
[0039] 本方法(010)部分,得到面光源照射到的几何面片的深度数据,具体步骤如下:
[0040] 步骤(S011):将3D虚拟场景模型数据(A001)从磁盘(105)加载到内存(104)中;
[0041] 步骤(S012):在CPU(103)上计算面光源轮廓线(201)的外切矩形(202);
[0042] 步骤(S013):如图2所示,在外切矩形(202)内均匀地选取m行、n列光源采样点,得到一个二维采样点阵列(A002),将其存放在内存(104)中;
[0043] 步骤(S014):在内存(104)中创建一个m行、n列的掩模矩阵M(A003),掩模矩阵M(A003)中的各个元素与二维采样点阵列(A002)中的各个光源采样点一一对应;掩模矩阵M(A003)的每个元素的数据结构如图3所示,其包含一个标识变量(301)(变量名为tag)、一个深度图指针变量(302)(变量名为depthMapPtr)和一个坐标系变换矩阵变量(303)(变量名为transformMatrix);将掩模矩阵M(A003)的每个元素包含的标识变量(301)设置为0;
[0044] 步骤(S015):任意选取一个与面光源平面平行的向量作为U方向向量(A004);
[0045] 步骤(S016):把3D虚拟场景模型数据(A001)送入GPU计算集群(102)的Global Memory中;
[0046] 步骤(S017):对二维采样点阵列(A002)中的每个光源采样点Sij(下标i为光源采样点Sij在二维采样点阵列(A002)中的行号,下标j为光源采样点Sij在二维采样点阵列(A002)中的列号),判断光源采样点Sij是否在面光源轮廓线(201)之内,如果光源采样点Sij在面光源轮廓线(201)之内,则:
[0047] ①将掩模矩阵M(A003)的第i行、j列的元素的标识变量(301)设置为1;
[0048] ②以光源采样点Sij为虚拟相机视点,以面光源平面法向量为虚拟相机视轴正方向(面光源平面法向量与面光源的朝向相同),以U方向向量(A004)为虚拟相机向上方向向量,根据3D虚拟场景与面光源的位置关系设置合适的虚拟相机视场角(A005),根据3D虚拟场景的复杂程度设置合适的虚拟相机分辨率(A006),读取存储于GPU计算集群(102)的GlobalMemory中的3D虚拟场景模型数据(A001),调用OpenGL API在GPU计算集群(102)上绘制3D虚拟场景,记录每个像素的深度值,从而得到以光源采样点Sij为虚拟相机视点的深度图(A007);
[0049] ③把深度图(A007)传回内存(104),并将深度图(A007)的内存首地址赋值给掩模矩阵M(A003)的第i行、j列的元素的深度图指针变量(302)。
[0050] 本方法的(020)部分,根据二维采样点阵列(A002)中的每个光源采样点的位置及面光源平面法向量,计算从世界坐标系到以各光源采样点为原点的光源采样点坐标系(B001)的变换矩阵,具体步骤如下:
[0051] 步骤(S021):选取面光源平面法向量作为N方向向量(B002),定义V方向向量(B003)为N方向向量(B002)与U方向向量(A004)的叉乘;
[0052] 步骤(S022):将U方向向量(A004)、N方向向量(B002)和V方向向量(B003)进行归一化,得到归一化的U方向向量(B004)、归一化的N方向向量(B005)和归一化的V方向向量(B006);
[0053] 步骤(S023):对于掩模矩阵M(A003)中的每个元素(B007),判断元素(B007)的标识变量(301)是否为1,如果为1,则先计算元素(B007)所在的行号i和列号j,再计算二维采样点阵列(A002)中第i行、j列光源采样点Sij在世界坐标系下的坐标Wij(B008),然后按如下公式计算变换矩阵Tij:
[0054] 其中Ux、Uy、Uz分别为归一化的U方向向量(B004)的三个分量,Vx、Vy、Vz分别为归一化的N方向向量(B005)的三个分量,Nx、Ny、Nz分别为归一化的V方向向量(B006)的三个分量,最后将Tij赋值给元素(B007)的坐标系变换矩阵变量(303)。
[0055] 本方法的(030)部分,在光线跟踪中利用本方法(010)部分计算出的深度图(A007)来加速绘制被面光源照射的3D虚拟场景,具体步骤如下:
[0056] 步骤(S031):将掩模矩阵M(A003)及其各元素的深度图指针变量(302)指向的所有深度图(A007)送入GPU计算集群(102)的Global Memory中;
[0057] 步骤(S032):按照正常的光线跟踪流程,从虚拟相机视点发射穿过屏幕像素(C001)的光线(C002),并判断光线(C002)与3D虚拟场景的几何面片(C003)是否相交,如果相交,则计算出交点坐标P(C004),并转步骤(S033),否则屏幕像素(C001)的颜色设置为背景色(C005),并结束对光线(C002)的跟踪;
[0058] 步骤(S033):对掩模矩阵M(A003)中的每个元素(C006),判断元素(C006)的标识变量(301)是否为1,如果为1,则首先将元素(C006)的坐标系变换矩阵变量(303)赋值给变量T(C007),再计算元素(C006)所在的行号i和列号j,然后读取二维采样点阵列(A002)的第i行、j列光源采样点Sij(C008),并计算光源采样点Sij(C008)在世界坐标系下的坐标Wij(C009),最后将光源采样点Sij(C008)的行号i与列号j、交点坐标P(C004)、坐标Wij(C009)和变量T(C007)打包成一个结构体变量(C010)送入GPU计算集群(102)的Global Memory中;统计掩模矩阵M(A003)中标识变量(301)为1的元素个数(C011),将元素个数(C011)赋值给变量Ns;
[0059] 步骤(S034):利用CUDA API在GPU计算集群(102)上创建Ns个并行线程,各线程分别从GPU计算集群(102)的Global Memory中读取一个结构体变量(C010),并行地做以下计算:
[0060] 其中Px、Py、Pz分别为存储于结构体变量(C010)中的交点坐标P(C004)的x、y、z坐标分量,T为存储于结构体变量(C010)中的变量T(C007);
[0061] 其中d为步骤(S017)中调用OpenGLAPI在GPU计算集群(102)上绘制3D虚拟场景时的投影面到虚拟相机视点的距离;
[0062] 其中θv为步 骤(S017)中调用OpenGL API在GPU计算集群(102)上绘制3D虚拟场景时设置的虚拟相机视场角(A005),N1为步骤(S017)中调用OpenGLAPI在GPU计算集群(102)上绘制3D虚拟场景时设置的虚拟相机垂直分辨率,N2为步骤(S017)中调用OpenGL API在GPU计算集群(102)上绘制3D虚拟场景时设置的虚拟相机水平分辨率;
[0063] ④根据结构体变量(C010)中保存的行号i与列号j,读取存储于GPU计算集群(102)的Global Memory中的掩模矩阵M(A003)的第i行、j列元素(C012)的深度图指针变量(302)指向的深度图的第l行、k列像素的深度值(C013);计算存储于结构体变量(C010)中的交点坐标P(C004)与存储于结构体变量(C010)中的坐标Wij(C009)之间的距离D(C014);如果深度值(C013)比距离D(C014)小,则表明存储于结构体变量(C010)中的交点坐标P(C004)处的场景点(C015)不能直接被光源采样点Sij照射,光源采样点Sij对场景点(C015)的直接光照贡献Ld(C016)为0,否则计算光源采样点Sij对场景点(C015)的直接光照贡献Ld(C016);最后将直接光照贡献Ld(C016)传回内存(104);
[0064] 步骤(S035):在CPU(103)上将步骤(S034)中的各线程传回内存(104)的所有直接光照贡献Ld(C016)相加,以得到面光源对交点坐标P(C004)处的场景点的直接光照值;
[0065] 步骤(S036):按照正常的光线跟踪流程递归地跟踪交点坐标P(C004)处的反射光线(或者折射光线),以便计算交点坐标P(C004)处的场景点的间接光照值;在递归过程中,所有场景点处的直接光照值也按上述过程进行计算;最后根据交点坐标P(C004)处的场景点的直接光照值、间接光照值以及材质数据计算出屏幕像素(C001)的颜色。