1.复用场景点光源可见性的超采样光线跟踪方法,其特征在于,所需的数据结构及实现步骤如下:
提供一种数据结构ISPOINTLV,用于存储场景点的光源可见性,数据结构ISPOINTLV包含场景点位置POS、场景点所在位置的表面法向量VN、场景点的光源可见性LVis共三个成员变量;本方法的具体实现步骤如下:Step101:在计算机的存储器中创建一个网格空间数据结构Grid;在计算机的存储器中创建一个计数器Counter,令计数器Counter的值为0;在计算机的存储器中创建一个包含M行、N列元素的二维数组IM,M为虚拟相机的虚拟像素平面上的像素行数,N为虚拟相机的虚拟像素平面上的像素列数,把二维数组IM的每个元素都赋值为0;
Step102:针对虚拟相机的虚拟像素平面上的每个像素A001,做如下操作:
Step102-1:在像素A001覆盖的空间区域内按均匀分布随机选取一个点A002,从视点发射一条穿过点A002的光线A003,计算光线A003与三维场景的几何对象的离视点最近的交点A004;在计算机的存储器中创建一个数据结构ISPOINTLV类型的变量SPVis,把变量SPVis的场景点位置POS成员变量赋值为交点A004的位置,把变量SPVis的场景点所在位置的表面法向量VN成员变量赋值为交点A004所在位置的表面法向量;判断交点A004与光源之间是否直接可视,如果直接可视,则计算光源直接发出的光在交点A004处散射产生的沿光线A003的入射方向的反方向传输的直接光照亮度贡献值A005,同时令Idir等于直接光照亮度贡献值A005、令变量SPVis的场景点的光源可见性LVis成员变量等于1,否则令Idir等于0、令变量SPVis的场景点的光源可见性LVis成员变量等于0;以变量SPVis的场景点位置POS成员变量的值为关键字把变量SPVis插入到网格空间数据结构Grid中;
Step102-2:令Iind=0;按照递归光线跟踪思想,继续跟踪光线A003在交点A004处被散射后的传输路径A006,依次计算传输路径A006与三维场景的几何对象之间先后相交的各个交点A007;按先后顺序针对每个交点A007,做如下操作:Step102-2-1:如果计数器Counter的值为0,则转步骤Step102-2-2,否则转步骤Step102-2-3;
Step102-2-2:在计算机的存储器中创建一个数据结构ISPOINTLV类型的变量SPVis2,把变量SPVis2的场景点位置POS成员变量赋值为交点A007的位置,把变量SPVis2的场景点所在位置的表面法向量VN成员变量赋值为交点A007所在位置的表面法向量;判断交点A007与光源之间是否直接可视,如果直接可视,则把变量SPVis2的场景点的光源可见性LVis成员变量设置为1,同时计算光源直接发出的光在交点A007处散射产生的沿传输路径A006在交点A007处的光线入射方向的反方向传输的直接光照亮度贡献值A008,并令Iind等于Iind与直接光照亮度贡献值A008相加之和,否则把变量SPVis2的场景点的光源可见性LVis成员变量设置为0;以变量SPVis2的场景点位置POS成员变量的值为关键字把变量SPVis2插入到网格空间数据结构Grid中;转步骤Step102-2-4;
Step102-2-3:在计算机的存储器中创建一个列表LIST1,令列表LIST1为空;从网格空间数据结构Grid中找出那些满足条件COND1的数据结构ISPOINTLV类型的变量B001:条件COND1:变量B001的场景点位置POS成员变量表示的位置到交点A007的位置的空间距离小于δth,且变量B001的场景点所在位置的表面法向量VN成员变量表示的向量与交点A007所在位置的表面法向量之间的夹角小于αth;
把从网格空间数据结构Grid中找出的所有满足条件COND1的数据结构ISPOINTLV类型的变量B001添加到列表LIST1中;如果列表LIST1不为空,则转步骤Step102-2-3-1,否则转步骤Step102-2-3-3;
Step102-2-3-1:令W=0,index=1;令δd1等于列表LIST1的第1个元素存储的数据结构ISPOINTLV类型的变量的场景点位置POS成员变量表示的位置到交点A007的位置的空间距离,令αv1等于列表LIST1的第1个元素存储的数据结构ISPOINTLV类型的变量的场景点所在位置的表面法向量VN成员变量表示的向量与交点A007所在位置的表面法向量之间的夹角,令W=w1×δd1+w2×αv1,w1和w2是两个权值系数;针对列表LIST1中除第1个元素以外的其他每个元素B002,做如下操作:①令δd等于元素B002存储的数据结构ISPOINTLV类型的变量的场景点位置POS成员变量表示的位置到交点A007的位置的空间距离,令αv等于元素B002存储的数据结构ISPOINTLV类型的变量的场景点所在位置的表面法向量VN成员变量表示的向量与交点A007所在位置的表面法向量之间的夹角,如果w1×δd+w2×αv
②针对元素B002的操作结束;
Step102-2-3-2:如果列表LIST1的第index个元素存储的数据结构ISPOINTLV类型的变量的场景点的光源可见性LVis成员变量的值等于1,则计算光源直接发出的光在交点A007处散射产生的沿传输路径A006在交点A007处的光线入射方向的反方向传输的直接光照亮度贡献值A008,并令Iind等于Iind与直接光照亮度贡献值A008相加之和;转步骤Step102-2-
4;
Step102-2-3-3:转步骤Step102-2-2;
Step102-2-4:针对交点A007的操作结束;
Step102-3:计算像素A001在虚拟相机的虚拟像素平面上的行号row,计算像素A001在虚拟相机的虚拟像素平面上的列号col,令IM[row][col]=IM[row][col]+Idir+Iind,IM[row][col]表示二维数组IM的第row行、第col列元素;针对像素A001的操作结束;
Step103:使计数器Counter的值增加1,即执行Counter=Counter+1;如果计数器Counter的值小于Ncth,则转步骤Step102;
Step104:对于IR=1,2,…,M,IC=1,2,…,N,令IM[IR][IC]=IM[IR][IC]/Counter,IM[IR][IC]表示二维数组IM的第IR行、第IC列元素;把二维数组IM的各个元素中保存的光照亮度贡献值转换成三维场景画面像素颜色值并保存到磁盘图像文件中。