1.利用虚拟点光源实现动画三维场景的全局光照绘制的方法,其特征在于,所需的数据结构以及实现步骤如下:
本方法的目的在于提供一种利用虚拟点光源实现动画三维场景的全局光照绘制的方法;本方法的技术解决方案:将动画三维场景中的几何对象分为静态几何对象和动态几何对象,所有静态几何对象用一个场景图SSG来组织和管理,所有动态几何对象用一个场景图DSG来组织和管理;对光源的光照发射空间进行光线采样,即从光源位置向光源的光照发射空间中投射一系列光线,分别计算这些光线与场景图SSG和场景图DSG中的几何对象的交点;在这些交点处创建虚拟点光源来照射三维场景,通过计算这些虚拟点光源对三维场景点的直接光照贡献来近似绘制主光源产生的间接光照;建立以光源位置为原点的局部坐标系COR,局部坐标系COR的z轴正方向取为光源的主光照出射方向,局部坐标系COR的x轴和y轴任意选取,只需保证局部坐标系COR的x轴、y轴、z轴两两正交即可;为了简化对从光源投射的光线的方向的描述,使用方位角和仰角来描述光线的方向;
本方法首先提供一种数据结构DS,用于存储与虚拟点光源相关的数据;数据结构DS包括虚拟点光源的位置、虚拟点光源所在位置的法向量、虚拟点光源的发光强度、虚拟点光源的主光照出射方向、虚拟点光源类型、虚拟点光源所在几何对象表面的双向反射分布函数BRDF、与虚拟点光源相关联的光线的方位角、与虚拟点光源相关联的光线的仰角共八个成员变量;
本方法的第一部分在计算机系统中计算三维场景中的光源A001的光照发射空间的采样光线与场景图SSG中的几何对象的交点,并在交点位置处创建虚拟点光源,具体步骤如下:Step101:令列表A002为空;令列表LVPLS为空;
Step102:从光源A001所在位置向光源A001的光照发射空间投射一系列光线,并将这些光线存放在列表A002中;
Step103:对列表A002中的每条光线A003,利用GPU并行计算设备并行地执行子步骤Step103-1至Step103-3:Step103-1:测试光线A003是否与场景图SSG中的几何对象相交,如果不相交,则转子步骤Step103-3;
Step103-2:计算光线A003与场景图SSG中的几何对象之间的距光源A001最近的交点A004,创建一个数据结构DS类型的变量A005;将交点A004所在的位置赋值给变量A005的虚拟点光源的位置成员变量,将交点A004所在的位置的法向量赋值给变量A005的虚拟点光源所在位置的法向量成员变量,将交点A004所在几何对象的表面的双向反射分布函数BRDF赋值给变量A005的虚拟点光源所在几何对象表面的双向反射分布函数BRDF成员变量;如果交点A004所在几何对象的表面为漫反射面,则将变量A005的虚拟点光源类型成员变量赋值为“半球全向光源类型”,否则将变量A005的虚拟点光源类型成员变量赋值为“聚光灯类型”;将光线A003在局部坐标系COR中的方位角和仰角分别赋值给变量A005的与虚拟点光源相关联的光线的方位角和与虚拟点光源相关联的光线的仰角成员变量;根据光源A001的发光强度和位置、交点A004的位置、交点A004所在的位置的法向量、交点A004所在几何对象的表面的双向反射分布函数BRDF计算变量A005的虚拟点光源的发光强度成员变量的值;如果变量A005的虚拟点光源类型成员变量为“半球全向光源类型”,则将变量A005的虚拟点光源的主光照出射方向成员变量赋值为交点A004所在的位置的法向量,否则将变量A005的虚拟点光源的主光照出射方向成员变量赋值为光线A003在交点A004处发生理想镜面反射时的反射光线方向;将变量A005加入列表LVPLS中;
Step103-3:针对光线A003的计算结束;
本方法的第二部分逐帧地完成动画三维场景的全局光照绘制,具体步骤如下:
Step201:令帧编号变量ID为1;
Step202:令列表LVPLD为空;
Step203:对本方法的第一部分中得到的列表A002中的每条光线A003,利用GPU并行计算设备并行地执行子步骤Step203-1至Step203-3:Step203-1:测试光线A003是否与场景图DSG中的几何对象相交,如果不相交,则转子步骤Step203-3;
Step203-2:计算光线A003与场景图DSG中的几何对象之间的距光源A001最近的交点B004,创建一个数据结构DS类型的变量B005;将交点B004所在的位置赋值给变量B005的虚拟点光源的位置成员变量,将交点B004所在的位置的法向量赋值给变量B005的虚拟点光源所在位置的法向量成员变量,将交点B004所在几何对象的表面的双向反射分布函数BRDF赋值给变量B005的虚拟点光源所在几何对象表面的双向反射分布函数BRDF成员变量;如果交点B004所在几何对象的表面为漫反射面,则将变量B005的虚拟点光源类型成员变量赋值为“半球全向光源类型”,否则将变量B005的虚拟点光源类型成员变量赋值为“聚光灯类型”;将光线A003在局部坐标系COR中的方位角和仰角分别赋值给变量B005的与虚拟点光源相关联的光线的方位角和与虚拟点光源相关联的光线的仰角成员变量;根据光源A001的发光强度和位置、交点B004的位置、交点B004所在的位置的法向量、交点B004所在几何对象的表面的双向反射分布函数BRDF计算变量B005的虚拟点光源的发光强度成员变量的值;如果变量B005的虚拟点光源类型成员变量为“半球全向光源类型”,则将变量B005的虚拟点光源的主光照出射方向成员变量赋值为交点B004所在的位置的法向量,否则将变量B005的虚拟点光源的主光照出射方向成员变量赋值为光线A003在交点B004处发生理想镜面反射时的反射光线方向;将变量B005加入列表LVPLD中;
Step203-3:针对光线A003的计算结束;
Step204:令列表LVPLU为空;
Step205:对本方法的第一部分中得到的列表LVPLS中的每个数据结构DS类型的变量B006,利用GPU并行计算设备并行地执行子步骤Step205-1至Step205-4:Step205-1:判断列表LVPLD中是否存在一个数据结构DS类型的变量B007,变量B007的与虚拟点光源相关联的光线的方位角和与虚拟点光源相关联的光线的仰角成员变量分别等于变量B006的与虚拟点光源相关联的光线的方位角和与虚拟点光源相关联的光线的仰角成员变量;如果不存在,则转子步骤Step205-3;
Step205-2:根据变量B006的虚拟点光源的位置成员变量和光源A001的位置,计算变量B006对应的虚拟点光源与光源A001之间的距离D1;根据变量B007的虚拟点光源的位置成员变量和光源A001的位置,计算变量B007对应的虚拟点光源与光源A001之间的距离D2;如果D1≥D2,将变量B007加入列表LVPLU中,否则将变量B006加入列表LVPLU中;删除列表LVPLD中的变量B007;转子步骤Step205-4;
Step205-3:将变量B006加到列表LVPLU中;
Step205-4:针对数据结构DS类型的变量B006的计算结束;
Step206:将列表LVPLD中剩余的变量加到列表LVPLU中;
Step207:在GPU并行计算设备上,用光线投射算法计算动画三维场景的第ID帧画面的直接光照结果,并将其保存在变量V1中;
Step208:对列表LVPLU中的每个数据结构DS类型的变量C001,在GPU并行计算设备上并行地执行子步骤Step208-1至Step208-4:Step208-1:如果变量C001的虚拟点光源类型成员变量为“半球全向光源类型”,转子步骤Step208-3;
Step208-2:用变量C001对应的虚拟点光源照射第ID帧对应的动画三维场景,变量C001对应的虚拟点光源表示的聚光灯的角衰系数取值为C001对应的虚拟点光源所在位置的几何对象表面的高光系数,变量C001对应的虚拟点光源表示的聚光灯的主光照出射方向与聚光灯的光锥的母线之间的夹角取值为90度;用光线投射算法计算变量C001对应的虚拟点光源对第ID帧对应的动画三维场景产生的直接光照结果,并将其累加到变量V1中;
转子步骤Step208-4;
Step208-3:用变量C001对应的虚拟点光源照射第ID帧对应的动画三维场景;用光线投射算法计算变量C001对应的虚拟点光源对第ID帧对应的动画三维场景产生的直接光照结果,并将其累加到变量V1中;
Step208-4:针对数据结构DS类型的变量C001的计算结束;
Step209:将变量V1中的光照数据转换为第ID帧的画面图像数据输出到文件中;
Step210:将场景图DSG中的几何对象变换到第ID+1帧的状态;将变量ID的值加1,转步骤Step202。