首页 / 专利库 / 电脑编程 / 算法 / 光线跟踪算法 / 家装设计软件中光线跟踪算法的加速方法

家装设计软件光线跟踪算法加速方法

阅读:680发布:2020-05-17

专利汇可以提供家装设计软件光线跟踪算法加速方法专利检索,专利查询,专利分析的服务。并且家装设计 软件 中 光线 跟踪 算法 的 加速 方法,对 光线跟踪 算法 进行了优化,将对 光线跟踪算法 的优化与GPU的 硬件 加速结合,通过CUDA编程实现优化过了的光线跟踪算法,并在支持递归的高档GPU,以及不支持递归的低档GPU上实现基于CUDA加速的光线跟踪算法,通过算法优化和GPU硬件加速的软硬件结合,用来加速光线跟踪算法的 渲染 。本 发明 充分发挥 包围盒 算法和空间剖分算法的优点,解决了光线与包围盒遍历的盲目性问题,方法简单,加速效果明显;本发明实现简单,避免了在CPU和GPU之间传递大量数据,充分利用了GPU自身的内存,为运行于CUDA上的光线跟踪算法等需要递归的算法提供了一个绝佳的实现方案。,下面是家装设计软件光线跟踪算法加速方法专利的具体信息内容。

1.家装设计软件光线跟踪算法加速方法,其特征是对光线跟踪算法进行优化,包括:
1)减少递归次数:
光线跟踪算法是递归的算法,需要递归计算反射/折射光线的颜色,如果像素颜色中的红绿蓝三原色的值都要比多次反射率或折射率的乘积大一百倍的时候,则自动终止光线的继续递归,实现加速;
2)通过包围盒算法减少面片相交盲目性:
在光线跟踪算法中,为了找到与光线相交最近的面片需要依次计算各面片与光线的交点,采用包围盒方法,用一个简单的几何体将一个物体的所有面片围起来形成一个整体,如果光线不与该包围盒相交,那么光线必然不会与包围盒内部的面片相交,只有当光线与包围盒相交时才需要计算光线与包围盒中面片是否相交,通过包围盒算法判断出必然不会与光线相交的面片,用于减少面片相交的计算;
3)通过均匀空间剖分算法减少包围盒相交盲目性:
均匀空间剖分方法将整个场景空间均分为八个子空间,坐标原点位于场景中心,各个子空间中包含数量不等的包围盒,沿着光线方向寻找与光线相交的子空间,根据光线的方向矢量,得出光线可能进入的子空间是哪几个,如果光线可能进入多个子空间,分别求出光线进入这几个子空间的距离,找出光线最先进入距离最近的子空间,在最近的子空间的包围盒内计算面片相交,寻找与光线相交最近的面片;
优化后的光线跟踪算法的运行步骤如下七个步骤:
1)构建场景并解析文件,在场景中放置物品,场景中的大部分物品都是3ds文件,渲染之前需要对3ds文件进行解析从而获取点线面以及纹理等信息;
2)用包围盒将每一个3ds模型文件都围起来,包围盒采用的是球体;
3)将整个场景空间均分成八个子空间,依次找到这八个子空间中的所有包围盒,构建三维矩阵s[2][2][2],矩阵中存储的是指针,指向对应子空间中的包围盒;
4)初始光线生成,各像素产生一条或多条初始光线,光线方向垂直屏幕射入场景;
5)运行光线跟踪算法,找到光线经过的第一个空间,依次遍历其中包围盒,直到找到与光线交点最近的包围盒,遍历该包围盒中所有面片,找到与光线交点最近的面片,如果所有面片都不相交,就找到与光线相交的下一个包围盒,如果该空间中所有包围盒中的面片都不与光线相交,就找到与光线相交的下一个子空间,依此类推,直到找到与光线交点最近的面片,如果所有面片都不与光线相交,就返回背景色,该光线遍历结束;
6)找到与光线最近的交点后,首先计算由漫反射、环境光产生的颜色值,若与光线相交的物体表面材质反射或折射光线,就生成新的折射、反射光线,递归计算该新的光线的颜色;如果光线射出场景、光线与光源相交、光线与完全漫反射物体相交、递归次数达到上限时停止递归,而且若新的光线对像素颜色值可忽略不计的时候也停止递归;
7)将各像素的颜色值转化为计算机能显示的值,如果一个像素发射多条光线,那么就取平均值后再转化为计算机能显示的值,最后在屏幕上显示出来。
2.根据权利要求1所述的家装设计软件中光线跟踪算法的加速方法,其特征是将对光线跟踪算法的优化与GPU的硬件加速结合,通过CUDA编程实现优化过了的光线跟踪算法,优化的光线跟踪算法运行在支持递归的高档GPU上,高档GPU指基于CUDA的Fermi架构及以上性能的GPU。
3.根据权利要求1所述的家装设计软件中光线跟踪算法的加速方法,其特征是将对光线跟踪算法的优化与GPU的硬件加速结合,通过CUDA编程实现优化过了的光线跟踪算法,借助通用函数模板实现在低档GPU上的递归函数调用,进而在低档GPU上运行优化的光线跟踪算法,实现加速;所述低档GPU指不支持递归的GPU,通用函数模板能实现不受数据类型影响的通用型的函数,当函数调用本身的时候通过通用函数模板生成一个新的函数,所述新的函数的功能与原函数是一样的,从而实现递归函数调用的功能。

说明书全文

家装设计软件光线跟踪算法加速方法

技术领域

[0001] 本发明属于计算机图形设计技术领域,涉及家装软件中的三维设计,具体为家装设计软件中光线跟踪算法的加速方法。

背景技术

[0002] 二十世纪中后期,随着真实感图形学的出现,标志着计算机图形的发展进入了新的阶段。对场景进行光照处理的方法大致可以分为两大类:直接照明和全局照明。1980年Whitted提出了光线跟踪模型,并且具体给出了算法的实例,该模型成功的利用跟踪光线的传播路径来解决光照问题。
[0003] 光线跟踪算法最基本的实现方式是求得各个像素颜色后在屏幕上显示出来,而光线跟踪算法的基本原理是几何光学。光线从场景外射入场景,如果光线不与场景中物体相交就返回环境光,如果光线与场景中物体相交,先求出该点由于漫反射和环境光导致的颜色C1,如果交点物体反射或折射光线,就计算折射和反射光线的颜色C2和C3,最终光线的颜色是C=C1+反射率*C2+折射率*C3。如果屏幕的一个像素只发射一条光线,那么C就是该像素的颜色,如果一个像素发射多条光线,那么最终像素的颜色就是多条光线颜色的均值。
[0004] 光线跟踪算法能够模拟真实的光线传递过程,因此渲染出的效果图更加逼真、更具沉浸感,而高质量的设计效果图是三维家装设计软件应具备的重要功能,因此多数家装设计软件都将光线跟踪算法引入到渲染引擎中以获得逼真的设计效果图。但是光线跟踪算法需要的计算量非常庞大,75%~95%的计算都是光线与面片的求交运算,场景中的物体都是由大量的小面片组合而成的,渲染一张高质量设计效果图通常要耗时数小时,因此如何加快光线跟踪算法渲染速度一直是三维家装设计软件需要解决的难题。
[0005] 现有技术中,加速光线跟踪算法的渲染速度主要从两方面进行,一种是对光线跟踪算法进行优化,一种是通过CUDA并行运算实现加速。
[0006] (1)对光线跟踪算法进行优化
[0007] 对光线跟踪算法的优化主要可以分为两类,一类是包围盒算法,一类是空间分割算法。包围盒类算法主要分为基本包围盒算法、内包围盒算法和层次包围盒算法。空间分割类算法主要分为三维DDA算法、八叉树空间剖分算法、二叉树空间剖分算法以及KD-Tree。
[0008] (2)通过CUDA并行运算实现加速
[0009] GPU有多个流处理器,单个流处理器速度快,多个流处理器可以并发执行,因此对并行度高的算法能起到较大的加速效果。光线跟踪算法的各个像素颜色的计算互不相关,完全独立,并行度较高,因此采用GPU进行运算能大幅度提高光线跟踪算法的渲染速度。
[0010] CUDA是一个新的管理GPU计算的硬件和软件架构,无需将计算映射到API便可在GPU上进行数据运算,大大降低采用GPU进行通用运算的难度,使程序员更容易地运用GPU的高计算性能。
[0011] CUDA支持C/C++,因此可以很好地将光线跟踪算法移植到CUDA中。CUDA调用GPU进行运算,但除了少数高档GPU以外的低成本GPU都不支持递归,而光线跟踪算法是一个需要递归的算法,没有递归就不能模拟真实的光线跟踪算法,不能渲染出高质量设计效果图。
[0012] 目前较为常用的方法是通过GPU和CPU的协作来实现递归函数调用功能,其原理是CPU调用GPU进行一次运算,运算结束后将数据传递到CPU,CPU获得数据后将这些数据存储后再次调用GPU进行一次运算,最后运算结束后CPU对存储的所有数据进行运算,求得各个像素的颜色后在屏幕上显示出来。
[0013] 上述的对光线跟踪算法进行优化的方法中,包围盒算法需依次判断光线与各个包围盒是否相交;三维DDA算法对物体分布不均匀的场景加速效果较差;内包围盒算法、层次包围盒算法、八叉树空间剖分算法、二叉树空间剖分算法以及KD-Tree等优化算法增加了算法的结构复杂性,大大增加了算法所占内存,而且对渲染复杂场景加速效果较弱。
[0014] 上述通过CUDA并行运算实现加速的方法中,通过CPU与GPU协作来实现递归函数调用的方法,主要有以下三个缺点:一是需要频繁的在CPU与GPU之间来回传递海量数据,需要很多传递时间;二是由于像素颜色必须等所有递归光线的计算结果出来之后才能计算,所以CPU需要耗费大量内存来存储GPU传递回来的数据;三是增大了程序的复杂性。

发明内容

[0015] 本发明要解决的问题是:光线跟踪算法能够真实模拟自然界中的光线传播规律并能生成逼真度高的效果图,但该算法需要的计算量异常庞大,采用光线跟踪算法的家装设计软件渲染一张高质量效果图耗时很长。现有技术的手段为通过算法优化的改进或硬件加速来加快渲染处理的速度,但仍然存在复杂耗时的问题,不能满足使用需求。
[0016] 本发明的技术方案为:家装设计软件中光线跟踪算法的加速方法,对光线跟踪算法进行优化,包括:
[0017] 1)减少递归次数:
[0018] 光线跟踪算法是递归的算法,需要递归计算反射/折射光线的颜色,如果像素颜色中的红绿蓝三原色的值都要比多次反射率或折射率的乘积大一百倍的时候,则自动终止光线的继续递归,实现加速;
[0019] 2)通过包围盒算法减少面片相交盲目性:
[0020] 在光线跟踪算法中,为了找到与光线相交最近的面片需要依次计算各面片与光线的交点,采用包围盒方法,用一个简单的几何体将一个物体的所有面片围起来形成一个整体,如果光线不与该包围盒相交,那么光线必然不会与包围盒内部的面片相交,只有当光线与包围盒相交时才需要计算光线与包围盒中面片是否相交,通过包围盒算法判断出必然不会与光线相交的面片,用于减少面片相交的计算;
[0021] 3)通过均匀空间剖分算法减少包围盒相交盲目性:
[0022] 均匀空间剖分方法将整个场景空间均分为八个子空间,坐标原点位于场景中心,各个子空间中包含数量不等的包围盒,沿着光线方向寻找与光线相交的子空间,根据光线的方向矢量,得出光线可能进入的子空间是哪几个,如果光线可能进入多个子空间,分别求出光线进入这几个子空间的距离,找出光线最先进入距离最近的子空间,在最近的子空间的包围盒内计算面片相交,寻找与光线相交最近的面片。
[0023] 进一步的,将对光线跟踪算法的优化与GPU的硬件加速结合,通过CUDA编程实现优化过了的光线跟踪算法,优化的光线跟踪算法运行在支持递归的高档GPU上,高档GPU指基于CUDA的Fermi架构及以上性能的GPU。
[0024] 更进一步的,将对光线跟踪算法的优化与GPU的硬件加速结合,通过CUDA编程实现优化过了的光线跟踪算法,借助通用函数模板实现在低档GPU上的递归函数调用,进而在低档GPU上运行优化的光线跟踪算法,实现加速;所述低档GPU指不支持递归的GPU,通用函数模板能实现不受数据类型影响的通用型的函数,当函数调用本身的时候通过通用函数模板生成一个新的函数,所述新的函数的功能与原函数是一样的,从而实现递归函数调用的功能。
[0025] 本发明的关键创新点是:
[0026] 1、提出了囊括包围盒算法和空间分割算法的光线跟踪优化算法,既完美发挥了包围盒算法的优点,又避免了引入包围盒算法后增加的遍历包围盒的相交计算。
[0027] 2、提出了借助通用函数模板实现CUDA递归函数调用的方法,使得低档GPU也能很方便地实现递归函数调用,充分利用了GPU自身的内存空间,避免了程序结构的复杂性,避免了CPU大量内存的损耗。
[0028] 本发明采用的优化算法是分三步对光线跟踪算法进行优化,充分发挥包围盒算法和空间剖分算法的优点,解决了光线与包围盒遍历的盲目性问题,结构简单,加速效果明显。本发明采用的借助通用函数模板解决CUDA上光线跟踪算法递归函数调用的方法,实现简单,避免了在CPU和GPU之间传递大量数据,充分利用了GPU自身的内存,为运行于CUDA上的光线跟踪算法等需要递归的算法提供了一个绝佳的实现方案。附图说明
[0029] 图1为本发明对光线跟踪算法的优化中,减少递归次数的优化方法流程图,(a)为主流程,(b)为(a)中光线追踪函数的具体流程。
[0030] 图2为本发明对光线跟踪算法的优化中,减少面片相交盲目性的优化方法流程图。
[0031] 图3为本发明对光线跟踪算法的优化中,减少递归次数的优化与减少面片相交盲目性的优化相结合的流程图,(a)为主流程,(b)为(a)中光线追踪函数的具体流程。
[0032] 图4为本发明对光线跟踪算法的优化中,均匀空间剖分法的示意图。
[0033] 图5为本发明中,均匀空间剖分方法寻找与光线交点最近面片流程图。
[0034] 图6为本发明对光线跟踪算法进行优化的流程图,(a)为主流程,(b)为(a)中光线追踪函数的具体流程。
[0035] 图7为基于CUDA的光线跟踪算法流程图。
[0036] 图8为本发明实施例1,在低档GPU基于CUDA运行光线跟踪算法的主函数的流程图。
[0037] 图9为本发明实施例1,图8主函数中调用的渲染函数的流程图。
[0038] 图10为本发明实施例1,图9渲染函数中调用的光线追踪函数的流程图。
[0039] 图11为本发明实施例1中,最后一次递归时调用的光线追踪函数2的流程图。
[0040] 图12为本发明实施例2,软硬件综合加速用于光线跟踪算法的主函数流程图。
[0041] 图13为本发明实施例2,图12流程中调用的渲染函数的流程图。
[0042] 图14为本发明实施例2,图13流程中调用的光线追踪函数的流程图。
[0043] 图15为本发明实施例2中,最后一次递归时调用的光线追踪函数2的流程图。

具体实施方式

[0044] 本发明对家装设计软件中光线跟踪算法的加速方法包括两个方面,一个是对算法本身的优化,另一方面是与硬件加速结合,下面通过具体实施方式来具体介绍本发明的实施。
[0045] 本发明对传统的优化算法做了改进,主要从三个方面对光线跟踪算法进行优化。
[0046] 1)减少递归次数
[0047] 光线跟踪算法是一个递归的算法,需要递归计算反射/折射光线的颜色,递归计算可以使得渲染出的效果图更加逼真,但是因为需要乘上各级递归的折射、反射率,当递归次数多了之后新产生的光线对像素颜色的影响很小,这个时候的递归没有太大意义,而计算一条光线的颜色涉及的计算量非常庞大,因此此时可以终止递归,从而实现加速。
[0048] 设初始光线从V出发经屏幕射入场景,光线在P1处发生折射,在P2处发生折射,在P3处发生反射,在P4处发生折射,在P5处发生折射,最终形成了光线T5。按照光线跟踪原理,像素颜色就是初始光线的颜色,像素颜色要加上光线T5的影响,光线T5对像素颜色的影响大小是T5的颜色×P5折射率×P4折射率×P3反射率×P2折射率×P1折射率,假设反射折射率都是0.1,那么光线T5的影响大小是T5的颜色×0.00001,若此时像素颜色值是(0.1,0.1,0.1),就算光线T5的颜色是(1,1,1),那么像素颜色也只是增加了0.00001而已,可以忽略不计。对于此类可以忽略的递归运算本发明采用的优化方法是:如果像素颜色中的红绿蓝三原色的值都要比多次反射率或折射率的乘积大一百倍的时候就自动终止光线的继续递归,此时采用了优化后的光线跟踪算法流程图如图1所示。
[0049] 2)减少面片相交盲目性
[0050] 在光线跟踪算法中为了找到与光线相交最近的面片需要依次计算所有面片与光线的交点,计算盲目性太大,光线跟踪算法涉及的大量运算中75%~95%都是相交运算,为了减少光线与面片的相交运算本发明采用了一种包围盒的优化方法。包围盒方法用一个简单的几何体,例如长方体、球体等,将一个物体的所有面片围起来形成一个整体,如果光线不与该包围盒相交,那么光线必然不会与包围盒内部的面片相交,只有当光线与包围盒相交时才需要计算光线与包围盒中面片是否相交,采用包围盒优化方法后寻找与光线交点最近面片的流程如图2所示。
[0051] 包围盒方法的优缺点:如果光线不与任何面片相交,不采用包围盒时需要依次判断光线与所有面片是否相交,采用包围盒后最理想的情况是光线不与任何包围盒相交,不需要判断光线与面片是否相交;如果光线只与一个面片相交,不采用包围盒时需要依次判断光线与所有面片是否相交,采用包围盒后最理想的情况是光线只与一个包围盒相交,依次判断该包围盒中的面片是否与光线相交;如果光线与多个面片相交,不采用包围盒需要依次判断光线与所有面片是否相交,采用包围盒后最理想的情况是光线只与包含这些相交面片的包围盒相交,依次判断这几个包围盒中的面片是否与光线相交。这三种情形采用包围盒后的最坏情况都是光线与所有包围盒相交,除了要判断光线与所有面片是否相交外还要进行光线与包围盒的相交运算。包围盒方法的优点是如果场景中物体较少,很多光线的求交运算都是理想情况,加速效果较明显;包围盒的缺点是如果场景中物体较多,很多光线的求交运算都是较坏情况,加速效果较弱。
[0052] 将减少递归次数优化方法和包围盒方法结合后对光线跟踪算法进行优化,优化后的算法流程如图3所示。
[0053] 3)减少包围盒相交盲目性
[0054] 包围盒方法能大大提高光线跟踪算法的渲染速度,但需要计算光线与所有包围盒的相交测试,当包围盒较多时遍历所有包围盒需耗费不少时间,本发明采用均匀空间剖分方法来减少光线与包围盒的相交测试运算。光线只可能与它经过的小空间中的包围盒相交,从而减少了光线与所有面片的相交计算
[0055] 均匀空间剖分方法将整个场景空间均分为八个子空间,坐标原点位于场景中心,向左为x轴,由内向外为y轴,向上为z轴,如图4所示。
[0056] 图4所示的各个子空间中包含数量不等的包围盒,在程序初始化中新建一个三维数组,数组中存放的是指针,指针指向对应子空间中的包围盒。将减少面片相交盲目性方法与减少包围盒相交盲目性方法结合起来后,寻找与光线交点最近的面片流程如图5所示。
[0057] 均匀空间剖分方法需要沿着光线方向寻找下一个与光线相交的子空间,光线的方向可以分为沿x轴、y轴、z轴的三个矢量,若x方向矢量为正则有可能向左进入下一个空间,为负则有可能向右进入下一个空间,为零则不会向左或向右进入下一个空间,y轴、z轴同理。根据光线的方向矢量,可以得出光线可能进入的下一个空间是哪几个,如果光线可能进入多个,分别求出光线进入这几个空间的距离,光线最先进入距离最近的空间。
[0058] 将减少递归次数优化方法、包围盒方法、均匀空间剖分算法结合后形成的优化方法就是本发明采用的优化方法,如图6所示,优化后的光线跟踪算法的运行步骤如下七个步骤:
[0059] 1)构建场景并解析文件。在场景中放置物品,场景中的大部分物品都是3ds文件,渲染之前需要对3ds文件进行解析从而获取点线面以及纹理等信息。
[0060] 2)用包围盒将每一个3ds模型文件都围起来,包围盒采用的是球体。
[0061] 3)将整个场景空间均分成八个子空间,依次找到这八个子空间中的所有包围盒,构建三维矩阵s[2][2][2],矩阵中存储的是指针,指向对应子空间中的包围盒。
[0062] 4)初始光线生成,各像素产生一条或多条初始光线,光线方向垂直屏幕射入场景。
[0063] 5)运行光线跟踪算法,找到光线经过的第一个空间,依次遍历其中包围盒,直到找到与光线交点最近的包围盒,遍历该包围盒中所有面片,找到与光线交点最近的面片,如果所有面片都不相交,就找到与光线相交的下一个包围盒,如果该空间中所有包围盒中的面片都不与光线相交,就找到与光线相交的下一个子空间,依此类推,直到找到与光线交点最近的面片。如果所有面片都不与光线相交,就返回背景色,该光线遍历结束。
[0064] 6)找到与光线最近的交点后,首先计算由漫反射、环境光产生的颜色值,若与光线相交的物体表面材质反射或折射光线,就生成新的折射、反射光线,递归计算该新的光线的颜色。如果光线射出场景、光线与光源相交、光线与完全漫反射物体相交、递归次数达到上限时停止递归,而且若新的光线对像素颜色值可忽略不计的时候也停止递归。
[0065] 7)将各像素的颜色值转化为计算机能显示的值,如果一个像素发射多条光线,那么就取平均值后再转化为计算机能显示的值,最后在屏幕上显示出来。
[0066] 虽然对光线跟踪算法优化之后渲染速度有所提高,但渲染一张高质量设计效果图依然需要一个多小时,因此必须要进一步加快光线跟踪算法的渲染速度。光线跟踪算法中各光线颜色的计算相互独立,因此可以通过并行运算实现加速,本发明还研究了如何借助CUDA强大的并行运算能来加快光线跟踪算法的渲染速度。
[0067] 本发明采用由GPU完成所有的逻辑处理和计算,CPU只负责场景构建以及3ds文件解析,并将解析后的数据传到GPU内存的方法来实现光线跟踪算法。CUDA也支持C/C++和OpenGL,在支持递归的GPU中基于CUDA的光线跟踪算法的运行流程图如图7所示,(a)为主函数流程图,(b)为主函数中调用的渲染函数的流程图,(c)为调用的光线追踪函数的流程图。
[0068] 虽然采用GPU渲染的速度高于CPU渲染速度,但是只有基于CUDA的费米(Fermi)高档显卡才支持递归,其他大部分显卡都是不支持递归的。基于CUDA的Fermi显卡价格较贵,参考价格GTX460:1099¥,GTX465:1699¥,GTX470:2888¥,GTX480:3888¥,因此本发明还研究了使得不支持递归的显卡实现递归函数调用的方法。
[0069] 目前对于不支持递归的GPU,较为普遍的实现递归函数调用的方法是通过CPU和GPU共同完成递归。当程序运行时,CPU调用GPU完成一次相交运算,GPU将获得的颜色值、反射光线、折射光线回馈给CPU,然后CPU整合数据之后再一次调用GPU进行计算。该方法的优点在于可以发挥出GPU高强的计算能力以及CPU优越的逻辑处理能力,其缺点主要在于三方面,一是需要频繁的在CPU与GPU之间来回传递海量数据,需要很多传递时间;二是由于像素颜色必须等所有递归光线的计算结果出来之后才能计算,所以CPU需要耗费大量内存来存储GPU传递回来的数据;三是增大了程序的复杂性。
[0070] 本发明创新性地研究出了借助通用函数模板实现CUDA递归函数调用的方法。函数模板的作用是增加代码的可重用性,例如一个求两个整型数据的最大值,编写函数如下:
[0071] int max(int a,int b){return a>b?a:b;}
[0072] 调用函数max(3,2)将会返回3,但是如果调用函数max(3.2,2.1),函数同样会返回3,因此为了可以求得两个浮点型数据的最大值,还要编写函数:
[0073] float max(float a,float b){return a>b?a:b;}
[0074] 对于同一个函数,为了使得该函数能用于不同的数据类型,必须要针对该数据类型再写一遍函数,而函数模板能实现不受数据类型影响的通用型的函数,如:
[0075] templateGroap max(Groap a,Groap b){return a>b?a:b;}[0076] 该函数模板在程序运行过程中,Groap会被其他类型所置换,例如调用函数max(3,2)时Groap会被置换为int,调用函数max(3.2,2.1)时Groap会被置换为float。置换的过程中实际上生成了一个新的函数,如调用函数max(3,2)时生成了函数int max(int a,int b){return a>b?a:b;},调用函数max(3.2,2.1)时生成了函数float max(float a,float b){return a>b?a:b;},新函数的生成是隐式发生的,称为模板实参推演。
[0077] 程序要实现递归首先要有存储当前函数状态的堆栈,而GPU有存储当前函数状态的堆栈。递归的本质就是函数调用函数本身,低成本GPU虽然不支持递归,但是有堆栈,而且CUDA支持函数模板,因此可以采用函数模板生成新的函数,当函数需要调用自身时采用函数模板生成一个新的函数后再调用,虽然不是递归却能实现递归的功能,因此通过函数模板实现递归函数调用是可行的。
[0078] 借助通用函数模板实现递归函数调用的优点是:简单易行,充分利用了GPU各个流处理器自身的内存,没有增加程序的复杂性,不需要对光线跟踪程序进行大范围修改,也不需要在CPU与GPU间传递大量数据。
[0079] 借助通用函数模板实现递归函数调用,函数调用时用来存储当前函数状态的内存空间是GPU各个流处理器自身的内存,而GPU各个流处理器的内存较小,因此如果递归次数较多,内存不够用会导致程序崩溃。一般来说光线跟踪算法中设置递归次数上限是五次,递归次数多了之后新产生的光线对像素颜色的影响可以忽略不计,而且本发明采用的减少递归次数的优化算法也会自动终止对像素颜色几乎没有影响的递归,因此不会发生GPU内存空间不足的情况,所以借助通用函数模板实现递归函数调用的方法完全适用于光线跟踪算法。
[0080] 实施例1,在低档GPU运行基于CUDA加速的光线跟踪算法流程如图8-图11:图8为在低档GPU基于CUDA运行光线跟踪算法的主函数的流程图,图9为主函数中调用的渲染函数的流程图,图10为渲染函数中调用的光线追踪函数的流程图,图11为也为调用的光线追踪函数的流程图,是最后一次递归时调用的流程图。具体如下:
[0081] 1)构建场景并解析3ds文件,获取3ds文件中的点线面以及纹理信息。
[0082] 2)建立用于存储像素颜色的内存空间,用一个指针指向该内存。
[0083] 3)将场景信息复制到GPU内存空间中。
[0084] 4)调用渲染函数,将存放像素颜色的空间的指针、视点位置度、生成图片的像素大小传递给渲染函数,渲染函数将计算出的像素颜色存储到指针所指向的内存当中,渲染函数结束后主函数将像素颜色值转换为计算机能显示的形式并在屏幕上显示。然后主函数进入循环等待状态,如果用户视点或位置发生变化就再次调用渲染函数,直到程序被中止。
[0085] 5)渲染函数根据视点位置及角度、生成图片的像素大小生成光线,虽然各个线程同时执行渲染函数,但是各个线程的内建变量的值都不同,所以生成的光线是不同的。之后渲染函数会调用光线追踪函数,光线追踪函数计算光线颜色并返回给渲染函数。
[0086] 6)光线追踪函数进行光线与所有面片的相交测试,找到与光线交点最近的面片。若光线与所有面片都不相交,返回背景色;若与光线相交的物体是光源则返回光源颜色;若相交面片的材质完全漫反射,就返回由于漫反射导致的光线颜色;若物体反射光就调用通过函数模板生成的另一个函数,折射同理;若达到递归次数上限就调用光线追踪函数,该函数仅返回背景色。
[0087] 实施例2,将本发明的优化算法和CUDA可递归并行运算结合后加速光线跟踪算法渲染速度,流程如图12-15。图12主函数流程图,图13为主函数中调用的渲染函数的流程图,图14为渲染函数调用的光线追踪函数的流程图,图15为光线追踪函数2,是最后一次递归时调用的流程图。
[0088] 上述实施例中,本领域技术人员根据现有渲染及光线跟踪算法,结合本发明所述技术方案即可通过编程实现,不再详述与现有技术相同的程序过程。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈