发明内容
技术问题
有鉴于此,本发明要解决的技术问题是,如何对包含若干个物体的大规模的场景进行全局光照绘制。
解决方案
为了解决上述技术问题,根据本发明的一实施例,第一方面,提供了一种多光源下的全局光照绘制方法,用于对包含若干个物体的场景进行全局光照绘制,所述物体由几何面片来描述,所述方法由具有内存并耦接至外存的系统来执行,所述方法包括:
对所述场景中的几何面片和虚拟点光源分别基于位置信息进行处理,得到第一数量的几何块以及第二数量的光源块;
以所述场景中的所有采样点为行坐标,以所有虚拟点光源为列坐标建立光传递矩阵;
将所述光传递矩阵划分为所述第二数量的列,每一列对应一个所述光源块,将所述光传递矩阵划分为第三数量的行,每一行与每一列相交构成为一个子矩阵,所述第三数量为所述采样点的聚类数量;
将所述子矩阵和几何块从所述外存调入到所述内存中,根据所述虚拟点光源的材质属性、衰减属性、可见性以及光强度,计算对应子矩阵中的虚拟点光源对采样点的亮度贡献值;
将可见性为可见的所述虚拟点光源对采样点的亮度贡献值累加到对应的采样点上,并输出所述采样点的总亮度。
结合第一方面,在第一种可能的实现方式中,所述对所述场景中的几何面片和虚拟点光源分别基于位置信息进行处理,得到第一数量的几何块以及第二数量的光源块,包括:
分别计算所述几何面片的重心和所述虚拟点光源的重心在x轴、y轴和z轴上的位置码,所述几何面片的重心构成所述几何面片的位置信息,所述虚拟点光源的重心构成所述虚拟点光源的位置信息;
根据所述几何面片重心的位置码计算第一莫顿码,根据所述虚拟点光源重心的位置码计算第二莫顿码;
根据所述第一莫顿码对所述几何面片进行排序和划分,得到第一顺序和第一数量的几何块,根据所述第二莫顿码对所述虚拟点光源进行排序和划分,得到第二顺序和第二数量的光源块。
结合第一方面,在第二种可能的实现方式中,所述将所述光传递矩阵划分为所述第二数量的列,每一列对应一个所述光源块,将所述光传递矩阵划分为第三数量的行,每一行与每一列相交构成为一个子矩阵之后,还包括:
将所述子矩阵中的所有所述虚拟点光源和采样点的连线包含在第一空间包围盒中,每一个子矩阵对应一个第一空间包围盒,
其中,所述第一空间包围盒包括两个球体及连接所述两个球体的侧面,一个球体为包含所述子矩阵中所有采样点的最小球体,另一个球体为包含所述子矩阵中所有虚拟点光源的最小球体,通过在所述两个球体上分别截取过球心并与所述两个球体的球心连线垂直的切面,将所得到的两个切面与所述两个球体相交的边分别连接构成所述侧面。
结合第一方面的第二种可能的实现方式,在第三种可能的实现方式中,所述将所述光传递矩阵划分为所述第二数量的列,每一列对应一个所述光源块,将所述光传递矩阵划分为第三数量的行,每一行与每一列相交构成为一个子矩阵之后,还包括:
将所述几何块的所有几何面片包含在第二空间包围盒中,每一个几何块对应一个第二空间包围盒,
其中,所述第二空间包围盒由包含所述几何块中所有几何面片的最小轴对齐长方体构成。
结合第一方面的第三种可能的实现方式,在第四种可能的实现方式中,所述将所述子矩阵和几何块从所述外存调入到所述内存中之前,还包括:
判断所述第一空间包围盒的中轴到所述第二空间包围盒的最短距离是否不大于所述第一空间包围盒中较大球体的半径,是则判断为对应的子矩阵和几何块需要进行可见性测试,否则判断为对应的子矩阵和几何块不需要进行可见性测试,并将所述子矩阵中的虚拟点光源标记为对采样点可见。
结合第一方面的第四种可能的实现方式,在第五种可能的实现方式中,所述将所述子矩阵和几何块从所述外存调入到所述内存中,根据所述虚拟点光源的材质属性、衰减属性、可见性以及光强度,计算对应子矩阵中的虚拟点光源对采样点的亮度贡献值,包括:
将判断为需要进行可见性测试的子矩阵及几何块从所述外存调入到所述内存中;
对调入的所述子矩阵和几何块进行可见性测试;
根据所述子矩阵中虚拟点光源的材质属性、衰减属性、可见性以及光强度,计算所述子矩阵中可见性为可见的虚拟点光源对采样点亮度贡献值,所述可见性为可见的虚拟点光源包括所述可见性测试的结果为可见的虚拟点光源以及所述标记为可见的虚拟点光源。
结合第一方面的第五种可能的实现方式,在第六种可能的实现方式中,所述对调入的所述子矩阵和几何块进行可见性测试,包括:
对于所述子矩阵中的每条虚拟点光源和采样点的连线,分别与所述几何块中的几何面片进行求交运算,如果运算结果为相交,则判断为所述虚拟点光源对采样点不可见;如果运算结果为不相交,则判断为所述虚拟点光源对采样点可见。
结合第一方面的第五种可能的实现方式,在第七种可能的实现方式中,所述将所述子矩阵和几何块从所述外存调入到所述内存中,包括:
根据所述几何块的所述第一顺序,将判断为需要进行可见性测试的子矩阵对应的几何块从所述外存调入到所述内存中。
结合第一方面的第五种可能的实现方式,在第八种可能的实现方式中,所述将所述子矩阵和几何块从所述外存调入到所述内存中,包括:
将所有子矩阵分别与对应的需要进行可见性测试的几何块组合为节点,以由一个节点到另一个节点需要进行的数据读写量作为连接所述两个节点的边的权值,将所有节点连接构成一张图,计算能够遍历所述图中所有节点,并且所述遍历所通过的边的总权值最小的路径,选择所述路径,并根据所述路径上各节点的遍历顺序将对应的子矩阵及几何块从所述外存调入到所述内存中。
为了解决上述技术问题,根据本发明的另一实施例,第二方面,提供了一种多光源下的全局光照绘制装置,用于对包含若干个物体的场景进行全局光照绘制,所述物体由几何面片来描述,所述方法由具有内存并耦接至外存的系统来执行,所述装置包括:
块处理模块,用于对所述场景中的几何面片和虚拟点光源分别基于位置信息进行处理,得到第一数量的几何块以及第二数量的光源块;
光传递矩阵建立模块,用于以所述场景中的所有采样点为行坐标,以所有虚拟点光源为列坐标建立光传递矩阵;
子矩阵划分模块,用于并将所述光传递矩阵划分为所述第二数量的列,每一列对应一个所述光源块,将所述光传递矩阵划分为第三数量的行,每一行与每一列相交构成为一个子矩阵,所述第三数量为所述采样点的聚类数量;
亮度贡献值计算模块,用于将所述子矩阵和几何块从所述外存调入到所述内存中,根据所述虚拟点光源的材质属性、衰减属性、可见性以及光强度,计算对应子矩阵中的虚拟点光源对采样点的亮度贡献值;
输出模块,将可见性为可见的所述虚拟点光源对采样点的亮度贡献值累加到对应的采样点上,并输出所述采样点的总亮度。
结合第二方面,在第一种可能的实现方式中,所述块处理模块被配置为:
分别计算所述几何面片的重心和所述虚拟点光源的重心在x轴、y轴和z轴上的位置码,所述几何面片的重心构成所述几何面片的位置信息,所述虚拟点光源的重心构成所述虚拟点光源的位置信息;
根据所述几何面片重心的位置码计算第一莫顿码,根据所述虚拟点光源重心的位置码计算第二莫顿码;
根据所述第一莫顿码对所述几何面片进行排序和划分,得到第一顺序和第一数量的几何块,根据所述第二莫顿码对所述虚拟点光源进行排序和划分,得到第二顺序和第二数量的光源块。
结合第二方面,在第二种可能的实现方式中,还包括:
空间包围盒建立模块,用于建立第一空间包围盒,将所述子矩阵中的所有所述虚拟点光源和采样点的连线包含在第一空间包围盒中,每一个子矩阵对应一个第一空间包围盒,
其中,所述第一空间包围盒包括两个球体及连接所述两个球体的侧面,一个球体为包含所述子矩阵中所有采样点的最小球体,另一个球体为包含所述子矩阵中所有虚拟点光源的最小球体,通过在所述两个球体上分别截取过球心并与所述两个球体的球心连线垂直的切面,将所得到的两个切面与所述两个球体相交的边分别连接构成所述侧面。
结合第二方面的第二种可能的实现方式,在第三种可能的实现方式中,所述空间包围盒建立模块还用于建立第二空间包围盒,将所述几何块的所有几何面片包含在第二空间包围盒中,每一个几何块对应一个第二空间包围盒,
其中,所述第二空间包围盒由包含所述几何块中所有几何面片的最小轴对齐长方体构成。
结合第二方面的第三种可能的实现方式,在第四种可能的实现方式中,还包括:
可见性测试判断模块,用于判断所述第一空间包围盒的中轴到所述第二空间包围盒的最短距离是否不大于所述第一空间包围盒中较大球体的半径,是则判断为对应的子矩阵和几何块需要进行可见性测试,否则判断为对应的子矩阵和几何块不需要进行可见性测试,并将所述子矩阵中的虚拟点光源标记为对采样点可见。
结合第二方面的第四种可能的实现方式,在第五种可能的实现方式中,所述亮度贡献值计算模块包括:
调入单元,用于将判断为需要进行可见性测试的子矩阵及几何块从所述外存调入到所述内存中;
测试单元,用于对调入的所述子矩阵和几何块进行可见性测试;
计算单元,用于根据所述子矩阵中虚拟点光源的材质属性、衰减属性、可见性以及光强度,计算所述子矩阵中可见性为可见的虚拟点光源对采样点亮度贡献值,所述可见性为可见的虚拟点光源包括所述可见性测试的结果为可见的虚拟点光源以及所述标记为可见的虚拟点光源。
结合第二方面的第五种可能的实现方式,在第六种可能的实现方式中,所述测试单元被配置为:
对于所述子矩阵中的每条虚拟点光源和采样点的连线,分别与所述几何块中的几何面片进行求交运算,如果运算结果为相交,则判断为所述虚拟点光源对采样点不可见;如果运算结果为不相交,则判断为所述虚拟点光源对采样点可见。
结合第二方面的第五种可能的实现方式,在第七种可能的实现方式中,所述调入单元被配置为:
根据所述几何块的所述第一顺序,将判断为需要进行可见性测试的子矩阵对应的几何块从所述外存调入到所述内存中。
结合第二方面的第五种可能的实现方式,在第八种可能的实现方式中,所述调入单元被配置为:
将所有子矩阵分别与对应的需要进行可见性测试的几何块组合为节点,以由一个节点到另一个节点需要进行的数据读写量作为连接所述两个节点的边的权值,将所有节点连接构成一张图,计算能够遍历所述图中所有节点,并且所述遍历所通过的边的总权值最小的路径,选择所述路径,并根据所述路径上各节点的遍历顺序将对应的子矩阵及几何块从所述外存调入到所述内存中。
为了解决上述技术问题,根据本发明的一实施例,第三方面,提供了一种全局光照绘制方法,包括:
对场景的几何面片和虚拟点光源分别基于莫顿码进行处理,得到第一数量的几何块以及第二数量的光源块;
以场景的采样点为行坐标,以所述虚拟点光源为列坐标建立光传递矩阵;
将所述光传递矩阵划分为所述第二数量的列,将所述光传递矩阵划分为第三数量的行,每一行与每一列相交构成为一个子矩阵,所述第三数量为所述采样点的聚类数量;
根据各虚拟点光源的材质属性、衰减属性、可见性以及光强度计算对应子矩阵中的光线的亮度贡献值;
将可见性为可见的光线的亮度贡献值累加到对应的子矩阵的采样点上,并输出所述采样点的总亮度贡献值。
结合第三方面,在第一种可能的实现方式中,所述对场景的几何面片和虚拟点光源分别基于莫顿码进行处理,得到第一数量的几何块以及第二数量的光源块,包括:
分别计算所述几何面片的重心和所述虚拟点光源的重心在x轴、y轴和z轴上的位置码;
根据所述几何面片重心的位置码计算第一莫顿码,根据所述虚拟点光源重心的位置码计算第二莫顿码;
根据所述第一莫顿码对所述几何面片进行划分和排序,得到第一数量的几何块,根据所述第二莫顿码对所述虚拟点光源进行划分和排序,得到第二数量的光源块。
结合第三方面的第一种可能的实现方式,在第二种可能的实现方式中,还包括:
将所述子矩阵中的所有所述光线包含在第一空间包围盒中,将所述几何块的所有几何面片包含在第二空间包围盒中,所述第一空间包围盒由两个球体以及连接所述两个球体的侧面构成,每一个子矩阵对应一个第一空间包围盒,每一个几何块对应一个第二空间包围盒;
若所述第一空间包围盒的中轴到所述第二空间包围盒的最短距离不大于构成所述第一空间包围盒的较大球体的半径,判断为对应的子矩阵和几何块需要进行可见性测试。
结合第三方面的第二种可能的实现方式,在第三种可能的实现方式中,所述第一空间包围盒的一个球体以所述子矩阵中所有采样点的空间中心为球心,以所述采样点到球心的最远距离为半径,
另一个球体以所述子矩阵中所有虚拟点光源的空间中心为球心,以所述虚拟点光源到球心的最远距离为半径,
通过在所述两个球体上分别截取过球心并与所述两个球体的球心连线垂直的切面,将所得到的两个切面与两个球体相交的边分别连接构成所述侧面。
结合第三方面的第二种或第三种可能的实现方式,在第四种可能的实现方式中,所述第二空间包围盒由所包围的所有几何面片的最小x轴、y轴、z轴坐标和最大x轴、y轴、z轴坐标包围构成。
结合第三方面的第四种可能的实现方式,在第五种可能的实现方式中,所述根据各虚拟点光源的材质属性、衰减属性、可见性以及光强度计算对应子矩阵中的光线的亮度贡献值,包括:
将判断为需要进行可见性测试的子矩阵及几何块以块为单位从外存调入到内存中;
对调入的所述子矩阵和几何块进行可见性测试;
根据所述子矩阵中虚拟点光源的材质属性、衰减属性、可见性以及光强度计算所述子矩阵中通过了可见性测试的光线的亮度贡献值。
结合第三方面的第五种可能的实现方式,在第六种可能的实现方式中,所述将判断为需要进行可见性测试的子矩阵及几何块以块为单位从外存调入到内存中,包括:
根据所述几何块的莫顿码序号,将标记为需要进行可见性测试的子矩阵对应的几何块调入。
结合第三方面的第六种可能的实现方式,在第七种可能的实现方式中,所述将判断为需要进行可见性测试的子矩阵及几何块以块为单位从外存调入到内存中,包括:
将所要计算的每个子矩阵分别与对应的各需要进行可见性测试的几何块组合为节点,以由第一节点到第二节点需要进行的数据读写量作为连结所述两个节点的边的权值,将所述光传递矩阵中所有的点连接构成一张图,计算能够遍历所述图中所有节点,并且通过的边的总权值最小的路径,根据所述路径上各节点的顺序将标记为需要进行可见性测试的子矩阵及几何块从外存调入到内存中。
结合第三方面的第五种可能的实现方式,在第八种可能的实现方式中,所述对调入的所述子矩阵和几何块进行可见性测试,包括:
对于所述子矩阵中的每条光线,分别与所述几何块中的几何面片进行求交运算,如果运算结果为相交,则判断为所述光线不可见;如果运算结果为不相交,则判断为所述光线可见。
为了解决上述技术问题,根据本发明的另一实施例,第四方面,提供了一种全局光照绘制装置,包括:
块处理模块,用于对场景的几何面片和虚拟点光源分别基于莫顿码进行处理,得到第一数量的几何块以及第二数量的光源块;
矩阵建立模块,用于以场景的采样点为行坐标,以所述虚拟点光源为列坐标建立光传递矩阵;
可见性测试判断模块,用于将所述光传递矩阵划分为所述第二数量的列,将所述光传递矩阵划分为第三数量的行,每一行与每一列相交构成为一个子矩阵,所述第三数量为所述采样点的聚类数量;
亮度贡献值计算模块,用于根据各虚拟点光源的材质属性、衰减属性、可见性以及光强度计算对应子矩阵中的光线的亮度贡献值;
图像输出模块,用于将可见性为可见的光线的亮度贡献值累加到对应的子矩阵的采样点上,并输出所述采样点的总亮度贡献值。
有益效果
本发明实施例提供的多光源下的全局光照绘制方法及装置,通过将几何面片划分为几何块,将虚拟点光源划分为光源块,从外存中以块为单位将几何面片和虚拟点光源读入到内存中进行处理,显著的提高了全局光照绘制速度和效率,适用于对大规模、高精度要求的外存场景进行绘制。
根据下面参考附图对示例性实施例的详细说明,本发明的其它特征及方面将变得清楚。
具体实施方式
以下将参考附图详细说明本发明的各种示例性实施例、特征和方面。附图中相同的附图标记表示功能相同或相似的元件。尽管在附图中示出了实施例的各种方面,但是除非特别指出,不必按比例绘制附图。
在这里专用的词“示例性”意为“用作例子、实施例或说明性”。这里作为“示例性”所说明的任何实施例不必解释为优于或好于其它实施例。
另外,为了更好的说明本发明,在下文的具体实施方式中给出了众多的具体细节。本领域技术人员应当理解,没有某些具体细节,本发明同样可以实施。在一些实例中,对于本领域技术人员熟知的方法、手段、元件和电路未作详细描述,以便于凸显本发明的主旨。
图1示出根据本发明一实施例的多光源下的全局光照绘制方法的流程图。如图1所示,该方法主要包括:
步骤10、对场景的几何面片和虚拟点光源分别基于莫顿码进行处理,得到第一数量的几何块以及第二数量的光源块;
步骤20、以场景的采样点为行坐标,以所述虚拟点光源为列坐标建立光传递矩阵;
步骤30、将所述光传递矩阵划分为所述第二数量的列,将所述光传递矩阵划分为第三数量的行,每一行与每一列相交构成为一个子矩阵,所述第三数量为所述采样点的聚类数量;
步骤40、根据各虚拟点光源的材质属性、衰减属性、可见性以及光强度计算对应子矩阵中的光线的亮度贡献值;
步骤50、将可见性为可见的光线的亮度贡献值累加到对应的子矩阵的采样点上,并输出所述采样点的总亮度。
图2示出根据本发明另一实施例的全局光照绘制方法的流程图。该全局光照绘制方法用于渲染包含有物体和阴影的场景,如图2所示,该方法主要包括:
步骤100、读入并处理几何信息。
该步骤具体包括:
步骤101、读入三角面片。
如图3所示,对于要绘制的场景,场景里面有很多个物体(Object),每个物体的表面都由面片来描述,面片的属性包括三轴坐标、法向或纹理等。面片可以由已知商业建模软件产生,如3dsMax,Maya等。本实施例中将无序的三角面片作为几何信息,将该三角面片作为输入,并假设其全部属性都已知,也可以采用其它面片例如四边形面片来描述。
步骤102、对三角面片进行排序。
具体地,采用Out-of-Core排序工具,例如ExSort库,对三角面片进行排序,该排序的过程包括:
步骤1021、计算各三角面片的重心在x轴、y轴和z轴上的位置码。
因为所绘制的场景为立体场景,每个三角面片都具有x轴、y轴和z轴坐标,三角面片的重心即三角形三条中线的交点。
以x轴为例,将读入的三角面片中重心的最大x轴坐标和最小x轴坐标之间的x轴称为L,把L平均分为210段,按顺序把每一段做上标记,共需要10个比特的标记长度,从而x轴坐标与所做的标记一一对应;根据空间点的x坐标就能够得到对应的标记,该标记即该空间点的x轴位置码。依照该方法可以计算出每个三角面片空间点的x轴位置码、y轴位置码和z轴位置码。
步骤1022、根据重心的x轴位置码、y轴位置码和z轴位置码计算得到完整的莫顿码。
本实施例采用错位组合的方法进行计算,具体而言,莫顿码第1位为x轴位置码第1位,莫顿码第2位为y轴位置码第1位,莫顿码第3位为z轴位置码第1位,莫顿码第4位为x轴位置码第2位,莫顿码第5位为y轴位置码第2位,莫顿码第6位为z轴位置码第2位,以此类推,直到取得30比特长度的莫顿码。
步骤1023、根据莫顿码对三角面片进行排序和划分。
因为空间位置相近的三角面片的三轴坐标也相近,因此具有相近的莫顿码,使用莫顿码可对三角面片进行排序,也就是把三角面片根据空间位置进行划分,每读取10万个面片就划分一个块,把具有相同的重心莫顿码的三角面片放入相同的块中。这样在后续步骤计算可见性时,与一个子矩阵有遮挡关系的面片都集中在少量的几何块中,可以有效减少几何块的读取次数,提高效率。而且,由于内存的处理速度远远大于外存的处理速度,因此将三角面片一块或几块地从外存读入到内存中进行处理,这种分块读入和处理的方式也可以提高处理速度和处理效率。
步骤103、将排序后的三角面片读入到Out-of-Core数据管理器中。
将上一步骤划分的几何块按照排序后的顺序在Out-of-Core数据管理器中注册为对应的几何块。
步骤200、读入并处理光源信息。
本步骤200与步骤100的执行顺序不限于此,也可以同时执行,或者先执行步骤200再执行步骤100。本实施例中的光源信息指虚拟点光源,假设一个三角面片上有一个虚拟点光源,虚拟点光源的属性有光强值,朝向(法向),三轴坐标,虚拟点光源的格式可以是任意能够读入的格式,包括自定义的文件格式。与几何信息类似,首先计算虚拟点光源的重心的位置码,然后根据位置码得出莫顿码。使用莫顿码对虚拟点光源进行排序后,将每10万个连续的虚拟点光源划分为一个块,并将划分的块在Out-of-Core数据管理器中注册为对应的光源块。
步骤300、建立光传递矩阵并将其划分为若干个子矩阵。
步骤301、以采样点作为行坐标,以虚拟点光源作为列坐标建立光传递矩阵。
其中,根据视点的位置、最后绘制出的图像的大小,通过射线求交的方法来选取采样点。具体地,如图4所示,视点由用户输入,代表的是用户的眼睛或拍摄装置在场景坐标系中的位置,双眼正上方的朝向以及眼睛的朝向。最终绘制得到的两维图像上的两维像素点是三维场景中三维采样点根据视点方向在与其垂直的成像平面(即用户看到的该两维图像)上的投影。
该光传递矩阵的第x行第y列的元素表示第y个虚拟点光源对第x行采样点的亮度贡献,光传递矩阵的一行为一个采样点所投影对应的像素点。
步骤302、将建立的光传递矩阵划分为若干个子矩阵。
步骤3021、根据步骤200得到的光源块的数量将光传递矩阵划分为相应数量的列。
例如,在步骤200中输入了43个光源块,则把光传递矩阵划分为43份列,每一份包含一个光源块的虚拟点光源,即每一列对应一个光源块。
步骤3022、根据采样点之间的相关性,采用聚类方法例如k-均值(means)方法、J-均值方法、CLARANS方法、BIRCH方法、DBSCAN方法、PGCS方法或CURE方法等对采样点进行的聚类。
本实施例以把采样点聚成165类为例进行说明,一类采样点称为一个采样点块,本实施例中每一类剩一定阈值的采样点时停止聚类。
步骤3023、根据聚类得到的数量将光传递矩阵划分为相应数量的行。
经过上述步骤的聚类之后,光传递矩阵被划分为165个行,43个列,从而光传递矩阵被划分为165*43=7095个子矩阵。
如图5所示,将光传递矩阵进行划分,将采样点聚类成采样点块Pi,图5中以P1-P4为例进行说明,将虚拟点光源划分为光源块Lj,图5中以L1-L4为例进行说明,每个采样点块和每个光源块组成一个子矩阵。
步骤400、判断子矩阵和几何块是否需要进行可见性测试;包括:
步骤401、对于每个子矩阵,将子矩阵中的所有光线包含在一个椎体空间包围盒中,对于每个几何块,将几何块的所有面片包含在一个轴对齐空间包围盒中。
其中,光线即一个采样点与一个虚拟点光源的连线。一个子矩阵对应一个椎体空间包围盒,一个几何块对应一个轴对齐空间包围盒。
如图6所示,本实施例中的椎体空间包围盒由两个球体以及连接两球体的侧面构成。一个球体为包含所述子矩阵中所有采样点的最小球体,另一个球体为包含所述子矩阵中所有虚拟点光源的最小球体。例如:其中一个球体以对应的子矩阵中所有采样点的空间中心C1为球心,以距球心最远的采样点到球心的距离R1为半径,包含该子矩阵中所有的采样点,即图6中较小球体中的5个点。例如:子矩阵中有两个采样点的坐标分别为(1,0,0)和(2,0,0),则这个球体以(1.5,0,0)为中心,以0.5为半径。另一个球体以该子矩阵中所有虚拟点光源的空间中心C2为球心,以距球心最远的虚拟点光源到球心的距离R2为半径,包含该子矩阵中所有的虚拟点光源,即图6中较大球体中的4个点。最后在两个球体上分别截取过球心并与两个球心连线垂直的切面,两切面与球体相交的边连结起来就构成了椎体空间包围盒的侧面。较大球体中的4个虚拟点光源与较小球体中的5个采样点连接构成20条光线。
如图7所示,本实施例中的轴对齐空间包围盒由包含所述几何块中所有几何面片的最小轴对齐长方体构成,例如由其所包围的所有面片的最小x轴、y轴、z轴坐标,即Q点坐标及最大x轴、y轴、z轴坐标,即P点坐标共6个量组成,表示被这6个量围住的空间。这6个量可以通过遍历对应几何块的所有面片并计算其在各轴向上的范围获得。
例如,有一个三角形的几何块,三个顶点的坐标分别为(1,0,0),(0,1,0)和(0,0,1),则用于包裹这个三角形的轴对齐空间包围盒就由点(0,0,0)和(1,1,1)构成,这两个点描述了轴对齐空间盒的斜对角,即三维空间中三角面片在每条轴上的最小坐标和最大坐标。
步骤402、确定子矩阵与几何块是否需要进行可见性测试。
本实施例中,通过测试一个椎体空间包围盒与一个轴对齐空间包围盒在空间上是否有重叠部分,即光线与三角面片有没有重叠的部分来进行判断。如果有重叠部分则确定该光线被几何块所遮挡,与该光线对应的子矩阵和几何块需要进行可见性测试。具体的计算步骤包括:
比较椎体空间包围盒的中轴到轴对齐空间包围盒的距离,如果这一距离不小于构成椎体空间包围盒的两个球体中的较大半径,则确定为不存在重叠,在计算椎体空间包围盒对应的子矩阵时不需要与轴对齐空间包围盒包裹的几何块进行可见性测试;反之,如果计算出的距离小于构成椎体空间包围盒的球体的半径,则该子矩阵和几何块组成的对就需要进行可见性测试。
上述该距离的计算为椎体空间包围盒与轴对齐空间包围盒之间的最短距离。其定义是要在轴对齐空间包围盒的表面上找到某一个点,使得这点到椎体空间包围盒的中轴线段的距离最小,这就是两个包围盒之间的最短距离。如图8所示,椎体空间包围盒的中轴即两个球心的连线,将该中轴投影到轴对齐空间包围盒距离该中轴最近的表面上,得到一条投影线,则中轴与投影线之间的距离为两个包围盒之间的最短距离。
例如,如图9所示,L1与L2是两个光源块,P1是一个采样点块,Q1、Q2和Q3是三个几何块。P1与L1组成的子矩阵与Q2和Q3需要进行可见性测试,P1与L2组成的子矩阵与Q1和Q2需要进行可见性测试。
步骤403、对确定为需要进行可见性测试的子矩阵和几何块进行标记。
在应用中,如果椎体空间包围盒和轴对齐空间包围盒在空间上没有重叠部分,则对应的子矩阵产生的光线一定不会与对应几何块中的任何面片相交,该子矩阵和几何面片块不需要进行可见性测试,即通过可见性测试;反之,两者需要进行可见性测试,本步骤中对需要进行可见性测试的子矩阵和几何块进行标记。
步骤500、把子矩阵及对应的几何块调入显存或内存中,然后对该子矩阵使用光割技术计算子矩阵中各元素的值,即虚拟点光源对像素点的亮度贡献值。
本发明为基于光割技术的全局光照绘制方法。如图10a所示,该场景中存在四个虚拟点光源分别标注为1,2,3,4,针对每个需要绘制的采样点,例如:像素对应的场景采样点,基于蛮力的绘制方法是分别计算这四个虚拟点光源对该采样点的贡献并求和。光割是一种利用大量虚拟点光源来绘制全局光照效果的技术,通过合并对采样点贡献较小的光源,来达到加速绘制的目的。使用光割技术,当一组虚拟点光源对某个采样点的亮度贡献值较低时,则使用这组虚拟点光源的共同父节点来代替所有子节点求亮度贡献值,这里亮度贡献值是指利用节点的位置、法向、材质系数和光照亮度来求取子树对采样点的亮度贡献值。在实施光割之前,需要对场景中的虚拟点光源构造出唯一的光树。具体方法可以是根据光源的强度,光的类型,朝向等属性构造二叉树。每个虚拟点光源作为叶子节点,中间代表节点可以根据光源的强度做随机选取。
图10a场景构建完光树之后,对于每个采样点,从光树的根节点作为光割的起始开始遍历,每次计算各个父节点代替各自的叶节点所产生的误差,如果误差大于设定的阈值(如,2%的误差阈值),则使用该节点的两个子节点代替该节点,否则保留该节点在光割中。当所有的节点都在误差要求之内时对应的光割作为最终选择的光割。在图10b中,三个光割图中的粗线分别代表了场景中三个不同采样点在光树中选取的光割。光割的相关内容可以参照Walter,B.,et al.,Lightcuts:a scalable approach to illumination.ACMTransactions on Graphics(TOG),2005.24(3):p.1098-1107,在此不再赘述。
在本实施例中,步骤500所采用的光割技术,指的是对每个采样点块和通过了可见性测试的光源块使用光割,每个光源块生成一棵光树,对采样点块中的每个采样点在这棵光树上进行光割计算。
步骤500具体包括:
步骤501、使用Out-of-Core数据管理器将可见性为可见的子矩阵及对应的几何块调入到显存或内存中。
可见性为可见包括可见性测试的结果为可见的虚拟点光源以及被标记为需要进行可见性测试的虚拟点光源。
本实施例中,在计算某个子矩阵的元素时,所有与该子矩阵在前述步骤中被判断为存在重叠部分(相交)的几何块,都需要被调入一次,调入几何块的顺序下面具体说明。
一种简单的方法是按照几何块的序号调入。步骤100中已经根据莫顿码对几何块进行了排序,如果计算出子矩阵1和几何块2、4、7、8相重叠,则在计算该子矩阵1时依次调入几何块2、4、7、8。
另一种方法通过优化调入子矩阵和几何块的顺序,来减少总的调入次数,即减少数据读写量(IO)操作代价。具体地,把有重叠关系的子矩阵和几何块组成的节点,把由一个节点到另一个节点的IO操作代价设为两点之间的边的权值,所有的节点和边构成图。通过求解遍历图中所有节点,但是经过的路径最短的一个路径,来最小化IO操作代价。
举例说明:如图11a、图11b所示,如果在计算某个子矩阵a的过程中需要对某个几何块B进行可见性测试,则把a和B作为一个子矩阵-几何块组合a-B,即节点a-B;如果计算a的过程中还需要对几何块C进行可见性测试,则把a-C也组成一个子矩阵-几何块组合a-C。以此类推,把所有符合上述关系的子矩阵和几何块都组合起来,每个子矩阵-几何块组合作为图的一个节点,则节点之间的边的权值为由一个节点移到另一个节点需要传输的数据大小。同理,如果存在另一个子矩阵d,计算子矩阵d的过程中需要对几何块B进行可见性测试,则构成的组合是d-B。
在实际的应用中,由于显存(或者内存)是大于单个子矩阵或者几何块的,所以会有一个缓冲区,可以同时在显存(或者内存)中存储多个子矩阵和几何块,本实施例为了方便说明,假设显存(或者内存)可以同时存储两个子矩阵和一个几何块。
如图11a所示,如果按照几何块序号的方法进行调入,那遍历图中节点的次序为a-B,a-C,d-B,进行的IO操作为:1、调入a,2、调入B,遍历a-B,3、调出B调入C,遍历a-C,4、调入d,5、调出C调入B,遍历d-B。共需要5次IO操作。
如图11b所示,如果按照遍历图的方法进行调入,则遍历图中节点的次序为a-B,d-B,a-C,进入的IO操作为:1、调入a,2、调入B,遍历a-B,3、调入d,遍历d-B,4、调出B调入C,遍历a-C,由于a-B到d-B的边的权值较小,因此本方法中优先从a-B转到d-B。这样就只需要4次IO操作,比前一种方法减少了一次。
实际应用中,由于外存可以容纳更多的子矩阵和几何块,图遍历的方法可以比按序号顺序调入的方法快10倍以上,极大的提高了效率。比如本文中图3的场景,使用1600x1200像素的图片分辨率,有3200万点光源和1.17亿的几何面片,共有18GB的几何和虚拟点光源数据,采用遍历图的方法来调入能够明显提高效率。
步骤502、基于光割技术对调入的子矩阵及对应的几何块进行可见性测试。
本步骤中调入被标记为需要进行可见性测试的几何块,每调入一块进行一次可见性测试,把确定为被遮挡的光线标记为不可见。
可见性测试包括若干种计算方法,本实施例中所采用的算法为:假设椎体空间包围盒中包裹了x条光线,轴对齐空间包围盒包裹了y个三角面片。对于每条光线,分别与y个三角面片进行求交运算,即检测该光线与各三角面片是否相交,如果相交,则判断为该光线不可见,该光线一端的虚拟点光源对该光线另一端的采样点的贡献为0;如果不相交,则判断为该光线可见,即通过了可见性测试。
步骤503、计算上一步骤中确定为可见的光线对应的虚拟点光源对采样点的亮度贡献值。
具体地,可以根据虚拟点光源在某一位置的材质属性、衰减属性、可见性以及光强度来计算亮度贡献值。例如,根据式(1)计算亮度贡献值:
其中,使用光割技术在虚拟点光源构成的光树中选取一个割作为输入,来选定割中的所有中间节点,c表示这个割中的其中一个中间节点,中间节点c下包含的所有虚拟点光源对当前计算的采样点产生的亮度总贡献值。输入的参数x表示虚拟点光源的位置,ω表示虚拟点光源与采样点连线的方向,i表示c中包含的所有虚拟点光源,j表示以能量为概率密度随机选出的一个代表虚拟点光源。Mi(x,ω)表示材质项,表示第i个虚拟点光源在位置x对方向ω产生的能量,Gi(x)是几何项,表示能量由第i个虚拟点光源到达采样点所经过的衰减,Vi(x)为可见项,表示位置点x是否被采样点看见(即二者之间没有几何遮挡),若为0则表示不可见,若为1则表示可见,Ii表示虚拟点光源本身的光强度,表示真实值,表示求取光割后的逼近值,意即光选取出一个光割后,割中的每一个中间节点下的所有虚拟点光源可以使用一个代表点光源来计算。使用所有虚拟点光源求和算总亮度贡献值,使用一个随机选择的代表光源点j来逼近节点包含的所有虚拟点光源的总贡献。
步骤600、计算每一个子矩阵的最终亮度。
具体而言,将通过了可见性测试的光线的亮度累加到每个采样点,即像素点上,将所有像素点的缓存的输出得到最终的图像。
如图12所示,场景的一个采样点的最终亮度由几千个光线的能量累加得到,由于每一个采样点可能为多个光线的端点,因此本步骤中把通过可见性测试的光线的能量根据采样点的空间位置累加到对应的图像的像素点缓存上,这一过程就称为积分。完成所有子矩阵的计算及积分后,把像素点缓存输出,就得到了最终的图像。
如图13所示,为本发明一个实施例的多光源下的全局光照绘制装置的结构示意图,该装置包括:块处理模块10、矩阵建立模块20、可见性测试判断模块30、亮度贡献值计算模块40以及图像输出模块50。
其中,块处理模块10用于读入几何信息和光源信息,并对读入的信息进行处理。具体而言,块处理模块10包括:读入单元11、划分单元12以及输出单元13。
读入单元11用于读入三角面片以及虚拟点光源的信息。划分单元12用于计算三角面片的重心在x轴、y轴和z轴上的位置码,根据三角面片重心的x轴位置码、y轴位置码和z轴位置码计算得到完整的莫顿码,根据莫顿码对三角面片进行排序和划分,得到第一数量的;还用于计算虚拟点光源的重心在x轴、y轴和z轴上的位置码,根据虚拟点光源重心的x轴位置码、y轴位置码和z轴位置码计算得到完整的莫顿码,根据莫顿码对三角面片进行排序和划分。输出单元13用于将排序后的几何块和光源块输出到Out-of-Core数据管理器中。
矩阵建立模块20用于建立光矩阵并将其划分为若干个子矩阵。该矩阵建立模块20具体包括:光传递矩阵建立单元21、聚类单元22以及子矩阵划分单元23。
其中光传递矩阵建立单元21,即权利要求中的光传递矩阵建立模块用于以采样点作为行坐标,以虚拟点光源作为列坐标建立光传递矩阵。聚类单元22用于根据采样点之间的相关性,采用聚类方法例如k-均值(means)方法、J-均值方法、CLARANS方法、BIRCH方法、DBSCAN方法、PGCS方法或CURE方法等对采样点进行的聚类,得到聚类数量。子矩阵划分单元23,即权利要求中的子矩阵划分模块用于根据划分单元划分得到的光源块的数量将光传递矩阵划分为相应数量的列,根据聚类单元得到的采样点的聚类数量将光传递矩阵划分为相应数量的行。
可见性测试判断模块30用于判断子矩阵和几何块是否需要进行可见性测试。该可见性测试判断模块30具体包括:空间包围盒建立单元31、判断单元32以及标记单元33。
其中,空间包围盒建立单元31,即权利要求中的空间包围盒建立模块,用于为每个子矩阵建立能包含该子矩阵中所有光线的椎体空间包围盒,以及为每个几何块建立能包含该几何块中所有面片的轴对齐空间包围盒。判断单元32用于通过测试一个椎体空间包围盒与一个轴对齐空间包围盒在空间上是否有重叠部分,来确定子矩阵与几何块是否需要进行可见性测试。标记单元33用于对判断单元32确定为需要进行可见性测试的子矩阵和几何块进行标记。
亮度贡献值计算模块40用于把子矩阵及对应的几何块调入显存或内存中,然后对该子矩阵使用光割技术计算虚拟点光源对像素点的亮度贡献值。该亮度贡献值计算模块40具体包括:调入单元41、测试单元42以及计算单元43。
其中,调入单元41用于通过Out-of-Core数据管理器将被标记单元33标记为需要进行可见性测试的子矩阵及对应的几何块调入到显存或内存中。测试单元42用于基于光割技术对调入的子矩阵及对应的几何块进行可见性测试。计算单元43用于计算被测试单元42确定为可见的光线对应的虚拟点光源对采样点的亮度贡献值。
图像输出模块50用于将通过了可见性测试的光线的亮度累加到每个采样点上,将所有采样点缓存的光能量输出得到最终图像。
各个部件的具体作用可以参照上述实施例中关于全局光照绘制方法的描述。
图14示出了本发明的另一实施例的一种网络设备的结构框图。所述网络设备1100可以是具备计算能力的主机服务器、个人计算机PC、或者可携带的便携式计算机或终端等。本发明具体实施例并不对计算节点的具体实现做限定。
所述网络设备1100包括处理器(processor)1110、通信接口(CommunicationsInterface)1120、存储器(memory)1130和总线1140。其中,处理器1110、通信接口1120、以及存储器1130通过总线1140完成相互间的通信。
通信接口1120用于与网络设备通信,其中网络设备包括例如虚拟机管理中心、共享存储等。
处理器1110用于执行程序。处理器1110可能是一个中央处理器CPU,或者是专用集成电路ASIC(Application Specific Integrated Circuit),或者是被配置成实施本发明实施例的一个或多个集成电路。
存储器1130用于存放文件。存储器1130可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。存储器1130也可以是存储器阵列。存储器1130还可能被分块,并且所述块可按一定的规则组合成虚拟卷。
在一种可能的实施方式中,上述程序可为包括计算机操作指令的程序代码。该程序具体可用于:
对场景的几何面片和虚拟点光源分别基于莫顿码进行处理,得到第一数量的几何块以及第二数量的光源块;
以场景的采样点为行坐标,以所述虚拟点光源为列坐标建立光传递矩阵;
将所述光传递矩阵划分为所述第二数量的列,将所述光传递矩阵划分为第三数量的行,每一行与每一列相交构成为一个子矩阵,所述第三数量为所述采样点的聚类数量;
根据各虚拟点光源的材质属性、衰减属性、可见性以及光强度计算对应子矩阵中的光线的亮度贡献值;
将可见性为可见的光线的亮度贡献值累加到对应的子矩阵的采样点上,并输出所述采样点的总亮度贡献值。
在一种可能的实现方式中,所述对场景的几何面片和虚拟点光源分别基于莫顿码进行处理,得到第一数量的几何块以及第二数量的光源块,包括:
分别计算所述几何面片的重心和所述虚拟点光源的重心在x轴、y轴和z轴上的位置码;
根据所述几何面片重心的位置码计算第一莫顿码,根据所述虚拟点光源重心的位置码计算第二莫顿码;
根据所述第一莫顿码对所述几何面片进行划分和排序,得到第一数量的几何块,根据所述第二莫顿码对所述虚拟点光源进行划分和排序,得到第二数量的光源块。
在一种可能的实现方式中,该程序还用于:
将所述子矩阵中的所有所述光线包含在第一空间包围盒中,将所述几何块的所有几何面片包含在第二空间包围盒中,所述第一空间包围盒由两个球体以及连接所述两个球体的侧面构成,每一个子矩阵对应一个第一空间包围盒,每一个几何块对应一个第二空间包围盒;
若所述第一空间包围盒的中轴到所述第二空间包围盒的最短距离不大于构成所述第一空间包围盒的较大球体的半径,判断为对应的子矩阵和几何块需要进行可见性测试。
在一种可能的实现方式中,所述第一空间包围盒的一个球体以所述子矩阵中所有采样点的空间中心为球心,以所述采样点到球心的最远距离为半径,
另一个球体以所述子矩阵中所有虚拟点光源的空间中心为球心,以所述虚拟点光源到球心的最远距离为半径,
通过在所述两个球体上分别截取过球心并与所述两个球体的球心连线垂直的切面,将所得到的两个切面与两个球体相交的边分别连接构成所述侧面。
在一种可能的实现方式中,所述第二空间包围盒由所包围的所有几何面片的最小x轴、y轴、z轴坐标和最大x轴、y轴、z轴坐标包围构成。
在一种可能的实现方式中,所述根据各虚拟点光源的材质属性、衰减属性、可见性以及光强度计算对应子矩阵中的光线的亮度贡献值,包括:
将判断为需要进行可见性测试的子矩阵及几何块以块为单位从外存调入到内存中;
对调入的所述子矩阵和几何块进行可见性测试;
根据所述子矩阵中虚拟点光源的材质属性、衰减属性、可见性以及光强度计算所述子矩阵中通过了可见性测试的光线的亮度贡献值。
在一种可能的实现方式中,所述将判断为需要进行可见性测试的子矩阵及几何块以块为单位从外存调入到内存中,包括:
根据所述几何块的莫顿码序号,将标记为需要进行可见性测试的子矩阵对应的几何块调入。
在一种可能的实现方式中,所述将判断为需要进行可见性测试的子矩阵及几何块以块为单位从外存调入到内存中,包括:
将所要计算的每个子矩阵分别与对应的各需要进行可见性测试的几何块组合为节点,以由第一节点到第二节点需要进行的数据读写量作为连结所述两个节点的边的权值,将所述光传递矩阵中所有的点连接构成一张图,计算能够遍历所述图中所有节点,并且通过的边的总权值最小的路径,根据所述路径上各节点的顺序将标记为需要进行可见性测试的子矩阵及几何块从外存调入到内存中。
在一种可能的实现方式中,所述对调入的所述子矩阵和几何块进行可见性测试,包括:
对于所述子矩阵中的每条光线,分别与所述几何块中的几何面片进行求交运算,如果运算结果为相交,则判断为所述光线不可见;如果运算结果为不相交,则判断为所述光线可见。
本领域普通技术人员可以意识到,本文所描述的实施例中的各示例性单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件形式来实现,取决于技术方案的特定应用和设计约束条件。专业技术人员可以针对特定的应用选择不同的方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
如果以计算机软件的形式来实现所述功能并作为独立的产品销售或使用时,则在一定程度上可认为本发明的技术方案的全部或部分(例如对现有技术做出贡献的部分)是以计算机软件产品的形式体现的。该计算机软件产品通常存储在计算机可读取的非易失性存储介质中,包括若干指令用以使得计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本发明各实施例方法的全部或部分步骤。而前述的存储介质包括U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。