实时二级光线跟踪的并行渲染方法

文档序号:6600989阅读:117来源:国知局

专利名称::实时二级光线跟踪的并行渲染方法
技术领域
:本发明涉及图形实时渲染
技术领域
,尤其涉及一种基于多核架构的二级光线跟踪的并行渲染方法。
背景技术
:虚拟现实技术已经成为工业设计领域中越来越重要的手段。尤其是在一些大型的高端工程项目里,如汽车、飞机制造等行业,由于制造真实的物理模具花费很高,因此这些项目已经开始使用数字化技术进行设计工作。由于一些最佳的效果只能出现在实时的交互设计中,例如,在车灯设计中,一些高光效果只能出现在特定的视点位置或者光照条件下,因此实时性是工业设计的一个基本要求。为了实现实时性,当前的虚拟现实系统基本上采用的是光栅化(rasterization)的绘制技术。但是由于这种算法自身的局限性,很难向工业设计者们提供高真实感的画面,例如,光栅化绘制技术无法准确的绘制出光线的多重反射、折射、自反射(self-reflection)以及曲面反射(curvedreflection)等效果,这样就可能出现错误的设计,进而导致昂贵的制造费用,降低工业设计的效率。光线跟踪技术是一种在图形绘制领域广泛应用的技术。相比光栅化技术,光线跟踪技术有很多优势,包括物体可见性的自动计算,时间复杂度与场景中图元数量呈次线性关系,更适合并行架构处理等。但是,由于光线跟踪技术模拟的是真实世界中光的物理路径,因此它最大的优势是产生高质量的图像,绘制出高真实感的平滑的反射、折射、软影(softshadow)等全局光照效果。Whitted最早使用光线跟踪技术来模拟全局光照效果。由于光线跟踪技术需要花费很高的计算量,因此以往这种技术只能应用在非实时绘制领域中。当前,计算机硬件的计算能力呈指数形式的增长速度已经使交互式的实时光线跟踪成为可能。现代的高性能硬件并行架构主要有两个重要的特征多个核的并行计算,以及每个核内SIMD(singleinstructionmultidata)形式的操作方式。光线跟踪算法本身就是适合并行处理的算法,因此可以很好的利用高性能硬件的这些新的特性。一方面,NVIDIAG80/G92架构已经使得GPU的性能和可编程性大大提高,其编程平台CUDA(ComputeUnifiedDeviceArchitecture)使GPU本质上成为一个高度并行化的通用处理器。NVIDIAG80/G92架构内有多个核,每个核内有多个流处理器,这些流处理器以SIMD(准确地说,应该是SPMD形式,即singleprogrammultidata)形式同时执行多个线程。另一方面,现代CPU的设计也不再一味追求处理器时钟频率的提高,而是开始在一个芯片上集成更多的处理核心,同时每个核可以通过SIMD指令进行数据的并行处理,如Intel的SSE、IBM/Motorola的Altivec指令集,Intel最新的SSE4指令集已经使SIMD指令的处理宽度达到8,而Inter即将发布的Larrabee架构将采用更多的处理核,同时使SIMD处理宽度达到16。另一方面,将一个算法映射到SIMD数据处理模式下处理显然要比将算法分成多个线程分配到多个核处理复杂得多,而且这种复杂程度会随着SIMD的宽度的增加而增加。当前,多数算法主要是针对SIMD宽度为4而设计的,在一个处理核上顺序执行,因此算法设计相对容易。但是未来的硬件并行架构的发展趋势必将是整合更多的处理核,同时SIMD宽度越来越大,如何有效地使用硬件的这些新特性并将其应用到光线跟踪算法中,使硬件的计算能力得到最大程度上的有效利用,是光线跟踪领域迫切需要解决的问题。设计出一种高质量的快速的加速结构构造方法,使其可以充分利用多核处理器强大的并行处理能力,从而使加速结构建造速度进一步加快,满足实时性的要求,是一个光线跟踪算法能否有效执行的关键。层次结构的构造并不能很好的利用多个核的并行处理能力。其中存在的主要问题是,层次结构自上而下的递归构造方式通常会产生一个二叉树结构,在构造阶段初期只能生成少量结点,很难充分的利用硬件的并行计算能力,从而造成硬件的低效使用,而且访存的延迟也给构造造成了困难。传统的八叉树构造根据三个垂直坐标轴χ、y、ζ方向上对象的中间位置对场景进行划分,这种划分方式尽管简单快速,但其粗糙的质量造成了大量无效的遍历和相交操作,也造成了大量的空结点而浪费存储空间,使得八叉树逐渐被构建质量更高的kd树所取代。kd树通常使用SAH策略来确定最优的分割点,然而大量的计算使得kd树的构建需要一些时间,难以满足动态场景的实时光线跟踪计算要求。另一方面,当前的GPU架构包含多个多核处理器,需要同时运行上万个线程才能充分利用这些处理器的计算能力,而kd树等加速结构在其构建之初只有少量的结点供处理核使用,大大浪费了GPU的计算资源,进而影响构造速度
发明内容本发明提供一种实时二级光线跟踪的并行渲染方法,可有效利用硬件的并行计算能力,提高算法的渲染效率。一种实时二级光线跟踪的并行渲染方法,包括(1)通过构建八叉树,对模型空间中的场景数据进行划分;在需要进行渲染的模型空间的三个坐标轴上(相互垂直的X轴、Y轴和Z轴),分别选取若干个采样分割点,计算每个采样分割点的SAH(surfaceareaheuristic)花费(MacDonald等在文献“Heuristicsforraytracingusingspacesubdivision.VisualComputer,1990.”中提出的评估加速结构最优分割点的方法,如公式(a)所示),然后选取每个坐标轴上SAH花费最小的分割点,将选取的这三个分割点作为分割平面,对模型空间中的场景数据进行划分。将整个场景所形成的包围盒作为根节点,第一次划分可以得到八个子节点,然后以同样的方法再对子节点进行划分,按照宽度优先的方式递归这个构造过程,逐层进行划分,直至划分到每个节点所含面片数不多于10个。本发明采用的构造方式可以迅速产生出大量数据供成千上万的GPU线程使用,使它们一直保持满负荷工作状态;其次,由于我们在三个维度上同步进行基于SAH的选择划分,使得这个改良后的八叉树结构质量更高;另外,改良后的八叉树的深度更浅,大大减少了无效的遍历和相交操作,尤其适合大光线包的遍历。借助硬件强大的并行计算能力,本发明采用的八叉树加速结构凝结了传统加速结构的优点第一,相比BVH结构,我们在进行遍历操作时只是将光线与分割面相交,而不是与包围盒相交,减少了相交计算的次数;第二,由于使用的是SAH策略,确保了我们的遍历操作是一种有序的遍历,即在进行相交操作时,一旦产生交点,则认为此交点即为光线相交的第一个交点,遍历操作可立即停止。使用公式(a)来计算每个潜在的分割点,另外我们还需要知道每个子结点所含面片数及其表面积。Wald等通过使用排序来计算这些数量,为了避免昂贵的排序操作,我们使用bin方法(POPOVS.etal.:ExperienceswithStreamingConstructionofSAHKD-Trees.InProceedingsofthe2006IEEESymposiumonInteractiveRayTracing(Sept.2006),pp.89-94.1,3,4,6)以减少带宽的使用。随着构造层次的加深,处理核所要处理的数据明显减少,使计算SAH花费的时间更短,从而使建造速度更快。采样分割点的SAH花费Cp=Kt+A(N!)+nrSA(Nr)],(a)这里,H1和~分别代表与当前采样分割点相邻的左、右子节点所含的面片数量,SA(N1),SA(Nr)分别表示与当前采样分割点相邻的左、右子节点的表面积,SA(N)表示当前采样分割点的父节点的表面积(没有父节点时取0),KT表示对当前采样分割点的父节点进行遍历所产生的花费(没有父节点时取OhK1表示对当前采样分割点进行相交操作所产生的花费。Kt和K1的含义是计算机硬件处理遍历或相交操作耗费的时间,Kt和K1的绝对值可以人为设定,例如可以设定Kt=ICKK1=20;说明相交操作的花费大于遍历操作的花费,但10、20并不一定要求表示真实的处理时间,仅表示两者的相对关系。我们选取最优的分割点,使在这个点上所得到的SAH花费Cp最小,或者如果K1·η花销更小,这时η=ni+nr,η为当前节点所含面片数量。为了高效的利用硬件的并行计算能力,我们在实现时从两方面进一步扩大并行性一方面在自上而下的构造过程中,每个结点按规则分割成八个新的结点,由于这些分割工作可以独立进行而不依赖其它结点,因此我们完全可以将这些结点的分割工作分给多个核同时进行处理,以加快构造速度,同时可以通过分割任务的切换来隐藏访存的延迟。我们可以设置一个队列用来存放等待进行分割计算的结点,这样当一个处理核完成了一个结点的分割计算以后可以立刻从这个队列里获得新的工作,同时也将刚产生的欲分割结点放入队列。由于当前的GPU架构还不支持存储一致性,为了避免使用锁机制带来的同步开销,我们设置两个队列来记录这些位置,一个队列用来暂存父结点信息,另一个队列用来暂存子结点信息。我们利用父子结点的映射关系,即父结点k的子结点在子结点队列中的位置应该为8*k+t(t=0,l,...7),至于t的具体取值我们可以在线程块(block)内的速度更快的共享存储区(sharedmemory)里计算。在当前层次的子结点全部计算完毕后,我们使用压缩操作(compaction)将空结点去掉,形成新的父结点队列。另一方面在使用SAH策略对结点进行分割计算时,我们使用多线程方式将这一操作并行化。在进行SAH计算时,假设要在每个坐标轴上取ρ个采样分割点,那么为了计算花费最小的最优分割点,我们在三个维度上一共要进行3p次计算,由于这些计算只是用同样的操作对不同的数据进行处理,因此我们完全可以通过处理核的SIMD处理能力将这些操作并行处理。最后,当这些分割点计算都完成时,我们可以使用归约操作(reduction)找出具有最低花销的分割点。(2)光线跟踪过程的三个主要阶段,即加速结构的遍历(travel)、图元相交(intersection)、着色(shader)可以看成一个条件序列操作,只有通过了前一个阶段的测试的光线才能进入到下一个阶段继续进行计算。我们将条件序列应用到整个二级光线包,通过这些条件的测试,我们可以在光线跟踪的每个阶段移除那些没有通过测试的光线,然后使用硬件支持的紧凑操作(compact),将通过测试的光线移到一起,快速的产生能够进入下一个测试阶段的光线包,从而最大程度上保证光线包内光线的相似性,进而高效的进行多线程并行操作。在开始进行渲染时,首先判断所使用的光线包中有效光线的比例,当比例高于所设定的阈值时,进行步骤⑶的操作,否则进行步骤(5)的操作;所述的光线包中的有效光线是指具有相同执行行为的光线,所述的执行行为是指对同一节点数据进行遍历操作、相交操作或着色操作。(3)光线包基于步骤(1)建立的八叉树结构沿模型空间的三个坐标轴进行遍历;a)对光线包沿模型空间的X轴进行遍历将位于X轴分割平面同侧的所有子节点定义为X轴子节点,得到两个X轴子节点,例如将位于X轴分割平面一侧的所有子节点定义为X轴子节点A,X轴分割平面另一侧的所有子节点定义为X轴子节点B;所述的X轴分割平面垂直于模型空间的X轴,即构建八叉树时对X轴进行分割的那个平面。将光线包按照光线行进方向与依次与两个X轴子节点的包围盒做相交测试,当光线包与第一个X轴子节点的包围盒有相交光线时,将相交光线生成子光线包,否则将光线包继续与第二个X轴子节点的包围盒做相交测试,并将相交光线生成子光线包。因为光线包至少会与其中一个X轴子节点的包围盒有相交光线,所以必然会得到一个光线包,如果与第一个X轴子节点的包围盒有相交光线,那么对于第二个X轴子节点的包围盒就不再做相交测试了。b)对光线包沿模型空间的Y轴进行遍历在步骤a)的与光线包有相交光线的那个X轴子节点中,将位于Y轴分割平面同侧的所有子节点定义为Y轴子节点,得到两个Y轴子节点,例如将位于Y轴分割平面一侧的所有子节点定义为Y轴子节点A,Y轴分割平面另一侧的所有子节点定义为Y轴子节点B;所述的Y轴分割平面垂直于模型空间的Y轴,即构建八叉树时对Y轴进行分割的那个平面。将步骤a)的得到的子光线包按照光线行进方向与依次与两个Y轴子节点的包围盒做相交测试,当光线包与第一个Y轴子节点的包围盒有相交光线时,将相交光线生成子光线包,否则将光线包继续与第二个Y轴子节点的包围盒做相交测试,并将相交光线生成子光线包。因为光线包至少会与其中一个Y轴子节点的包围盒有相交光线,所以必然会得到一个光线包,如果与第一个Y轴子节点的包围盒有相交光线,那么对于第二个Y轴子节点的包围盒就不再做相交测试了。c)对光线包沿模型空间的Z轴进行遍历在步骤b)的与光线包有相交光线的那个Y轴子节点中,将位于Z轴分割平面同侧的所有子节点定义为Z轴子节点,得到两个Z轴子节点,例如将位于Z轴分割平面一侧的所有子节点定义为ζ轴子节点A,Z轴分割平面另一侧的所有子节点定义为Z轴子节点B;所述的Z轴分割平面垂直于模型空间的Z轴,即构建八叉树时对Z轴进行分割的那个平面。将步骤b)的得到的子光线包按照光线行进方向与依次与两个Z轴子节点的包围盒做相交测试,当光线包与第一个Z轴子节点的包围盒有相交光线时,将相交光线生成子光线包,否则将光线包继续与第二个Z轴子节点的包围盒做相交测试,并将相交光线生成子光线包,因为光线包至少会与其中一个Z轴子节点的包围盒有相交光线,所以必然会得到一个光线包,如果与第一个Z轴子节点的包围盒有相交光线,那么对于第二个Z轴子节点的包围盒就不再做相交测试了。至此,在步骤(1)中对模型空间第一次划分得到的八个子节点中,可以确定一个在步骤a)、步骤b)和步骤c)中均与光线包或子光线包有相交光线的一个子节点,针对该子节点重复步骤a)、步骤b)和步骤c)的操作,直至子光线包遇到叶子节点,若在子光线包遇到叶子节点前,子光线包中有效光线的比例低于或等于阈值时,则进行步骤(5)的操作,(4)将遇到叶子节点的子光线包与叶子节点内的面片依次(按面片在存储区域中的存储次序)做相交测试,得到与面片有相交关系的光线;可以采用布尔值来记录哪些光线通过了相交测试即与面片有相交,同时记录这些相交信息。(5)对光线包中的每条光线分别进行如下处理以宽度优先的方式按照节点层数由低至高(由根节点开始),将光线每次同时与N个节点的包围盒做相交测试,当遇到叶子节点时,将光线同时与N个叶子节点中的三角面片做相交测试,直到该叶子节点内所有三角面片都完成了相交测试,得到与光线起点最近且与光线相交的三角面片。N为SIMD宽度,即计算机硬件支持的并行计算单元的个数,即数据并行处理的最大宽度。(6)根据模型空间需要进行渲染的模型的材质类型,对经过步骤(4)中相交测试的光线赋予相应的着色代码,按照模型的材质类型进行渲染;对经过步骤(5)中相交测试的子光线包内的光线进行分类,分别赋予相应的着色代码,按照模型的材质类型依次进行渲染。即模型上材质相同的部分同时进行渲染,之后再进行其他材质部分的渲染,至于材质类型所对应的渲染次序并没有要求。尽管采用光线包技术明显的减少了计算量和带宽使用,但前提是能够进行高效的SIMD操作,如果光线包里只有一条有效光线,即只有一条光线通过了测试,那么采用光线包技术的操作时间将比不采用包技术的单条光线的操作时间还要长,因此步骤(2)中将光线跟踪的过程分成两个阶段以光线包里有效光线的数量在整个光线包里所占的比例为依据,当这个比例高于某个值(例如50%)时,采用光线包技术;当这个比例低于这个值时,我们使用了另一种高效的面片数据并行处理方式。本发明方法是自适应的,它不需要任何昂贵的预排序操作,也不需要使用评估光线包内光线相似性的策略,对初始光线的顺序也没有任何要求,只是在光线跟踪过程中根据每个阶段中的光线是否对加速结构和场景几何体执行同样的操作而自动的生成光线包。我们使初始的光线包中的光线数远大于硬件的SIMD宽度,从而保证尽可能每次操作都能找到足够多的光线,满足SIMD宽度的要求,保持SIMD操作的高效性。图1为随着八叉树遍历深度的增加,本发明方法与SIMD光线包方法对GPU有效利用率的对比。具体实施例方式选择一台配有一颗IntelXeon3.7GHz的4核CPU,一颗NvidiaGTX285(1G显存)的PC来实现我们的这个算法。使用Nvidia公司的CUDA编程框架,其为GPU计算提供了一个通用的C编程接口,方便编程者使用一些新的硬件特性。本发明为了在加速结构构造初期产生足够多的数据供多个处理核进行高效的并行处理,使用一种改进的八叉树构造方法,采用宽度优先的方式,在三个坐标轴上分别计算采样分割点的SAH花费,然后选取每个坐标轴上花费最小的分割点,将选取的这三个分割点作为分割平面,一次性生成了八个节点。在计算SAH花费时,需要计算分割平面两端的图元数量,本发明采用binning方法以减少带宽的使用。随着构造层次的加深,处理核所要处理的数据明显减少,使计算SAH花费的时间更短,从而使建造速度更快。为了高效的利用硬件的并行计算能力,本发明在实现时从两方面扩大了并行性1)在自上而下的构造过程中,节点按规则分割成八个新的节点,由于这些分割工作可以独立进行而不依赖其它节点,因此可以将这些节点的分割工作分给多个核同时进行处理,以加快构造速度,同时可以通过分割任务的切换来隐藏访存的延迟。我们设置一个队列用来存放等待进行分割计算的节点,这样当一个处理核完成了一个节点的分割计算以后可以立刻从这个队列里获得新的工作,同时也将刚产生的欲分割节点放入队列;2)在使用SAH策略对节点进行分割计算时,使用SIMD方式将这一操作并行化。在进行SAH计算时,假设要在每个坐标轴上产生k个准分割点,那么为了计算最优的分割点,我们一共要进行3k次计算,由于这些计算只是用同样的操作对不同的数据进行处理,因此我们完全可以通过处理核的SIMD处理能力将这些操作并行处理。最后,当这些分割点计算都完成时,使用硬件支持的归约操作(reduction)找出具有最低花销的分割点。光线跟踪过程的三个主要阶段,即加速结构的遍历(travel)、图元相交(intersection)、着色(shader)可以看成一个条件序列操作,只有通过了前一个阶段的测试的光线才能进入到下一个阶段继续进行计算。我们将条件序列应用到整个二级光线包,通过这些条件的测试,我们可以在光线跟踪的每个阶段移除那些没有通过测试的光线,然后使用硬件支持的紧凑操作(compact),将通过测试的光线移到一起,快速的产生能够进入下一个测试阶段的光线包,从而最大程度上保证光线包内光线的相似性,进而高效的进行多线程并行操作。尽管采用光线包技术明显的减少了计算量和带宽使用,但前提是能够进行高效的SIMD操作,如果光线包里只有一条有效光线,即只有一条光线通过了测试,那么采用光线包技术的操作时间将比不采用包技术的单条光线的操作时间还要长,因此我们将光线跟踪的过程分成两个阶段以光线包里有效光线的数量在整个光线包里所占的比例为依据,当这个比例高于某个值时,采用光线包技术;当这个比例低于这个值时,本发明使用另一种高效的数据并行处理方式。1)基于光线包的光线追踪技术为了节省存储空间,我们只记录光线的ID,当需要光线数据时,可以使用硬件支持的随机读操作(gather)进行随机的访存操作。①遍历为了使硬件始终保持高效率的计算,使初始的光线包中的光线数远大于硬件支持的SIMD宽度。将光线包与加速结构的节点包围盒做测试,所有通过测试的光线通过compact操作组成新的子光线包,继续进行遍历或者相交操作。②相交我们用光线包与图元相交测试后产生的布尔值来表明哪些光线通过了相交测试,同时将这些相交信息通过硬件支持的随机写操作(scatter)写回到用来存储光线信息的buffer中去。③着色将材质类型作为测试条件,产生的子光线包里的光线将会执行相同的着色代码(shader)。未通过本次测试的光线继续以其它材质类型为测试条件进行测试,直到所有的光线都执行了着色代码。2)节点/三角面片数据SIMD并行计算与基于光线包的光线追踪技术不同,我们只追踪单条光线,将这条光线与N(设N为SIMD宽度)个不同的节点包围盒或者三角面片相交。尽管这种方法要比光线包方法低效,但是我们认为对于相似度极低的二级光线来讲,它会获得不错的性能。①遍历将光线包里的光线分别进行遍历操作,采用层次遍历方式以减少访存延迟,每条光线每次同时与N个节点的包围盒做测试,直到本层的所有节点都完成了测试,返回的布尔值表明了测试是否成功,同时设置一个列表记录本层通过测试的所有节点。②相交当遇到叶子节点时,将光线同时与N个三角面片做相交测试,直到本节点内所有三角面片都完成了测试,并且记录通过测试的三角面片的相关信息,以便决定与光线起点最近的三角面片。选择具有不同几何复杂度的测试场景,Bunny,Toys,Conference作为测试模型文件,每个测试场景的分辨率为1024*1024。在实验中,为了充分获得光线包间光线的不相似性,我们强行使光线反射5次,由于BUrmy、T0yS场景并不封闭,可能有些光线反射还未达到5次就已经射离场景,从某种意义上说这也成为了光线的一种相似性,如表1所示,表1J^~1st2nd3rd4th5thSIMD光线包方法98%92%92%85%80%Bunny本发明的方法98%93%90%88%82%SIMD光线包方法95%80%65%52%41%Conference^本发明的方法96%91%80%74%65%在不同的光线反射次数下,本发明的方法与SIMD光线包方法对GPU硬件的利用率。GPU利用率可能在后几次反射中不降反升,正说明了这一问题。从图中我们可以对比出,本发明方法对简单的模型所获得的性能提升相对较小,原因是这些简单模型的面片都较大,因此光线包内光线的相似性较高,使得数据重组的必要性降低。使用表2来说明光线包大小对本发明方法的影响。针对Toys场景,分别列出了当对CUDA的线程块block内线程数设置为64、256、512时,光线包大小为16*16,32*32,64*64时,采用我们的自适应光线包生成方法所绘制出的帧率性能。由表2可见,<table>tableseeoriginaldocumentpage11</column></row><table>本发明方法当block线程数设置为256且光线包大小为64*64时,取得了最佳的性能。由于在CUDA架构下寄存器、共享存储区等资源都是有限的,线程块内线程数如果设置过大会导致线程无法得到足够资源而不能启动。另一方面,光线包内光线数如果设置过小,可能会由于找到足够的具有相似性的光线而使得新的光线包无法生成,进而导致GPU有效利用率降低;而光线包内光线数如果设置过大,在组织生成具有相似性的光线包时会产生过多的compaction、scatter、gather等GPU操作,而这些操作是比较耗时的,因此会降低算法的执行性能。为了进一步验证本发明方法对硬件的并行使用能力,我们记录了在八叉树的每一层进行遍历或者相交操作时标量处理器的利用率,其直接反映了我们自适应光线包生成方法和自适应光线跟踪过程能否最大限度地开发算法在硬件上的并行执行能力。注意,我们没有使用ALU的使用情况作为我们的测试标准,因为有些时候即便线程槽已被占用,但ALU也可能因为访存延迟或者SIMD的低利用率而未被完全使用。在八叉树遍历初期,本发明方法的优势并不明显,如图1所示,相比SIMD光线包方法,本发明方法通过使用自适应的光线包生成方法,提高了光线包内光线的相似性,进而在对八叉树进行遍历时,可以一直保证较高的GPU利用率。随着遍历深度的加深,光线包内可能没有足够多的相似性光线来组成新的光线包,这时我们所设计的自适应光线跟踪过程将采用另一种高效的数据并行处理方式,即只追踪单条光线,将这条光线与N(设N为SIMD宽度)个不同的结点包围盒或者三角面片相交。由图1可见,这使得我们的方法在八叉树的遍历后期,仍然对GPU计算单元保持着较高的有效利用率。权利要求一种实时二级光线跟踪的并行渲染方法,其特征在于,包括(1)通过构建八叉树,对需要进行渲染的模型空间的场景数据进行划分;(2)判断进行渲染时使用的光线包中有效光线的比例,当比例高于阈值时,进行步骤(3)的操作,否则进行步骤(5)的操作;(3)对光线包沿模型空间的三个坐标轴在(1)中已构建好的八叉树中进行遍历;a)对光线包沿模型空间的X轴进行遍历将位于X轴分割平面同侧的所有子节点定义为X轴子节点,得到两个X轴子节点,将光线包按照光线行进方向与依次与两个X轴子节点的包围盒做相交测试,当光线包与第一个X轴子节点的包围盒有相交光线时,将相交光线生成子光线包,否则将光线包继续与第二个X轴子节点的包围盒做相交测试,并将相交光线生成子光线包;b)对光线包沿模型空间的Y轴进行遍历在步骤a)的与光线包有相交光线的那个X轴子节点中,将位于Y轴分割平面同侧的所有子节点定义为Y轴子节点,得到两个Y轴子节点,将步骤a)的得到的子光线包按照光线行进方向与依次与两个Y轴子节点的包围盒做相交测试,当光线包与第一个Y轴子节点的包围盒有相交光线时,将相交光线生成子光线包,否则将光线包继续与第二个Y轴子节点的包围盒做相交测试,并将相交光线生成子光线包;c)对光线包沿模型空间的Z轴进行遍历在步骤b)的与光线包有相交光线的那个Y轴子节点中,将位于Z轴分割平面同侧的所有子节点定义为Z轴子节点,得到两个Z轴子节点,将步骤b)的得到的子光线包按照光线行进方向与依次与两个Z轴子节点的包围盒做相交测试,当光线包与第一个Z轴子节点的包围盒有相交光线时,将相交光线生成子光线包,否则将光线包继续与第二个Z轴子节点的包围盒做相交测试,并将相交光线生成子光线包;在步骤(1)中对模型空间第一次划分得到的八个子节点中,确定一个在步骤a)、步骤b)和步骤c)中均与光线包或子光线包有相交光线的一个子节点,针对该子节点重复步骤a)、步骤b)和步骤c)的操作,直至子光线包遇到叶子节点,若在子光线包遇到叶子节点前,子光线包中有效光线的比例低于或等于阈值时,则进行步骤(5)的操作;(4)将遇到叶子节点的子光线包与叶子节点内的面片依次做相交测试,得到与面片有相交关系的光线;(5)对光线包中的每条光线分别进行如下处理以宽度优先的方式按照节点层数由低至高,将光线每次同时与若干个节点的包围盒做相交测试,当遇到叶子节点时,将光线同时与若干个叶子节点中的三角面片做相交测试,直到该叶子节点内所有三角面片都完成了相交测试,得到与光线起点最近且与光线相交的三角面片;(6)根据模型空间需要进行渲染的模型的材质类型,对经过步骤(4)中相交测试的光线赋予相应的着色代码,按照模型的材质类型进行渲染;对经过步骤(5)中相交测试的子光线包内的光线进行分类,分别赋予相应的着色代码,按照模型的材质类型依次进行渲染。2.如权利要求1所述的并行渲染方法,其特征在于,步骤(1)中在需要进行渲染的模型空间的相互垂直的X轴、Y轴和Z轴上,分别计算采样分割点的SAH花费,然后选取每个坐标轴上花费最小的分割点,将选取的这三个分割点作为分割平面,对模型空间中的场景数据进行划分。3.如权利要求2所述的并行渲染方法,其特征在于,步骤(3)中,所述的X轴分割平面是构建八叉树时对X轴进行分割的那个平面;所述的Y轴分割平面是构建八叉树时对Y轴进行分割的那个平面;所述的Z轴分割平面是构建八叉树时对Z轴进行分割的那个平面。全文摘要本发明公开了一种实时二级光线跟踪的并行渲染方法,包括(1)通过构建八叉树,对需要进行渲染的模型空间的场景数据进行划分;(2)光线包中有效光线的比例高于阈值时,进行步骤(3)的操作,否则进行步骤(5)的操作;(3)对光线包沿模型空间的三个坐标轴进行遍历;(4)将子光线包与叶子节点内的面片依次做相交测试,得到与面片有相交关系的光线;(5)对光线包中的每条光线分别进行相交测试得到与光线起点最近且与光线相交的三角面片;(6)根据模型空间需要进行渲染的模型的材质类型,对子光线包内的光线进行分类,依次进行渲染。本发明并行渲染方法可有效利用硬件的并行计算能力,减少光线遍历和相交所需时间。文档编号G06T1/20GK101826215SQ20101015056公开日2010年9月8日申请日期2010年4月19日优先权日2010年4月19日发明者杨鑫,葛蓉,许端清,赵磊申请人:浙江大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1