本申请涉及计算机图形学技术领域,更具体地说,涉及一种光线追踪方法、系统、设备及计算机可读存储介质。
背景技术:
光线追踪是一种以模拟现实世界中的光线传播来实现真实感绘制的算法,光线追踪通过模拟光线在自然界中的传播过程,基于场景中各对象的材质属性,计算光线在场景中的反射、折射等过程。通过对个光线的递归追踪,可以得到每条光线对最终所形成图像各像素的光谱贡献值。
现有的一种光线追踪计算方法是采用gpu(graphicsprocessingunit,图形处理器)来实现光线追踪计算,即使用单指令多数据的单元实现光线追踪的加速。
然而,由于gpu中每个simd(singleinstructionmultipledata,单指令多数据流)单元都需要维护较多的本地数据和中间信息,导致现有的采用gpu来实现光线追踪计算的方法的计算效率较低。
综上所述,如何提高光线追踪方法的计算效率是目前本领域技术人员亟待解决的问题。
技术实现要素:
本申请的目的是提供一种光线追踪方法,其能在一定程度上解决如何提高光线追踪计算方法的计算效率的技术问题。本申请还提供了一种光线追踪系统、设备及计算机可读存储介质。
为了实现上述目的,本申请提供如下技术方案:
一种光线追踪方法,应用于fpga中,包括:
获取待渲染场景及待追踪光线组,所述待追踪光线组中包括待追踪光线;
按照预设的并行数对所述待追踪光线组进行光线追踪,得到所述待追踪光线组中每一条所述待追踪光线与所述待渲染场景的交点信息。
优选的,所述获取待渲染场景及待追踪光线组,包括:
获取处理后的待渲染场景,获取所述待追踪光线组;
所述按照预设的并行数对所述待追踪光线组进行光线追踪,得到所述待追踪光线组中每一条所述待追踪光线与所述待渲染场景的交点信息,包括:
按照预设的并行数对所述待追踪光线组进行光线追踪,得到所述待追踪光线组中每一条所述待追踪光线与所述处理后的待渲染场景的交点信息。
优选的,所述获取处理后的待渲染场景,包括:
获取线性存储形式的kd-tree结构,所述kd-tree结构与所述待渲染场景相对应。
优选的,对于每一条所述待追踪光线,所述fpga对所述待追踪光线进行光线追踪的过程包括:
基于所述待追踪光线对所述kd-tree结构进行遍历,得到所述kd-tree结构与所述待追踪光线相交的相交叶子节点;
基于所述相交叶子节点的三角面数据,计算得到所述三角面数据中与所述待追踪光线的起点间的距离值最小的交点作为相交交点;
基于所述相交叶子节点的三角面数据对应的属性求得所述待追踪光线在所述相交交点处生成的次级光线;
判断生成所述次级光线的次数是否大于预设次数,若是,则将得到的每一个所述相交交点作为所述待追踪光线与所述待渲染场景的交点,若否,则将所述次级光线作为所述待追踪光线,返回所述基于所述待追踪光线对所述待渲染kd-tree进行遍历的步骤。
优选的,所述基于所述待追踪光线对所述kd-tree结构进行遍历,包括:
设置当前遍历深度的值为0,确定所述kd-tree结构的根节点为当前遍历节点;
判断所述待追踪光线是否与当前遍历节点相交;
若否,则将当前遍历节点设为0,若是,则判断当前遍历节点是否为叶子节点;
若当前遍历节点不为叶子节点,则获取当前遍历节点的剖分轴,计算所述待追踪光线与当前遍历节点对应的三角面网格的交点,计算所述交点在所述剖分轴上的分量;
判断所述分量是否小于所述剖分轴对应的剖分数值,若所述分量小于所述剖分数值,则在所述待追踪光线射向当前遍历节点的右子节点方向时,将所述右子节点存入遍历深度栈,将当前遍历节点的左子节点作为当前遍历节点,若所述分量大于等于所述剖分数值,则在所述待追踪光线射向当前遍历节点的左子节点方向时,将所述左子节点存入所述遍历深度栈,将当前遍历节点的右子节点作为当前遍历节点;
将当前遍历深度的值加1,返回所述判断当前遍历节点是否为叶子节点的步骤。
优选的,所述判断当前遍历节点是否为叶子节点之后,还包括:
若当前遍历节点为叶子节点,则判断所述待追踪光线是否与当前遍历节点对应的三角面网格相交;
若所述待追踪光线不与当前遍历节点对应的三角面网格相交,则判断当前遍历深度是否小于等于零;
若当前遍历深度大于零,则判断所述遍历深度栈中是否存在当前遍历节点的兄弟节点;
若所述遍历深度栈中不存在当前遍历节点的兄弟节点,则将当前遍历深度的值减1,将当前遍历节点的父节点作为当前遍历节点,返回判断当前遍历深度是否小于等于零的步骤;
若所述遍历深度栈中存在当前遍历节点的兄弟节点,则将当前遍历节点的兄弟节点出栈,并将当前遍历节点的兄弟节点作为当前遍历节点,判断所述待追踪光线是否与当前遍历节点相交;
若所述待追踪光线与当前遍历节点相交,则返回执行所述判断当前遍历节点是否为叶子节点的步骤,若所述待追踪光线不与当前遍历节点相交,则返回执行将当前遍历深度的值减1的步骤。
优选的,所述得到所述待追踪光线组中每一条所述待追踪光线与所述待渲染场景的交点信息之后,还包括:
基于所述交点信息计算得到所述待渲染场景对应的渲染图像。
一种光线追踪系统,应用于fpga中,包括:
第一获取模块,用于获取待渲染场景及待追踪光线组,所述待追踪光线组中包括待追踪光线;
第一计算模块,用于按照预设的并行数对所述待追踪光线组进行光线追踪,得到所述待追踪光线组中每一条所述待追踪光线与所述待渲染场景的交点信息。
一种光线追踪设备,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述计算机程序时实现如上任一所述的光线追踪方法的步骤。
一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,所述计算机程序被处理器执行时实现如上任一所述的光线追踪方法的步骤。
本申请提供的一种光线追踪方法,应用于fpga中,获取待渲染场景及待追踪光线组,待追踪光线组中包括待追踪光线;按照预设的并行数对待追踪光线组进行光线追踪,得到待追踪光线组中每一条待追踪光线与待渲染场景的交点信息。本申请提供的一种光线追踪方法,借助fpga获取待渲染场景及待追踪光线组,按照预设的并行数对待追踪光线组进行光线追踪,也即借助fpga实现了并行对待追踪光线组进行光线追踪,也即可同时对多个待追踪光线进行光线追踪,与现有技术中cpu一次只能对一条待追踪光线进行光线追踪相比,提高了光线追踪的计算效率。本申请提供的一种光线追踪系统、设备及计算机可读存储介质也解决了相应技术问题。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请实施例提供的一种光线追踪方法的第一流程图;
图2为fpga基于待追踪光线对kd-tree结构进行遍历的流程图;
图3为本申请实施例提供的一种光线追踪系统的结构示意图;
图4为本申请实施例提供的一种光线追踪设备的结构示意图;
图5为本申请实施例提供的一种光线追踪设备的另一结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
光线追踪是一种真实地显示物体的方法。光线追踪方法沿着到达视点的光线的反方向跟踪,经过屏幕上每一个象素,找出与视线相交的物体表面点p0,并继续跟踪,找出影响p0点光强的所有光源,从而算出p0点上精确的光线强度,在材质编辑中经常用来表现镜面效果。光线追踪是计算机图形学的核心算法之一。在算法中,光线从光源被抛射出来,当他们经过物体表面的时候,对他们应用种种符合物理光学定律的变换。最终,光线进入虚拟的摄像机底片中,图片被生成出来。
现有的一种光线追踪计算方法是采用gpu(graphicsprocessingunit,图形处理器)来实现光线追踪计算,即使用单指令多数据的单元实现光线追踪的加速。然而,由于gpu中每个simd(singleinstructionmultipledata,单指令多数据流)单元都需要维护较多的本地数据和中间信息,导致现有的采用gpu来实现光线追踪计算的方法的计算效率较低。而本申请提供的一种光线追踪方法可以提高计算效率。
请参阅图1,图1为本申请实施例提供的一种光线追踪方法的第一流程图。
本申请实施例提供的一种光线追踪方法,应用于fpga(field-programmablegatearray,现场可编程门阵列)中,可以包括以下步骤:
步骤s101:获取待渲染场景及待追踪光线组,待追踪光线组中包括待追踪光线。
实际应用中,fpga先获取待渲染场景及待追踪光线组,待追踪光线组中包括待追踪光线,待追踪光线组中包含的待追踪光线的数量可以根据实际需要确定。具体应用场景中,可以借助cpu来生成待追踪光线组,具体的,cpu接收外界设置的相机数据、生成图像分辨率等初始化参数,按照该初始化参数生成待追踪光线组。待渲染场景可以根据实际需要确定。
步骤s102:按照预设的并行数对待追踪光线组进行光线追踪,得到待追踪光线组中每一条待追踪光线与待渲染场景的交点信息。
实际应用中,fpga获取待渲染场景及待追踪光线组后,可以按照预设的并行数对待追踪光线组进行光线追踪,得到待追踪光线组中每一条待追踪光线与待渲染场景的交点信息。
实际应用中,为了进一步提高光线追踪的计算效率,fpga还可以获取处理后的待渲染场景,相应的,fpga按照预设的并行数对待追踪光线组进行光线追踪,得到待追踪光线组中每一条待追踪光线与处理后的待渲染场景的交点信息。具体应用场景中,处理后的待渲染场景可以为线性存储形式的kd-tree结构,kd-tree结构与待渲染场景相对应;kd-tree是计算机科学中使用的一种数据结构,用来组织表示k维空间中点集合,是一种带有其他约束条件的二分查找树。可选的,可以借助cpu生成kd-tree结构,具体的,cpu对待渲染场景的描述语言进行数据的加载和解析,得到场景数据;按照kd-tree的结构将场景数据构建成场景kd-tree,并建立待渲染场景中几何元素和场景kd-tree叶子节点间的对应关系;将场景kd-tree通过宽度优先遍历转化成线性存储形式的kd-tree结构;最后将线性存储形式的kd-tree结构发送至fpga。
可选的,对于每一条待追踪光线,fpga对待追踪光线进行光线追踪的过程可以包括:由于待渲染场景中几何元素与场景kd-tree叶子节点相对应,所以,待追踪光线只能与kd-tree结构的叶子节点相交,所以fpga先基于待追踪光线对kd-tree结构进行遍历,得到kd-tree结构与待追踪光线相交的相交叶子节点,遍历的过程中,fpga判断待追踪光线是否与叶子节点相交,若是,则将该叶子节点作为相交叶子节点;在得到相交节点后,fpga可以基于相交叶子节点的三角面数据,计算得到三角面数据中与待追踪光线的的起点间的距离值最小的交点作为相交交点,由于待渲染场景中的网格为三角形网格,所以与叶子节点对应的几何元素代表的是三角形网格中包含的待渲染场景的元素,三角面数据中包含三角形网格的三个顶点数据;光线在遇到一个物体后,可能会发生反射、折射、透射等现象,也即待追踪光线在遇到物体后可能会生成次级光线,所以fpga需基于相交叶子节点的三角面数据对应的属性求得待追踪光线在相交交点处生成的次级光线;在光线追踪的过程中,由于光线遇到物体便有可能生成次级光线,如果对每条次级光线均进行追踪,可能会导致计算过程繁琐复杂,且难以得到最后的结果,具体应用场景中,在保证光线追踪质量的情况下,可以设置对次级光线追踪的追踪次数,当达到追踪次数时,便停止对追踪光线的追踪,相应的,fpga判断生成次级光线的次数是否大于预设次数,预设次数的本质与追踪次数一样,若是,则将得到的每一个相交交点作为待追踪光线与待渲染场景的交点,应当指出,这里所述的得到的每一个相交交点指的是初始待追踪光线以及待追踪光线相对应的次级光线与三角面数据的相交交点,若否,则将次级光线作为待追踪光线,返回基于待追踪光线对kd-tree结构进行遍历的步骤。
实际应用中,fpga在得到待追踪光线组中每一条待追踪光线与待渲染场景的交点信息后,还可以根据交点信息计算得到最终的渲染图像。交点信息可以包括交点对应的像素、交点的颜色等。
本申请提供的一种光线追踪方法,应用于fpga中,获取待渲染场景及待追踪光线组,待追踪光线组中包括待追踪光线;按照预设的并行数对待追踪光线组进行光线追踪,得到待追踪光线组中每一条待追踪光线与待渲染场景的交点信息。本申请提供的一种光线追踪方法,借助fpga获取待渲染场景及待追踪光线组,按照预设的并行数对待追踪光线组进行光线追踪,也即借助fpga实现了并行对待追踪光线组进行光线追踪,也即可同时对多个待追踪光线进行光线追踪,与现有技术中cpu一次只能对一条待追踪光线进行光线追踪相比,提高了光线追踪的计算效率。本申请提供的一种光线追踪系统、设备及计算机可读存储介质也解决了相应技术问题。
请参阅图2,图2为fpga基于待追踪光线对kd-tree结构进行遍历的流程图。
实际应用中,fpga基于待追踪光线对kd-tree结构进行遍历的过程可以包括以下步骤:
步骤s201:设置当前遍历深度的值为0,确定kd-tree结构的根节点为当前遍历节点。
步骤s202:判断待追踪光线是否与当前遍历节点相交;若否,则执行步骤s203,若是,则执行步骤s204。
实际应用中,待追踪光线与叶子节点相交时,必然与该叶子节点的根节点相交,所以fpga需先将kd-tree结构的根节点作为当前遍历节点,从根节点开始查找叶子节点。若待追踪光线与当前遍历节点,也即根节点相交,则再判断待追踪光线是否与属于该根节点的叶子节点相交,也即执行步骤s204,若待追踪光线与当前遍历节点,也即根节点不相交,则可以确定待追踪光线与该根节点相关的叶子节点间没有交点,此时,可以执行步骤s203,还可以直接返回待追踪光线与kd-tree结构无交点的信息等。
步骤s203:将当前遍历节点设为0,返回当前遍历节点。
步骤s204:判断当前遍历节点是否为叶子节点;若否,则执行步骤s205,若是,则执行步骤s210。
待追踪光线与根节点相交后,由于kd-tree结构的本质仍为二叉树,所以可以通过判断待追踪光线是沿着二叉树的哪个分支前进来判断待追踪光线与哪个叶子节点相交。
步骤s205:获取当前遍历节点的剖分轴,计算待追踪光线与当前遍历节点对应的三角面网格的交点,计算交点在剖分轴上的分量。
步骤s206:判断分量是否小于剖分轴对应的剖分数值,若是,则执行步骤s207,若否,则执行步骤s208。
交点在剖分轴上的分量小于剖分轴对应的剖分数值时,待追踪光线进入当前遍历节点的左分支,也即待追踪光线与当前遍历节点的左子节点相交,相应的,交单在剖分轴上的分类大于剖分轴对应的剖分数值时,待追踪光线进入当前遍历节点的右分支,也即待追踪光线与当前遍历节点的右子节点相交。
步骤s207:在待追踪光线射向当前遍历节点的右子节点方向时,将右子节点存入遍历深度栈,将当前遍历节点的左子节点作为当前遍历节点。
在待追踪光线进入当前遍历节点的左分支时,还需判断待追踪光线是否射向当前遍历节点的右子节点方向,若是,则需将当前遍历节点的右子节点存入遍历深度栈,以便在待追踪光线与当前遍历节点左分支对应的叶子节点不相交时,判断待追踪光线是否与当前遍历节点右分支对应的叶子节点相交,借助遍历深度栈可以不需要重新从根节点出发遍历出与待追踪光线相交的叶子节点,可以在一定程度上提高遍历效率。具体应用场景中,遍历深度栈可以为通过二进制位运算模拟栈功能的虚拟栈,此时,虚拟栈包括一个栈状态标识和一个遍历深度计数器;遍历深度计数器表示当前遍历的节点在kd-tree结构中所处的深度位置;栈状态标识是一个32bit无符号整数,每个位上的值表示对应的遍历深度节点的状态,1表示遍历深度节点已入栈,0表示遍历深度节点已出栈。具体应用场景中,入栈操作可以通过程序s_idt|=0x00000001<<d_cal来实现,s_idt表示栈状态标识,d_cal表示遍历深度,<<表示位移运算符,入栈就是把栈状态标识对应深度位置由0变为1;相应的,出栈操作可以通过程序sidt&=~(0x00000001<<d_cal)来实现,出栈就是把栈状态标识对应深度位置由1变为0。
步骤s208:在待追踪光线射向当前遍历节点的左子节点方向时,将左子节点存入遍历深度栈,将当前遍历节点的右子节点作为当前遍历节点。
步骤s208的原理与步骤s207相同,这里不再赘述。
步骤s209:将当前遍历深度的值加1,返回步骤s204。
由于当前遍历节点并不一定为叶子节点,所以仍需判断当前遍历节点是否为叶子节点,也即需返回执行步骤s204及以后的步骤。
步骤s210:判断待追踪光线是否与当前遍历节点对应的三角面网格相交;若否,则执行步骤s211,若是,则执行步骤s216。
在当前遍历节点为叶子节点的情况下,fpga还需判断待追踪光线是否与当前遍历节点对应的三角面网格相交,也即判断待追踪光线是否与当前遍历节点对应的几何元素相交,若待追踪光线不与几何元素相交,则当前遍历节点并不为待追踪光线与待渲染场景的交点,若待追踪光线与几何元素相交,则当前遍历节点为待追踪光线与待渲染场景的交点。
步骤s211:判断当前遍历深度是否小于等于零;若否,则执行步骤s212,若是,则执行步骤s217。
由于遍历深度栈的存在,可以使得fpga从叶子节点开始,沿着叶子结点到根节点、根节点到其他叶子节点的路径,判断待追踪光线是否与其他叶子节点相交,遍历深度小于等于零,也即意味着当前遍历节点已返回至根节点,也即待追踪光线与kd-tree结构的叶子节点并不相交。
步骤s212:判断遍历深度栈中是否存在当前遍历节点的兄弟节点;若否,则执行步骤s213,若是,则执行步骤s214。
当前遍历节点的兄弟节点也即与当前遍历节点同属于一个父节点的节点,以当前遍历节点为根节点的左子节点为例,则当前遍历节点的兄弟节点便为根节点的右子节点,相应的,若当前遍历节点为根节点的右子节点,则当前遍历节点的兄弟节点便为根节点的左子节点。
步骤s213:将当前遍历深度的值减1,将当前遍历节点的父节点作为当前遍历节点,返回步骤s211。
步骤s214:当前遍历节点的兄弟节点出栈,并将当前遍历节点的兄弟节点作为当前遍历节点。
在上述步骤中,是判断待追踪光线是否与当前遍历节点对应的叶子节点相交,而将当前遍历节点的兄弟节点存入遍历深度栈中,也即并未判断待追踪光线是否与当前遍历节点的兄弟节点相交,此时将当前遍历节点的兄弟节点作为当前遍历节点,便是为了判断待追踪光线是否与当前遍历节点的兄弟节点对应的叶子节点相交;从而省去了从根节点开始重新遍历与待追踪光线相交的叶子节点的过程。
步骤s215:判断待追踪光线是否与当前遍历节点相交;若待追踪光线与当前遍历节点相交,则返回步骤s204,若所述待追踪光线不与当前遍历节点相交,则返回步骤s213。
步骤s216:返回当前遍历节点。
步骤s217:将当前遍历节点设为0,返回当前遍历节点。
本申请还提供了一种光线追踪系统,其具体本申请实施例提供的一种光线追踪方法具有的对应效果。请参阅图3,图3为本申请实施例提供的一种光线追踪系统的结构示意图。
本申请实施例提供的一种光线追踪系统,应用于fpga中,可以包括:
第一获取模块101,用于获取待渲染场景及待追踪光线组,待追踪光线组中包括待追踪光线;
第一计算模块102,用于按照预设的并行数对待追踪光线组进行光线追踪,得到待追踪光线组中每一条待追踪光线与待渲染场景的交点信息。
本申请实施例提供的一种光线追踪系统中,第一获取模块可以包括:
第一获取单元,用于获取处理后的待渲染场景,获取待追踪光线组;
第一计算模块可以包括:
第一计算单元,用于按照预设的并行数对待追踪光线组进行光线追踪,得到待追踪光线组中每一条待追踪光线与处理后的待渲染场景的交点信息。
本申请实施例提供的一种光线追踪系统中,第一获取单元可以包括:
第一获取子单元,用于获取线性存储形式的kd-tree结构,kd-tree结构与待渲染场景相对应。
本申请实施例提供的一种光线追踪系统中,第一计算模块可以包括:
遍历单元,用于对于每一条待追踪光线,基于待追踪光线对kd-tree结构进行遍历,得到kd-tree结构与待追踪光线相交的相交叶子节点;
第二计算单元,用于基于相交叶子节点的三角面数据,计算得到三角面数据中与待追踪光线的起点间的距离值最小的交点作为相交交点;
求取单元,用于基于相交叶子节点的三角面数据对应的属性求得待追踪光线在相交交点处生成的次级光线;
第一判断单元,用于判断生成次级光线的次数是否大于预设次数,若是,则将得到的每一个相交交点作为待追踪光线与待渲染场景的交点,若否,则将次级光线作为待追踪光线,返回基于待追踪光线对kd-tree结构进行遍历的步骤。
本申请实施例提供的一种光线追踪系统中,遍历单元可以包括:
设置子单元,用于设置当前遍历深度的值为0,确定kd-tree结构的根节点为当前遍历节点;
第一判断子单元,用于判断待追踪光线是否与当前遍历节点相交;若否,则将当前遍历节点设为0;
第二判断子单元,用于若第一判断子单元判断待追踪光线与当前遍历节点相交时,判断当前遍历节点是否为叶子节点;若当前遍历节点不为叶子节点,则获取当前遍历节点的剖分轴,计算待追踪光线与当前遍历节点对应的三角面网格的交点,计算交点在剖分轴上的分量;
第三判断子单元,用于判断分量是否小于剖分轴对应的剖分数值,若分量小于剖分数值,则在待追踪光线射向当前遍历节点的右子节点方向时,将右子节点存入遍历深度栈,将当前遍历节点的左子节点作为当前遍历节点,若分量大于等于剖分数值,则在待追踪光线射向当前遍历节点的左子节点方向时,将左子节点存入遍历深度栈,将当前遍历节点的右子节点作为当前遍历节点;
第一提示子单元,用于将当前遍历深度的值加1,提示第二判断子单元判断当前遍历节点是否为叶子节点的步骤。
本申请实施例提供的一种光线追踪系统中,还可以包括:
第四判断子单元,用于第二判断子单元判断当前遍历节点为叶子节点之后,判断待追踪光线是否与当前遍历节点对应的三角面网格相交;
第五判断子单元,用于第四判断子单元判断待追踪光线不与当前遍历节点对应的三角面网格相交时,判断当前遍历深度是否小于等于零;
第六判断子单元,用于第五判断子单元判断当前遍历深度大于零时,判断遍历深度栈中是否存在当前遍历节点的兄弟节点;若遍历深度栈中不存在当前遍历节点的兄弟节点,则将当前遍历深度的值减1,将当前遍历节点的父节点作为当前遍历节点,提示第五判断子单元判断当前遍历深度是否小于等于零的步骤;
第七判断子单元,用于第六判断子单元判断遍历深度栈中存在当前遍历节点的兄弟节点时,将当前遍历节点的兄弟节点出栈,并将当前遍历节点的兄弟节点作为当前遍历节点,判断待追踪光线是否与当前遍历节点相交;
第二提示单元,用于第七判断子单元判断待追踪光线与当前遍历节点相交时,提示第二判断子单元执行判断当前遍历节点是否为叶子节点的步骤,第七判断子单元判断待追踪光线不与当前遍历节点相交时,提示第六判断子单元执行将当前遍历深度的值减1的步骤。
本申请实施例提供的一种光线追踪系统中,还可以包括:
渲染模块,用于第一计算模块得到待追踪光线组中每一条待追踪光线与待渲染场景的交点信息之后,基于交点信息计算得到待渲染场景对应的渲染图像。
本申请还提供了一种光线追踪设备及计算机可读存储介质,其均具有本申请实施例提供的一种光线追踪方法所具有的相应效果。请参阅图4,图4为本申请实施例提供的一种光线追踪设备的结构示意图。
本申请实施例提供的一种光线追踪设备,包括存储器201及处理器202,存储器201中存储有计算机程序,处理器202执行存储器201中存储的计算机程序时实现如下步骤:
获取待渲染场景及待追踪光线组,待追踪光线组中包括待追踪光线;
按照预设的并行数对待追踪光线组进行光线追踪,得到待追踪光线组中每一条待追踪光线与待渲染场景的交点信息。
本申请实施例提供的一种光线追踪设备,包括存储器201及处理器202,存储器201中存储有计算机子程序,处理器202执行存储器201中存储的计算机子程序时具体实现如下步骤:获取处理后的待渲染场景,获取待追踪光线组;按照预设的并行数对待追踪光线组进行光线追踪,得到待追踪光线组中每一条待追踪光线与处理后的待渲染场景的交点信息。
本申请实施例提供的一种光线追踪设备,包括存储器201及处理器202,存储器201中存储有计算机子程序,处理器202执行存储器201中存储的计算机子程序时具体实现如下步骤:获取线性存储形式的kd-tree结构,kd-tree结构与待渲染场景相对应。
本申请实施例提供的一种光线追踪设备,包括存储器201及处理器202,存储器201中存储有计算机子程序,处理器202执行存储器201中存储的计算机子程序时具体实现如下步骤:对于每一条待追踪光线,fpga对待追踪光线进行光线追踪的过程包括:基于待追踪光线对kd-tree结构进行遍历,得到kd-tree结构与待追踪光线相交的相交叶子节点;基于相交叶子节点的三角面数据,计算得到三角面数据中与待追踪光线的起点间的距离值最小的交点作为相交交点;基于相交叶子节点的三角面数据对应的属性求得待追踪光线在相交交点处生成的次级光线;判断生成次级光线的次数是否大于预设次数,若是,则将得到的每一个相交交点作为待追踪光线与待渲染场景的交点,若否,则将次级光线作为待追踪光线,返回基于待追踪光线对kd-tree结构进行遍历的步骤。
本申请实施例提供的一种光线追踪设备,包括存储器201及处理器202,存储器201中存储有计算机子程序,处理器202执行存储器201中存储的计算机子程序时具体实现如下步骤:设置当前遍历深度的值为0,确定kd-tree结构的根节点为当前遍历节点;判断待追踪光线是否与当前遍历节点相交;若否,则将当前遍历节点设为0,若是,则判断当前遍历节点是否为叶子节点;若当前遍历节点不为叶子节点,则获取当前遍历节点的剖分轴,计算待追踪光线与当前遍历节点对应的三角面网格的交点,计算交点在剖分轴上的分量;判断分量是否小于剖分轴对应的剖分数值,若分量小于剖分数值,则在待追踪光线射向当前遍历节点的右子节点方向时,将右子节点存入遍历深度栈,将当前遍历节点的左子节点作为当前遍历节点,若分量大于等于剖分数值,则在待追踪光线射向当前遍历节点的左子节点方向时,将左子节点存入遍历深度栈,将当前遍历节点的右子节点作为当前遍历节点;将当前遍历深度的值加1,返回判断当前遍历节点是否为叶子节点的步骤。
本申请实施例提供的一种光线追踪设备,包括存储器201及处理器202,存储器201中存储有计算机子程序,处理器202执行存储器201中存储的计算机子程序时具体实现如下步骤:判断当前遍历节点是否为叶子节点之后,若当前遍历节点为叶子节点,则判断待追踪光线是否与当前遍历节点对应的三角面网格相交;若待追踪光线不与当前遍历节点对应的三角面网格相交,则判断当前遍历深度是否小于等于零;若当前遍历深度大于零,则判断遍历深度栈中是否存在当前遍历节点的兄弟节点;若遍历深度栈中不存在当前遍历节点的兄弟节点,则将当前遍历深度的值减1,将当前遍历节点的父节点作为当前遍历节点,返回判断当前遍历深度是否小于等于零的步骤;若遍历深度栈中存在当前遍历节点的兄弟节点,则将当前遍历节点的兄弟节点出栈,并将当前遍历节点的兄弟节点作为当前遍历节点,判断待追踪光线是否与当前遍历节点相交;若待追踪光线与当前遍历节点相交,则返回执行判断当前遍历节点是否为叶子节点的步骤,若待追踪光线不与当前遍历节点相交,则返回执行将当前遍历深度的值减1的步骤。
本申请实施例提供的一种光线追踪设备,包括存储器201及处理器202,存储器201中存储有计算机子程序,处理器202执行存储器201中存储的计算机子程序时具体实现如下步骤:得到待追踪光线组中每一条待追踪光线与待渲染场景的交点信息之后,基于交点信息计算得到待渲染场景对应的渲染图像。
请参阅图5,本申请实施例提供的另一种光线追踪设备中还可以包括:与处理器202连接的输入端口203,用于传输外界输入的命令至处理器202;与处理器202连接的显示单元204,用于显示处理器202的处理结果至外界;与处理器202连接的通信模块205,用于实现光线追踪设备与外界的通信。显示单元202可以为显示面板、激光扫描使显示器等;通信模块205所采用的通信方式包括但不局限于移动高清链接技术(hml)、通用串行总线(usb)、高清多媒体接口(hdmi)、无线连接:无线保真技术(wifi)、蓝牙通信技术、低功耗蓝牙通信技术、基于ieee802.11s的通信技术。
本申请实施例提供的一种计算机可读存储介质,计算机可读存储介质中存储有计算机程序,计算机程序被处理器执行时实现如下步骤:
获取待渲染场景及待追踪光线组,待追踪光线组中包括待追踪光线;
按照预设的并行数对待追踪光线组进行光线追踪,得到待追踪光线组中每一条待追踪光线与待渲染场景的交点信息。
本申请实施例提供的一种计算机可读存储介质,计算机可读存储介质中存储有计算机子程序,计算机子程序被处理器执行时具体实现如下步骤:获取处理后的待渲染场景,获取待追踪光线组;按照预设的并行数对待追踪光线组进行光线追踪,得到待追踪光线组中每一条待追踪光线与处理后的待渲染场景的交点信息。
本申请实施例提供的一种计算机可读存储介质,计算机可读存储介质中存储有计算机子程序,计算机子程序被处理器执行时具体实现如下步骤:获取线性存储结构的kd-tree结构,kd-tree结构与待渲染场景相对应。
本申请实施例提供的一种计算机可读存储介质,计算机可读存储介质中存储有计算机子程序,计算机子程序被处理器执行时具体实现如下步骤:对于每一条待追踪光线,fpga对待追踪光线进行光线追踪的过程包括:基于待追踪光线对kd-tree结构进行遍历,得到kd-tree结构与待追踪光线相交的相交叶子节点;基于相交叶子节点的三角面数据,计算得到三角面数据中与待追踪光线的起点间的距离值最小的交点作为相交交点;基于相交叶子节点的三角面数据对应的属性求得待追踪光线在相交交点处生成的次级光线;判断生成次级光线的次数是否大于预设次数,若是,则将得到的每一个相交交点作为待追踪光线与待渲染场景的交点,若否,则将次级光线作为待追踪光线,返回基于待追踪光线对kd-tree结构进行遍历的步骤。
本申请实施例提供的一种计算机可读存储介质,计算机可读存储介质中存储有计算机子程序,计算机子程序被处理器执行时具体实现如下步骤:设置当前遍历深度的值为0,确定kd-tree结构的根节点为当前遍历节点;判断待追踪光线是否与当前遍历节点相交;若否,则将当前遍历节点设为0,若是,则判断当前遍历节点是否为叶子节点;若当前遍历节点不为叶子节点,则获取当前遍历节点的剖分轴,计算待追踪光线与当前遍历节点对应的三角面网格的交点,计算交点在剖分轴上的分量;判断分量是否小于剖分轴对应的剖分数值,若分量小于剖分数值,则在待追踪光线射向当前遍历节点的右子节点方向时,将右子节点存入遍历深度栈,将当前遍历节点的左子节点作为当前遍历节点,若分量大于等于剖分数值,则在待追踪光线射向当前遍历节点的左子节点方向时,将左子节点存入遍历深度栈,将当前遍历节点的右子节点作为当前遍历节点;将当前遍历深度的值加1,返回判断当前遍历节点是否为叶子节点的步骤。
本申请实施例提供的一种计算机可读存储介质,计算机可读存储介质中存储有计算机子程序,计算机子程序被处理器执行时具体实现如下步骤:判断当前遍历节点是否为叶子节点之后,若当前遍历节点为叶子节点,则判断待追踪光线是否与当前遍历节点对应的三角面网格相交;若待追踪光线不与当前遍历节点对应的三角面网格相交,则判断当前遍历深度是否小于等于零;若当前遍历深度大于零,则判断遍历深度栈中是否存在当前遍历节点的兄弟节点;若遍历深度栈中不存在当前遍历节点的兄弟节点,则将当前遍历深度的值减1,将当前遍历节点的父节点作为当前遍历节点,返回判断当前遍历深度是否小于等于零的步骤;若遍历深度栈中存在当前遍历节点的兄弟节点,则将当前遍历节点的兄弟节点出栈,并将当前遍历节点的兄弟节点作为当前遍历节点,判断待追踪光线是否与当前遍历节点相交;若待追踪光线与当前遍历节点相交,则返回执行判断当前遍历节点是否为叶子节点的步骤,若待追踪光线不与当前遍历节点相交,则返回执行将当前遍历深度的值减1的步骤。
本申请实施例提供的一种计算机可读存储介质,计算机可读存储介质中存储有计算机子程序,计算机子程序被处理器执行时具体实现如下步骤:得到待追踪光线组中每一条待追踪光线与待渲染场景的交点信息之后,基于交点信息计算得到待渲染场景对应的渲染图像。
本申请所涉及的计算机可读存储介质包括随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或技术领域内所公知的任意其它形式的存储介质。
本申请实施例提供的一种光线追踪系统、设备及计算机可读存储介质中相关部分的说明请参见本申请实施例提供的一种光线追踪方法中对应部分的详细说明,在此不再赘述。另外,本申请实施例提供的上述技术方案中与现有技术中对应技术方案实现原理一致的部分并未详细说明,以免过多赘述。
还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。