一种基于OpenCL的并行化渐进式光子映射方法和装置制造方法

文档序号:6620446阅读:386来源:国知局
一种基于OpenCL的并行化渐进式光子映射方法和装置制造方法
【专利摘要】本发明公开了一种基于OpenCL的并行化渐进式光子映射方法和装置,应用于虚拟现实技术中的全局光照领域,利用OpenCL实现并行化渐进式光子映射。首先初始化并加载场景模型,初始化OpenCL计算参数,然后基于OpenCL对视点光线跟踪、光子跟踪和场景渲染进行并行化,把工作负载合理设计在对应的处理器上,等待命令队列执行完毕,读取计算结果并传递给CPU,最后利用OpenCL标准库函数释放CPU中存储的数据资源。应用本发明所述的方法和装置,能够显著提高渐进式光子映射算法的效率,与设计在CPU上的计算方法相比,效率提升到4-9倍,具有高度的可移植性,同时渲染效果也得到一定的提升。
【专利说明】一种基于OpenCL的并行化渐进式光子映射方法和装置

【技术领域】
[0001] 本发明涉及一种基于OpenCL的并行化渐进式光子映射方法和装置,提高了渐进 式光子映射算法的效率,对于真实感全局光照具有很高的应用价值,属于虚拟现实技术领 域。

【背景技术】
[0002] 随着计算机图形学广泛应用在数字娱乐,虚拟导航,教育学习,模拟训练,虚拟医 疗,电子商务等等领域中,人们对图形渲染的真实感要求越来越高,而真实感全局光照是提 高虚拟场景真实感的关键技术之一。目前基于物理的全局光照有光线跟踪,辐射度和光子 映射,其中光子映射算法利用前两个方法的优点,能够模拟出各种光照效果。例如,焦散,光 辉及颜色溢出等等。
[0003] 由于光子映射算法计算量大且保存光子贴图需要很高的内存成本,在交互式系统 中难以达到实时性要求。近几年来针对光子映射提出了很多优化方法来提高算法效率。其 中渐进式光子映射算法具有很好的鲁棒性,并且基于一致性条件重新规划了光子映射算 法,很好地解决了光子贴图的内存成本问题。虽然渐进式光子映射算法在一定程度上提高 了场景渲染效果,但是算法效率始终是个瓶颈。在渐进式光子映射算法中主要包括三个步 骤,即视点光线跟踪、光子跟踪和场景渲染。加快视点光线跟踪、光子跟踪以及场景渲染速 度是提高算法效率的关键问题。
[0004] 随着计算机图形硬件的快速发展,利用GPU并行通用计算来提高全局光照算法渲 染效率的方法得到了越来越多的关注。一些主流的商业渲染软件开始利用GPU通用计算实 现全局光照。渐进式光子映射算法中,视点光线跟踪、光子跟踪和场景渲染具有高度并行 性,基于OpenCL异构计算平台实现并行化渐进式光子映射,对于提高算法效率具有重要意 义。


【发明内容】

[0005] 本发明的目的在于提供一种基于OpenCL的并行化渐进式光子映射方法,将工作 负载的不同部分分配到适合的处理器,使得算法运行效率得到了大幅度的提高。
[0006] 本发明的另一个目的在于提供一种基于OpenCL的并行化渐进式光子映射装置, 将工作负载的不同部分分配到合适的处理器,能使算法运行效率得到了大幅度的提高。
[0007] 为了达到上述目的,本发明的技术方案是这样实现的:
[0008] -种基于OpenCL的并行化渐进式光子映射方法,具体包括一下几个步骤:
[0009] 步骤1 :初始化OpenCL计算参数,包括:工作组的维数和大小信息,创建设备上下 文及指令队列,创建场景模型内存对象、视线交点内存对象、光子贴图内存对象以及像素矩 阵内存对象,加载视点光线跟踪、光子跟踪和场景渲染文件,声明视点光线跟踪内核函数、 光子跟踪内核函数以及场景渲染内核函数;
[0010] 步骤2 :基于OpenCL对视点光线跟踪进行并行化;
[0011] 步骤3 :基于OpenCL对光子跟踪进行并行化;
[0012] 步骤4 :基于OpenCL对场景渲染并行化;
[0013] 步骤5 :释放GPU中存储的数据资源。
[0014] 一种基于OpenCL的并行化渐进式光子映射装置,该装置包括:
[0015] 配置单元,用于初始化OpenCL计算参数,包括:工作组的维数和大小信息,创建设 备上下文及指令队列,创建场景模型内存对象、视线交点内存对象、光子贴图内存对象以及 像素矩阵内存对象,加载视点光线跟踪、光子跟踪和场景渲染文件,声明视点光线跟踪内核 函数、光子跟踪内核函数以及场景渲染内核函数;
[0016] 并行化单元,用于在GPU上利用OpenCL对视点光线跟踪、光子跟踪和场景渲染进 行并行计算,并把最终计算结果传给CPU ;
[0017] 释放单元,用于利用OpenCL标准库函数clReleaseMemObject ()来释放GPU中存 储的数据资源。
[0018] 上述的技术方案可以看出,本发明的益处在于:
[0019] 基于OpenCL异构并行计算平台设计一种并行化渐进式光子映射方法,在不同图 形处理器之间可移植性强;将工作负载的不同部分设计在适合的处理器上,CPU主要负责 管理和调度各个任务,GPU负责通用并行计算,能够大幅度地提升算法执行效率。

【专利附图】

【附图说明】
[0020] 图1为本发明基于OpenCL的并行化渐进式光子映射方法实施例的流程图;
[0021] 图2为本发明方法实施例中的计算视点光线与场景物交点示意图;
[0022] 图3为本发明方法实施例中的视点光线跟踪中每个工作项的并行任务示意图;
[0023] 图4为本发明基于OpenCL的并行化渐进式光子映射装置实施例的组成结构图。

【具体实施方式】
[0024] 针对现有技术中存在的问题,本发明中结合OpenCL异构并行计算平台提出一种 并行化渐进式光子映射方案,以实现提高算法的执行效率。
[0025] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完 整地描述。本发明是一种基于OpenCL的并行化渐进式光子映射方法和装置,结合OpenCL 异构并行计算架构,把渐进式光子映射中各个步骤进行并行化,通过不同的工作负载设计 在适合的处理器上,CPU主要负责管理和调度各个任务,GPU负责通用并行计算,算法的执 行效率得到大幅度的提高。
[0026] 图1为本发明基于OpenCL的并行化渐进式光子映射方法实施例的流程图。如图 1所示,视点光线跟踪、光子跟踪和场景渲染设计在GPU上,从而充分利用了 GPU的计算性 能,提高渲染效率。CPU负责其中各过程的调度、初始化场景以及加载场景模型。具体包括 一下步骤:
[0027] 步骤101 :根据屏幕分辨率定义一个像素矩阵,并初始化像素矩阵中的每一个值 为0,设定虚拟相机以及光源位置。
[0028] 步骤102 :读取场景模型,把模型的几何面片保存在一个内存区域中,并用KD-树 来组织和管理场景里的几何面片,用于下一步几何求交运算。
[0029] 如何读取模型和建立KD-树为现有技术,不再赘述。
[0030] 步骤103 :初始化OpenCL计算参数,设置一个工作组大小为16 X 16,要 确保全局工作节点各个维数能被工作组对应维数整除,利用OpenCL标准库函数 clCreateContextFromType ()创建设备上下文,并用 clCreateCommandQueue ()创建命 令队列,利用OpenCL标准库函数clCreateBuffer ()创建场景模型缓冲区、视线交点 缓冲区、光子贴图缓冲区以及像素缓冲区,其中场景模型缓冲区为内核只读模式,视线 交点缓冲区、光子贴图缓冲区以及像素缓冲区为内核读写模式,利用OpenCL标准库函 数clCreateProgramWithSourceO加载视点光线跟踪、光子跟踪和场景渲染文件,并用 clBuildProgramO转化为内核可执行的程序文件,仓ij建声明基于OpenCL的视点光线跟踪 内核函数、光子跟踪内核函数和场景渲染内核函数。
[0031] 步骤104 :视点光线跟踪并行化或视线跟踪并行化中,首先利用OpenCL标准库函 数clSetKernelArgO将参数地址传入视点光线跟踪内核函数,参数包括场景模型数据、像 素矩阵和视线交点数据,利用OpenCL标准库函数clEnqueueWriteBuffer (),将指令序列数 据缓冲区中视点光线跟踪所需要的场景模型数据和像素矩阵传递到GPU中,利用OpenCL标 准库函数clEnqueueNDRangeKernelO激活视点光线跟踪内核并其执行,具体为:
[0032] 每一个视点光线对应一个OpenCL工作项,如图2所示,在每一个工作项中完成发 射视点光线、计算视点光线与场景几何面片的交点、保存交点以及更新交点信息。如图3所 示,从视点通过成像平面上的栅格点向场景发射光线,计算与场景几何面片的交点。其中交 点信息包括交点位置,光线入射方向,像素权值及像素位置等。根据不同的像素数量一般情 况下向场景发射几十万至几百万光线;
[0033] 最后利用OpenCL标准库函数clFinishO等待命令队列中的所有命令执行完成, 并通过调用clEnqueueReadBufferO将OpenCL计算得到的视线交点数据传递到CPU内存。 [0034] 如何计算视点光线与场景几何面片的交点为现有技术,不再赘述。
[0035] 步骤105 :光子跟踪并行化中,利用OpenCL标准库函数clSetKernelArgO将参数 地址传入光子跟踪内核函数,参数包括场景模型数据和光子贴图,利用OpenCL标准库函数 clEnqueueWriteBuffer (),将指令序列数据缓冲区中视点光线跟踪所需要的场景模型数据 传递到GPU中,利用OpenCL标准库函数clEnqueueNDRangeKernelO激活光子跟踪内核并 其执行,具体为:
[0036] 各个光子跟踪是相互独立,把每个光子的创建、发射和跟踪设计在一个OpenCL的 工作项中。首先创建一个光子,光子信息主要包括光源位置、光能量和面片索引。从光源发 射光子并进行跟踪,对于光子跟踪设置了最大跟踪深度,这样不会进行无限跟踪光子。每次 跟踪光子时,首先判断光子跟踪深度是否达到最大值,如果达到最大值就停止继续跟踪,并 光子保存到光子贴图中;
[0037] 最后利用OpenCL标准库函数clFinishO等待命令队列中的所有命令执行完成, 并通过调用clEnqueueReadBufferO将OpenCL计算得到的光子贴图传递到CPU内存。
[0038] 步骤106 :场景渲染并行化中,利用OpenCL标准库函数clEnqueueWriteBuffer (), 将指令序列数据缓冲区中场景渲染所需要的视线交点数据和光子贴图传递到GPU中,利用 OpenCL标准库函数clEnqueueNDRangeKernelO激活场景渲染内核并其执行,具体为:
[0039] 通过计算视点光线与场景几何面片交点处的辐射度来确定对应像素的颜色值。每 个交点是相互独立的,可以并行计算。式(1)为求解辐射度。其中Nemitted为发射光子数量, g为视点光线在交点处的入射方向,为光子入射方向,f;为BRDF函数,⑴为光子 P在χρ处方向上的光通量;
[0040]

【权利要求】
1. 一种基于OpenCL的并行化渐进式光子映射方法,其特征在于,包括以下几个步骤: 步骤1 :初始化OpenCL计算参数,包括:工作组的维数和大小信息,创建设备上下文及 指令队列,创建场景模型内存对象、视线交点内存对象、光子贴图内存对象以及像素矩阵内 存对象,加载视点光线跟踪、光子跟踪和场景渲染文件,声明视点光线跟踪内核函数、光子 跟踪内核函数以及场景渲染内核函数; 步骤2 :基于OpenCL对视点光线跟踪进打并彳丁化; 步骤3 :基于OpenCL对光子跟踪进行并行化; 步骤4 :基于OpenCL对场景渲染并行化; 步骤5 :利用OpenCL标准库函数clReleaseMemObject ()来释放GPU中存储的数据资 源。
2. 根据权利要求1所述的基于OpenCL的并行化渐进式光子映射方法,其特征在于,步 骤1具体包括: 步骤1-1 :设置一个工作组大小为16X16,要确保全局工作节点各个维数能被工作组 对应维数整除; 步骤1-2 :利用OpenCL标准库函数clCreateContextFromTypeO创建设备上下文,并 用 clCreateCo_andQueue()创建命令队列; 步骤1-3 :利用OpenCL标准库函数clCreateBufferO创建场景模型缓冲区、视线交点 缓冲区、光子贴图缓冲区以及像素缓冲区,其中场景模型缓冲区为内核只读模式,视线交点 缓冲区、光子贴图缓冲区以及像素缓冲区为内核读写模式; 步骤1-4 :利用OpenCL标准库函数clCreateProgramWithSourceO加载视点光线跟 踪、光子跟踪和场景渲染文件,并用clBuildProgramO转化为内核可执行的程序文件; 步骤1-5 :创建声明基于OpenCL的视点光线跟踪内核函数; 步骤1-6 :创建声明基于OpenCL的光子跟踪内核函数; 步骤1-7 :创建声明基于OpenCL的场景渲染内核函数。
3. 根据权利要求1所述的基于OpenCL的并行化渐进式光子映射方法,其特征在于,步 骤2具体包括: 步骤2-1 :利用OpenCL标准库函数clSetKernelArgO将参数地址传入视点光线跟踪 内核函数,参数包括场景模型数据、像素矩阵和视线交点数据; 步骤2-2 :利用OpenCL标准库函数clEnqueueWriteBuffer (),将指令序列数据缓冲区 中视点光线跟踪所需要的场景模型数据和像素矩阵传递到GPU中; 步骤2-3 :利用OpenCL标准库函数clEnqueueNDRangeKernel ()激活视点光线跟踪内 核并其执行: 步骤2-3-1 :从视点经过像素点向场景发射光线; 步骤2-3-2 :计算光线与场景几何面片的交点; 步骤2-3-3:保存视线交点信息,包括交点位置,光线入射方向,像素权值及像素位置 等; 步骤2-3-4 :更新视线交点信息; 步骤2-4 :利用OpenCL标准库函数clFinishO等待命令队列中的所有命令执行完成, 并通过调用clEnqueueReadBufferO将OpenCL计算得到的视线交点数据传递到CPU内存。
4. 根据权利要求1所述的基于OpenCL的并行化渐进式光子映射方法,其特征在于,步 骤3具体包括: 步骤3-1 :利用OpenCL标准库函数clSetKernelArgO将参数地址传入光子跟踪内核 函数,参数包括场景模型数据和光子贴图; 步骤3-2 :利用OpenCL标准库函数clEnqueueWriteBuffer (),将指令序列数据缓冲区 中光子跟踪所需要的场景模型数据传递到GPU中; 步骤3-3 :利用OpenCL标准库函数clEnqueueNDRangeKernel ()激活光子跟踪内核并 其执行: 步骤3-3-1 :创建一个光子,包含如下信息:光子位置,光能量和面片索引; 步骤3-3-2:从光源发射光子; 步骤3-3-3 :跟踪光子路径; 步骤3-3-4 :如果光子与镜表面相交,转为步骤3 ; 步骤3-3-5 :如果光子遇到漫射表面,保存光子; 步骤3-3-6 :建立光子KD-Tree,并保存光子信息; 步骤3-4 :利用OpenCL标准库函数clFinishO等待命令队列中的所有命令执行完成, 并通过调用clEnqueueReadBufferO将OpenCL计算得到的光子贴图传递到CPU内存。
5. 根据权利要求1所述的基于OpenCL的并行化渐进式光子映射方法,其特征在于,步 骤4具体包括: 步骤4-1 :利用OpenCL标准库函数clSetKernelArgO将参数传入场景渲染内核函数, 参数包括视线交点数据、像素矩阵和光子贴图; 步骤4-2 :利用OpenCL标准库函数clEnqueueWriteBuffer (),将指令序列数据缓冲区 中场景渲染所需要的视线交点数据和光子贴图传递到GPU中; 步骤4-3 :利用OpenCL标准库函数clEnqueueNDRangeKernel ()激活场景渲染内核并 其执行: 步骤4-3-1 :以视线交点为圆心,查找指定半径内的光子数量; 步骤4-3-2 :通过式(1)计算视线交点处的辐射度:
其中为发射光子数量,β>为视点光线在交点处的入射方向,为光子入射方向, f;为BRDF函数,为光子ρ在χρ处心方向上的光通量; (1) ⑵ 步骤4-3-3 :通过视线交点处的辐射度确定交点对应像素的颜色值; 步骤4-4 :利用OpenCL标准库函数clFinishO等待命令队列中的所有命令执行完成, 并通过调用clEnqueueReadBufferO将OpenCL计算得到的像素矩阵颜色值传递到CPU内 存。
6. -种基于OpenCL的并行化渐进式光子映射装置,其特征在于,该装置包括:配置单 元、并行化单元和释放单元,其中, 所述配置单元,用于初始化OpenCL计算参数,包括:工作组的维数和大小信息,创建设 备上下文及指令队列,创建场景模型内存对象、视线交点内存对象、光子贴图内存对象以及 像素矩阵内存对象,加载视点光线跟踪、光子跟踪和场景渲染文件,声明视点光线跟踪内核 函数、光子跟踪内核函数以及场景渲染内核函数; 所述并行化单元,用于在GPU上利用OpenCL对视点光线跟踪、光子跟踪和场景渲染进 行并行计算,并把最终计算结果传给CPU ; 所述释放单元,用于利用OpenCL标准库函数clReleaseMemObject()来释放GPU中存 储的数据资源。
7. 根据权利要求6所述的装置,其特征在于,所述配置单元包括:设置工作组单元、创 建平台单元和加载内核单元,其中, 所述设置工作组单元,用于设置一个工作组大小为16X16,要确保全局工作节点各个 维数能被工作组对应维数整除; 所述创建平台单元,用于利用OpenCL标准库函数clCreateContextFromType ()创建设 备上下文,并用clCreateCommandQueueO创建命令队列; 所述加载内核单元,用于利用OpenCL库函数clCreateProgramWithSourceO加载视点 光线跟踪、光子跟踪和场景渲染文件,并用clBuildProgramO转化为内核可执行的程序文 件。
8. 根据权利要求6所述的装置,其特征在于,所述并行化单元包括:并行化视点光线跟 踪单元、并行化光子跟踪单元和并行化场景渲染单元,其中, 所述并行化视点光线跟踪单元,用于通过OpenCL标准库函数clSetKernelArgO 将参数地址传入视点光线跟踪内核函数,参数包括场景模型数据、像素矩阵和视线交 点数据,利用OpenCL库函数clEnqueueWriteBufferO,将指令序列数据缓冲区中视点 光线跟踪所需要的场景模型数据和像素矩阵传递到GPU中,通过OpenCL标准库函数 clEnqueueNDRangeKernel ()激活视点光线跟踪内核并其执行,视点光线内核中从视点通过 成像平面上的栅格点向场景发射光线,计算与场景几何面片的交点,保存并更新交点信息, 最后利用OpenCL标准库函数clFinishO等待命令队列中的所有命令执行完成,并通过调 用clEnqueueReadBufferO将OpenCL计算得到的视线交点数据传递到CPU内存; 所述并行化光子跟踪单元,用于通过OpenCL标准库函数clSetKernelArgO将参数 地址传入光子跟踪内核函数,参数包括场景模型数据和光子贴图,利用OpenCL标准库函数 clEnqueueWriteBufferO,将指令序列数据缓冲区中视点光线跟踪所需要的场景模型数据 传递到GPU中,通过OpenCL标准库函数clEnqueueNDRangeKernel ()激活光子跟踪内核并 其执行,光子跟踪内核中创建光子,从光源向场景发射光子并进行跟踪,被吸收的光子保存 在光子贴图中,最后利用OpenCL标准库函数clFinishO等待命令队列中的所有命令执行 完成,并通过调用clEnqueueReadBufferO将OpenCL计算得到的光子贴图传递到CPU内 存; 所述并行化场景渲染单元,用于通过OpenCL标准库函数clSetKernelArgO将参 数地址传入场景渲染内核函数,参数包括场景像素矩阵、视线交点数据和光子贴图,利 用OpenCL标准库函数clEnqueueWriteBufferO,将指令序列数据缓冲区中视点光线跟 踪所需要的像素矩阵、视线交点数据和光子贴图传递到GPU中,通过OpenCL标准库函数 clEnqueueNDRangeKernel ()激活场景渲染内核并其执行,场景渲染内核中对视点光线跟踪 中计算得到的交点进行查找,得到每个像素所对应的交点,以交点为圆心计算指定半径内 的光子数量,通过光子数量来计算交点处的辐射度,式(1)为求解辐射度。通过辐射度来确 定交点对应像素的颜色值,最后利用OpenCL标准库函数clFinishO等待命令队列中的所 有命令执行完成,并通过调用clEnqueueReadBuffer ()将OpenCL计算得到的像素矩阵颜色 值传递到CPU内存,
(1) ⑶ 其中,为发射光子数量,G为视点光线在交点处的入射方向,叫为光子入射方 向,fr为BRDF函数,么为光子p在xp处:^,方向上的光通量。
【文档编号】G06F9/38GK104090742SQ201410341679
【公开日】2014年10月8日 申请日期:2014年7月17日 优先权日:2014年7月17日
【发明者】贾庆轩, 扎西次仁, 李旭龙, 孙汉旭, 宋荆洲 申请人:北京邮电大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1