1.基于两级可见性平滑滤波的近似柔和阴影绘制方法,其特征在于,所需的实现步骤如下:
首先从视点发射穿过光线跟踪虚拟像素平面上的每个像素的中心点的射线,每条射线被称作一条相机光线;利用光线跟踪技术,跟踪每条相机光线在三维场景中的传播,记录对应的传播路径与三维场景的几何对象的第一和第二个交点位置处的光源可见性以及不考虑遮挡时的光照值;先对记录的可见性数据进行平滑滤波,再利用平滑滤波后得到的可见性数据调制不考虑遮挡时的光照值以得到近似柔和阴影绘制结果;本方法的具体实现步骤如下:Step001:把三维场景几何模型从磁盘文件加载到GPU计算设备的存储器中,并创建三维场景几何模型的空间加速结构A001;
Step002:在GPU计算设备的存储器中创建一个包含M行、N列元素的二维数组A002,每个数组元素占据一个字节的存储空间,M为光线跟踪虚拟像素平面上的像素行数,N为光线跟踪虚拟像素平面上的像素列数;把数组A002的每个元素对应的存储空间的每个位都设置为
1;在GPU计算设备的存储器中创建一个包含M行、N列元素的二维数组DI1,用于存储光照值;
在GPU计算设备的存储器中创建一个包含M行、N列元素的二维数组DI2,用于存储光照值;在GPU计算设备的存储器中创建一个包含M行、N列元素的二维数组DI3,用于存储光照值;把数组DI1的每个元素都设置为0;把数组DI2的每个元素都设置为0;把数组DI3的每个元素都设置为0;
Step003:从视点发射穿过光线跟踪虚拟像素平面上的各个像素中心点的相机光线;相机光线和光线跟踪虚拟像素平面上的像素一一对应,和数组A002的元素一一对应,和数组DI1的元素一一对应,和数组DI2的元素一一对应,和数组DI3的元素一一对应;对每条相机光线A003,做如下操作:Step003-1:利用现有的光线求交测试方法根据空间加速结构A001快速判断光线A003是否与三维场景中的几何对象相交,如果相交则转步骤Step003-2,否则转步骤Step003-9;
Step003-2:计算光线A003与三维场景中的几何对象之间的离视点最近的交点A004;判断以交点A004和点光源所在位置为端点确定的线段除两个端点外是否与三维场景中的几何对象相交,如果相交,则把光线A003对应的数组A002的元素对应的存储空间的最低位设置为0;
Step003-3:在不考虑遮挡的情况下,计算点光源发出的光照在交点A004处沿光线A003的反向方向反射的光照值I1,把光照值I1赋值给光线A003对应的数组DI1的元素;
Step003-4:如果交点A004所在的几何对象表面为镜面反射表面,则根据镜面反射定理,创建镜面反射光线A005,光线A005的起点是交点A004,否则转步骤Step003-10;
Step003-5:利用现有的光线求交测试方法根据空间加速结构A001快速判断光线A005是否与三维场景中的几何对象相交,如果相交则转步骤Step003-6,否则转步骤Step003-
10;
Step003-6:计算光线A005与三维场景中的几何对象之间的离交点A004最近的交点A006;判断以交点A006和点光源所在位置为端点确定的线段除两个端点外是否与三维场景中的几何对象相交,如果相交,则把光线A003对应的数组A002的元素对应的存储空间的次低位设置为0;
Step003-7:在不考虑遮挡的情况下,计算点光源发出的光照在交点A006处沿光线A005的反向方向反射的光照值I2,把光照值I2赋值给光线A003对应的数组DI2的元素;
Step003-8:如果交点A006所在的几何对象表面不是镜面反射表面,则转步骤Step003-
10,否则,根据镜面反射定理,创建镜面反射光线A007,光线A007的起点是交点A006,按照标准的光线跟踪技术进一步递归跟踪光线A007,得到光线A007及其递归衍生光线对应的间接光照值IDIL,把光照值IDIL赋值给光线A003对应的数组DI3的元素,转步骤Step003-10;
Step003-9:把光线A003对应的数组DI1的元素赋值为背景光照值;
Step003-10:针对光线A003的操作结束;
Step004:把数组A002的每个元素的存储空间的最低位的值看作是一幅包含M行、N列像素的灰度图像A008的对应像素的灰度值;把数组A002的每个元素的存储空间的次低位的值看作是一幅包含M行、N列像素的灰度图像A009的对应像素的灰度值;用基于求空间邻域平均的图像平滑滤波方法对灰度图像A008进行滤波,并把结果保存在二维数组A010中;用基于求空间邻域平均的图像平滑滤波方法对灰度图像A009进行滤波,并把结果保存在二维数组A011中;
Step005:在GPU计算设备的存储器中创建一个包含M行、N列元素的二维数组IMAG;对于任意的整数i和j,1≤i≤M,1≤j≤N,做如下操作:Step005-1:把数组A010的第i行、第j列元素的值与数组DI1的第i行、第j列元素的值相乘,并将结果赋值给变量D1;
Step005-2:把数组A011的第i行、第j列元素的值与数组DI2的第i行、第j列元素的值相乘,并将结果赋值给变量D2;
Step005-3:计算数组DI3的第i行、第j列元素的值、变量D1的值和变量D2的值之和,把结果赋值给数组IMAG的第i行、第j列的元素;
Step006:把数组IMAG中的光照数据转换成三维场景画面图像数据输出到磁盘上的图像文件中。