搜档网
当前位置:搜档网 › 基于GPU加速的光线跟踪渲染算法研究_陈昱

基于GPU加速的光线跟踪渲染算法研究_陈昱

基于GPU加速的光线跟踪渲染算法研究_陈昱
基于GPU加速的光线跟踪渲染算法研究_陈昱

1

引言

光线跟踪是一种基于物理的图形渲染算法,相比于实时流水线光栅化算法,更方便实现真实环境中的反射、折射、透明、阴影等全局光照效果。光线跟踪算法产生的画面真实感强,被广泛应用于电影后期制作等领域。

光线跟踪算法需要跟踪每一条光线,将其与场景中几何对象执行相交测试,计算量很大。因此,目前光线跟踪主要应用于离线渲染,在实时渲染中的应用还处于试验阶段。如果光线跟踪算法的性能可以达到实时交互,必然可以极大地提高该算法的应用领域,对计算机图形学相关应用(如游戏,电影等)将产生重大影响。

2

光线跟踪算法加速分析

为了提高光线跟踪算法的速度,一种思路是改进

算法(如研究提高求交计算的效率,采用加速结构减少求交的次数等),另一种则是从硬件体系出发。光线跟踪渲染中每条光线独立计算,十分适合并行体系结构。近年来,集成大量处理核心的G P U (图形处理器)在计算能力方面增长迅速,在特定类型计算中已远超

C P U [1]。光线跟踪算法理论上可以利用G P U 架构的数

据并行性获得较高的性能,利用G P U 实现光线跟踪的实时交互成为了一个新的思路。

本文采用N V I D I A 公司的C U D A 作为G P U 编程平台,采用B V H 作为加速结构,对三角形网格模型进行渲染,针对C U D A 体系结构进行了算法的重新设计与优化。实验结果表明10万三角形的场景在目前主流型号G P U 上算法已可以达到实时交互的性能,与

C P U 实现相比加速比达到5倍以上;与采用K d -t r e e

作为加速结构的实现相比[2,3],在同等复杂度的场景下性能更好。

3基于G P U 的光线跟踪渲染

3.1渲染算法流程

基于G P U 加速的光线跟踪渲染算法研究

江兰帆

(福州大学数学与计算机科学学院,福建福州350108)

摘要:分析了光线跟踪渲染算法在G P U 上实现的流程;设计了C U D A 平台上基于B V H 加速结构的光线跟踪渲

染引擎,针对C U D A 架构的特点重新设计了B V H 遍历算法和间接反射计算算法;并在四个场景和两种分辨率下针对

G P U 和C P U 实现进行了详细对比测试。通过分析实验结果,基于G P U 加速的光线跟踪算法在不同复杂度的场景下相比

其C P U 实现都有较高的性能提升。

关键词:G P U ;C U D A ;光线跟踪;B V H 中图分类号:T P 391

文献标识码:A

文章编号:1674-2109(2013)02-0083-06

收稿日期:2012-10-08

基金项目:福建省教育厅科技项目(项目编号:J B 09017)。作者简介:陈昱(1981-),男,汉族,讲师,主要研究方向:

并行计算与图形学方面。江兰帆(1981-),女,汉族,讲师,主要研究方向:操作系统与系统结构方面。

第32卷第2期

武夷学院学报

Vol.32No.22013年4月

JOURNAL OF WUYI UNIVERSITY

A P R .2013

武夷学院学报2013年第2期

渲染算法的流程和阶段如图1所示。整个渲染分成两个工作阶段:

图1基于G P U的光线跟踪渲染流程

1、C P U准备阶段是在C P U上运算完成的,负责读取场景数据和创建B V H。在得到这些数据之后,将其复制到显卡的显存中,供G P U渲染时使用。

2、G P U渲染阶段是通过C U D A的k e r n e l函数实现光线跟踪渲染算法,编译后运行于G P U上。首先从视平面的像素点向场景空间中投射光线,获取光线与场景中对象的最近碰撞点,利用B V H加速结构进行快速相交测试。接着判断该碰撞点是否处在阴影区域,如果不在则利用光照模型计算该位置的直接光照强度。如果考虑间接反射情况,则应继续跟踪光线,计算碰撞点的间接光照强度。将直接光照和间接光照叠加起来,即可计算出视平面的像素点的颜色值。在G P U中每一个线程计算一条光线方向,计算出像素颜色后写入O p e n G L P B O缓存区域,最终显示在窗口中。

3.2场景初始化

程序首先完成场景数据(包括对象,光源和照相机)的初始化。其中场景中的对象使用三角形网格(M e s h)进行描述,实现了从模型文件中读取顶点数据(坐标,颜色,法向量)和多边形定义。光源可在程序中设定其初始位置,类型采用点光源。照相机默认采用透视投影。光源和照相机位置在程序执行过程中可以动态改变。这些场景数据的数据量比较大而且要能供所有线程访问,因此只能通过C U D A A P I将其以数组的方式拷贝进G P U的全局内存或纹理内存,供G P U 渲染程序使用。

3.3生成光线

根据观察方向和视平面分辨率,可以计算得到每个像素的坐标;结合照相机位置,就可以得到从投影中心到每个像素的主光线的参数方程。在G P U中,每个线程计算一条光线在场景中的反射光强度,即像素的颜色值。每个线程块(B l o c k)分配的光线数用以下公式计算:(S I Z E X*S I Z E Y+T H R E A D S_P E R_B L O C K-1)/T H R E A D S_P E R_B L O C K。其中S I Z E X和S I Z E Y为屏幕窗口长宽方向上的像素数,T H R E A D S_P E R_B L O C K为C U D A中每个b l o c k的线程数。

3.4B V H的构建与遍历

在生成光线后,渲染程序需要将光线与场景进行相交检测,获取距离视点最近的物体交点。一种简单的做法是将光线与场景中的所有几何对象进行碰撞检测,通过比较获取最近的碰撞点。这种做法易于实现,但所需的计算量也是极为庞大,时间复杂性为O (N),N为场景中对象的数量,而使用B V H和K d-t r e e 等加速结构的时间复杂性为O(l o g N),判断效率提高明显[4]。

1、B V H的构建

B V H(层次包围盒)的基本思想是按照某一空间维度将原包围盒分成两部分,每部分再接着往下分,直到满足结束条件,其过程与二叉树类似。B V H中内部节点不包含三角形,但包含两个子节点的索引,而叶子节点包含一个三角形列表。创建过程是一个递归地划分包围盒的过程,每次包围盒划分位置的确定将影响B V H的生成结果,并影响整个加速结构的遍历性能。比较常用的方法是划分时采用表面积启发式(S u r f a c e A r e a H e u r i s t i c)代价模型,估算光线穿越包围盒的期望代价,求得近似最优解。

基于S A H评估的B V H创建过程如下[4]:

(1)将当前节点包围盒的最长轴的方向作为分割方向;

(2)将三角形列表按照包围盒的中心点在分割方向上的位置N等分,产生N-1种备选划分方式:左边1份,右边N-1份,…,左边N-1份,右边1份;

(3)对每种分割方式分别计算两部分包围盒的

·84·

表面积,再应用S A H代价模型估算当前划分方式的代价,选取代价最小的分割方式划分当前节点;

(4)以同样的方式递归生成孩子节点,一直到三角形数量小于设定的阈值为止,即可完成B V H的创建。

在C P U中完成B V H的构建后,将其数据结构拷贝到显存中,供G P U渲染程序用于遍历。

2、G P U中遍历B V H进行相交测试的实现

B V H的遍历是一个深度优先的递归过程。从根节点开始,光线与节点的包围盒进行相交测试。如果没有相交,返回。如果相交,将光线与该节点的两个子节点进行相交测试;或者该节点是叶子节点,则与该节点的三角形列表逐一进行相交测试。

在C U D A平台上实现B V H遍历的问题是,C U D A 前期的架构版本(G80/G T200)是不支持递归函数调用的,所以为了实现更好的G P U兼容性,需将B V H遍历修改为非递归算法,将原本指向节点的指针用节点索引替代,并引入堆栈保存节点列表。算法如下:

初始化节点列表为空,将根节点添加到节点列表中

初始化当前相交的最近距离为无限远:m i n_t=I N-F I N I T Y

W h i l e节点列表不为空

将节点列表中的栈顶节点出栈,置为当前节点

I f光线与当前节点的包围盒相交

A n d光线与包围盒的进入交点b o x_t m i n

I f当前节点是叶子节点

遍历当前节点中的三角形,对于每个三角形

I f光线与三角形相交A n d相交距离c u r r e n t_t

m i n_t=c u r r e n t_t

记录信息

E n d I f

E n d遍历

E l s e

将当前节点的两个孩子节点根据分割轴的方向,远的先入节点列表,近的后入节点列表

E n d I f

E n d I f E n d W h i l e

3.5阴影计算

当确定光线和场景中三角形的最近交点后,下一步需计算交点处的反射光强度(即颜色值)。首先要判断的就是在交点和光源之间是否有物体遮挡,如有遮挡则光源对该像素点的颜色无直接贡献;否则在计算像素颜色时需要考虑该光源的贡献。当确定光线和场景中三角形的最近交点后,可以在光源与交点之间生成阴影检测光线,并利用3.4节中基于B V H的相交测试算法进行遮挡测试。

3.6光照模型计算

为了计算光线所对应的像素颜色(即交点处反射向视点的光线颜色),在交点处可以使用常用的B l i n n-P h o n g光照模型公式[5]计算其在每个光源下的反射光颜色并叠加:

I=I a+I d+I s

=L a K a+

l i g h t s o u r c e

Σ(L d K d m a x(l·n,0)+L s K s m a x((n·h),0)β)

C U

D A支持f l o a t4数据类型,十分方便进行上述公式中向量的计算。其中镜面反射分量计算时需要交点处的法向量n,通过三角形三个顶点处的法向量(从模型文件中读取)结合交点处的质心坐标(B a r y c e n t r i c C o o r d i n a t e s)插值计算得到,实现P h o n g插值着色,这样计算得到的物体表面的反射光颜色过渡较为自然。

3.7间接反射计算

在光线跟踪渲染中,光线与场景第一次相交后通常还需计算间接反射情况。像素的颜色除了包含光源的反射光颜色之外,还需其他表面产生的间接反射光颜色。光线每反射一次便需计算一次交点处的颜色值,这样经过多次反射后,像素点最终色彩便是多个间接反射颜色的累加。

上述间接反射过程是一个递归的计算,实现中为了函数在有限时间内返回,需定义递归的深度(即跟踪的反射次数),可以表示成以下的伪代码:

C o l o r R a y T r a c e(i n t d e p t h,V e c t o r3r a y,V e c t o r o r i g i n...){

i f(d e p t h>M A X_D E P T H)

r e t u r n B L A C K;//返回背景色

....

//利用传入的光线参数查找最近相交点i n t e r s e c-

陈昱江兰帆:基于G P U加速的光线跟踪渲染算法研究·85·

武夷学院学报2013年第2期

t i o n P o i n t

//计算交点处光照模型下的颜色值.p h o n g C o l o r

//计算反射光线r e f l e c t i o n R a y

....

r e t u r n p h o n g C o l o r+R a y T r a c e(d e p t h+1,r e f l e c t i o n-R a y,i n t e r s e c t i o n P o i n t);

}

上述光线跟踪的递归算法十分简洁,但为了在C U D A上实现上述算法,必须进行非递归模式的改写。由于R a y T r a c e函数中变量众多,如果用3.4节中添加堆栈的方式改写该算法,代码的改写量大、改写后可读性差。因此,本文利用C++的模板元编程(T e m p l a t e M e t a P r o g r a m m i n g,T M P)技术解决这个问题。所谓模板元编程,是C++将计算从运行期转移至编译期、由编译器在编译期执行部分计算的技术统称[6],利用其中的“递归模板实例化”技术可以实现编译期递归结构。

在原递归函数声明前加上t e m p l a t e定义递归深度d e p t h作为模板元参数,得到如下的模板主函数:

t e m p l a t e

C o l o r R a y T r a c e(V e c t o r3r a y,V e c t o r3o r i g i n,...){

....

//利用传入的光线参数查找最近相交点i n t e r s e c-t i o n P o i n t

//计算交点处光照模型下的颜色值.p h o n g C o l o r

//计算反射光线r e f l e c t i o n R a y

...

r e t u r n c o l o r+R a y T r a c e(r e f l e c t i o n R a y,i n-t e r s e c t i o n P o i n t);

}

再定义如下形式的完全特化(S p e c i a l i z a t i o n)后的模板函数,其中的递归深度被预先定义的常量M A X_D E P T H(比如4)特化了,从而得到递归结束时的函数如下:

t e m p l a t e<>

C o l o r R a y T r a c e

D

E P T H>(V e c t o r3r a y,V e c t o r3 o r i g i n,...){

r e t u r n B L A C K;//这里结束了递归}

在编译过程中,编译器会分析d e p t h在执行过程中可能的值的情况,根据函数模板生成d e p t h值不同时的函数版本,即生成从R a y T r a c e<0>(这是主光线时的情况)到R a y T r a c e的执行代码。

从上述代码片段可以发现其对原算法的代码改变是很小的,并且克服了C U D A无法编写递归函数的问题。当然,元编程也有其缺点,比如编译时间变长,执行文件变大,不宜调试等。

4实验结果及分析

实验采用不同顶点数和多边形数的场景对上述渲染算法的G P U和C P U实现进行性能测试,测试过程中设定一个点光源,视点位置绕固定轴旋转一周,记录下渲染360帧(即旋转360度)所需时间后求每秒平均帧数(F P S)。测试平台软硬件配置如下:*C P U:A M D A t h l o n I I X2255 3.1G H,双核心

*G P U:N V I D I A G e F o r c e G T S450,192个流处理单元

*C U D A T o o l k i t:版本4.2.9

测试场景分别为两个3D S模型文件(C h e s s和G u n d a m),两个S t a n f o r d提供的P L Y模型(H o r s e和A r m a d i l l o),渲染结果如下:

图2测试渲染场景

·86·

4.1G P U线程配置测试

在C U D A中,k e r n e l函数执行的性能受到底层硬件配置和软件配置的影响,从软件层面的优化来说,很主要的是合理配置其线程参数,以便达到较好的处理器利用率。C U D A中的线程以两层结构的形式组织管理,即网格(G r i d)包含多个线程块(B l o c k),线程块包含多个线程(T h r e a d)。如果每个块的线程数太少,无法充分利用多核心的处理能力,也无法通过调度隐藏访问显存的延时。如果一个块的线程数太多,由于在一个多核流处理器(S t r e a m i n g M u l t i p r o c e s s o r,S M)上同时执行的线程数受到寄存器数量、共享内存数量等硬件资源限制,又会使得许多线程处于等待状态,无法并行执行[7]。

对线程块包含不同线程数时的C h e s s场景渲染测试的结果如图3所示:

图3线程块包含不同线程数时的性能对比

图3测试结果表明,对上述光线跟踪算法G P U 实现在测试平台上的最佳数配置是每个线程块包含128个线程。这与光线跟踪的k e r n e l函数需要的寄存器数量比较多有关系,更多的并发线程所需的寄存器数量无法在硬件上得到满足。

4.2G P U和C P U渲染对比测试

对上述光线跟踪渲染器的G P U和C P U实现进行性能测试,其中G P U测试采用每块128线程配置下的测试结果;C P U也是用B V H加速结构,并且采用O p e n M P实现多线程并行计算,以利用C P U的多个核心。测试结果见表1。

从表1可以看出,G P U实现的渲染引擎可以在512x512分辨率下对10万个三角形以内的场景实现大于15f p s的渲染速度,相比C P U的实现(使用O p e n M P优化)有5倍以上的性能提升。渲染速度与场景的构成(顶点数量,三角形数量)、模型表面多反射的发生数量以及渲染的视角都有关系。总的来说,顶点数量和三角形数量少的场景渲染速度较快,物体表面相互反射较少时速度较快,物体占据画面的面积较小时速度较快(空白背景的像素光线直接穿越,B V H 可以快速判断此情况)。

5总结

本文在基于B V H加速结构的光线跟踪算法基础上,根据C U D A平台的特点重新对渲染算法进行了设计与优化,在G P U上实现了具有实时性的光线跟踪算法。测试结果表明,主流G P U在512x512分辨率下,10万个三角形以内的场景可以达到超过15f p s的渲染速度,可实现实时交互;与采用K d-t r e e作为加速结构的实现相比[2,3],在同等复杂度的场景下性能更好。

经过实验,也发现G P U在实现光线跟踪渲染上的不足之处。由于光线跟踪渲染算法代码复杂,编译后线程所需的寄存器数量较多,限制了可同时并发的线程数量[8];虽然程序使用了C U D A手册中的多种优化技巧,但渲染更高的分辨率和更复杂的场景仍需要性能更强大的G P U才有希望实现实时性。

表1各场景在不同分辨率下的渲染性能测试结果

场景顶点数三角形数

G P U测试结果(f p s)C P U测试结果(f p s)

512x5121024x1024512x5121024x1024

Ch e s s147662826429.9610.675.491.37

G u n d a m90491797616.81 6.182.250.64

H o r s e484859696619.53 6.632.550.67

A r m a d i l l o1729743459448.522.831.460.39

陈昱江兰帆:基于G P U加速的光线跟踪渲染算法研究·87·

武夷学院学报2013年第2期

R e s e a r c h o n R a y T r a c i n g R e n d e r i n g A l g o r i t h m

B a s e d o n G P U A c c e l e r a t e d

C H E N Y u

J I A N G L a n f a n

(S c h o o l o f M a t h e m a t i c s a n d C o m p u t e r S c i e n c e ,F u z h o u U n i v e r s i t y ,F u z h o u ,F u j i a n 350108)

A b s t r a c t :T h i s

p a p e r a n a l y z e s t h e p r o c e s s o f r a y t r a c i n g r e n d e r i n g a l g o r i t h m b a s e d o n G P U i m p l e m e n t a t i o n .I t d e s i g n s t h e C U D A -

b a s e d r e n d e r i n g e n g i n e u s i n g B V H a

c c e l e r a t i o n s t r u c t u r e.A c c o r

d i n g t o t h

e

f e a t u r e s o f C U D A a r c h i t e c t u r e ,i t r e d e s i

g n s t

h e B V H t r a v e r s

i n g a n d i n d i r e c t r e f l e c t i o n c a l c u l a t i o n a l g o r i t h m .F i n a l l y ,i t t e s t s t h e i m p l e m e n t a t i o n s o n G P U a n d C P U u n d e r f o u r s c e n e s a n d t w o k i n d s o f r e s o l u t i o n .T h r o u g h t h e a n a l y s i s o f e x p e r i m e n t a l r e s u l t s ,r a y t r a c i n g a l g o r i t h m b a s e d o n G P U h a s s i g n i f i c a n t p e r f o r m a n c e i m p r o v e m e n t i n d i f f e r e n t c o m p l e x i t y s c e n e.

K e y w o r d s :G P U ;

C U

D A ;r a y t r a c i n g ;B V H

参考文献:

[1]

吴恩华,柳有权.基于图形处理器(G P U )的通用计算[J ].计算机辅助设计与图形学学报,2004,16(5):601-612.

[2]陆建勇,曹雪虹,焦良葆等.基于G P U 交互式光线跟踪算法的设计与实现[J ].南京工程学院学报(自然科学版),2009,7

(3):61-67.[3]

曹家音.基于K D -T r e e 遍历的并行光线跟踪加速算法[J ].科技传播,2010,(17):233-233,224.

[4]M a t t P h a r r ,G r e g H u m p h r e y s.P h y s i c a l l y B a s e d R e n d e r i n g ,S e c o n d E d i t i o n :F r o m T h e o r y T o I m p l e m e n t a t i o n [M ].M o r g a n K a u f m a n n ,2010.217-222.

[5]E d w a r d A n g e l 著,张荣华等译.交互式计算机图形学—基于O p e n G L 的自顶向下方法(第五版)[M ].北京:电子工业出版

社,2009.222-226.

[6]D a v i d A b r a h a m s ,A l e k s e y G u r t o v o y 著,荣耀译.C ++模板元编

程[M ].北京:机械工业出版社,2010.

[7]D a v i d B .K i r k ,W e b -m e i W .H w u 著,陈曙晖等译.大规模并

行处理器编程实践[M ].北京:清华大学出版社,2010.59-

60.[8]

N V I D I A .C U D A

C

B E S T P R A

C T I C E S G U I

D E

v 4.2[Z ].

N V I D I A C o r p o r a t i o n ,2012.48-53.

·88·

光线跟踪讲解及源代码

计算机图形学期末作业 作业题目:Ray Tracing算法的实现 姓名:李海广 学号:S130201036 任课教师:秦红星

摘要 Ray Tracing算法又叫光线跟踪算法,它能通过递归方法逐个计算每个像素点的光强,然后就可以绘制出高度真实感的图像,因此该方法在图形学领域得到了广泛的应用。Ray Tracing算法的思想还能应用到移动通信终端定位领域,该领域里的射线跟踪法与此算法思想类似。MFC是微软公司提供的一个类库,以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。MFC在处理Windows窗口应用程序方面具有很大的优势,因此,本文使用MFC在VC6.0里实现Ray Tracing算法,并给出了该算法的详细讲解。 【关键词】Ray tracing 光线跟踪递归像素光强 MFC C++

目录 1.Ray Tracing算法概述 (1) 1.1Ray Tracing算法简介 (1) 1.2Ray Tracing算法的实现原理 (1) 2.Ray Tracing算法的具体实现 (2) 2.1算法的实现环境 (2) 2.2实现算法的C++程序简介 (2) 2.3算法的具体实现过程 (3) 2.4 程序运行结果 (11) 3.总结 (11) 3.1 通过该算法学到的东西 (11) 3.2本程序未完成的任务 (12) 4.参考文献 (12)

1.Ray Tracing算法概述 1.1Ray Tracing算法简介 光线跟踪(Ray tracing),又称为光迹追踪或光线追迹,它是来自于几何光学的一项通用技术,它通过跟踪与光学表面发生交互作用的光线从而得到光线经过路径的模型。它用于光学系统设计,如照相机镜头、显微镜、望远镜以及双目镜等。这个术语也用于表示三维计算机图形学中的特殊渲染算法,跟踪从眼睛发出的光线而不是光源发出的光线,通过这样一项技术将具有一定数学模型的场景显现出来。这样得到的结果类似于光线投射与扫描线渲染方法的结果,但是这种方法有更好的光学效果,例如对于反射与折射有更准确的模拟效果,并且效率非常高,所以在追求高质量结果时我们经常使用这种方法。 在光线跟踪的过程中,我们要考虑许多因素。要跟踪的光线包括反射光线、散射光线和镜面反射光线,利用递归方法并且设定一定的阀值来跟踪;在计算光强度时,我们要考虑场景中物体的反射系数、漫反射系数和镜面反射系数,还有交点处的法向量,出射光线的方向向量;在求视线以及反射光线和场景中物体的交点时,要计算出离眼睛以及出射点最近的交点作为击中点,得到击中点之后,我们就可以计算出击中点的坐标。最终,通过三个公式计算出每一个像素点处三种光线的光强值,再将三个光强值相加,就得到了该像素点出的总光强值,最后将颜色缓冲器中的三种颜色值输出到屏幕上,就得到了我们需要的光线跟踪图像。 1.2Ray Tracing算法的实现原理 (1)对图像中的每一个像素,创建从视点射向该像素的光线; (2)初始化最近时间T为一个很大的值,离视点最近的物体指针设为空值; (3)对场景中的每一个物体,如果从视点出发的光线和物体相交,且交点处的时间t比最近时间T小,则将t的值赋给最近时间T,并设置该物体为最近物体,将物体指针指向该物体; (4)经过第三步的计算后,如果最近物体指针指向空值NULL,则用背景色填充该像素。如果该指针指向光源,则用光源的颜色填充该像素;

光线投射,光线追踪与路径追踪的概念与区别

光线投射,光线追踪与路径追踪的概念与区别 光线投射Ray Casting [1968] 光线投射(Ray Casting),作为光线追踪算法中的第一步,其理念起源于1968年,由Arthur Appel在一篇名为《Some techniques for shading machine rendering of solids》的文章中提出。其具体思路是从每一个像素射出一条射线,然后找到最接近的物体挡住射线的路径,而视平面上每个像素的颜色取决于从可见光表面产生的亮度。 光线投射:每像素从眼睛投射射线到场景 光线追踪Ray Tracing [1979] 1979年,Turner Whitted在光线投射的基础上,加入光与物体表面的交互,让光线在物体表面沿着反射,折射以及散射方式上继续传播,直到与光源相交。这一方法后来也被称为经典光线跟踪方法、递归式光线追踪(Recursive Ray Tracing)方法,或Whitted-style 光线跟踪方法。 光线追踪方法主要思想是从视点向成像平面上的像素发射光线,找到与该光线相交的最近物体的交点,如果该点处的表面是散射面,则计算光源直接照射该点产生的颜色;如果该点处表面是镜面或折射面,则继续向反射或折射方向跟踪另一条光线,如此递归下去,直到光线逃逸出场景或达到设定的最大递归深度。 经典的光线追踪:每像素从眼睛投射射线到场景,并追踪次级光线((shadow, reflection, refraction),并结合递归 光线追踪(Ray tracing)是三维计算机图形学中的特殊渲染算法,跟踪从眼睛发出的光线而不是光源发出的光线,通过这样一项技术生成编排好的场景的数学模型显现出来。这样得到的结果类似于光线投射与扫描线渲染方法的结果,但是这种方法有更好的光学效果,例如对于反射与折射有更准确的模拟效果,并且效率非常高,所以当追求高质量的效果时经常使用这种方法。

光线跟踪算法思想

光线跟踪算法思想 一、概述 本试验完成了基本光线跟踪、高级光线跟踪(反射、折射、透明、阴影)、光线跟踪加速算法等三个与光线跟踪有关的内容。 二、算法简述 1.面片求交 面片求交采用了先求交后判断的方法。现将光线的方程代入平面方程中求出交点。然后将该面片与交点都投影到同一个平面中如XOY平面。投影时需要判断投影结果是否会退化为一条直线,如果发生这种情况则要投影到另一平面内。 投影后,将交点坐标代入到面的边线方程中(要保证线的方向一致),并判断符号,如果符号始终相同,则表示点在面内。 2.球体求交 球体求交也采用了将光线方程代入球体方程的方式。如果方程无解表示没有交点。如果有两个大于0的解,则取较小的一个;如果一个大于0,一个小于0的解,则取大于零的解。 如果没有大于零的解则仍判定为不相交。 3.光线跟踪算法 设定视点和画布 for 画布上的每一行 { for 每一行上的每个像素 { 生成一条从视点到像素点的光线ray LT[i,j] = ray.RayTrace(物体数组,光源数组,1) } } //计算光线与物体的交点,并计算光强 V oid RayTrace(物体数组,光源数组,递归深度) { for 每个物体 { 计算光线与该物体的交点 if 光线起点到交点的距离小于已记录的最短距离且大于0 { 将最短距离设置为该距离

在这条光线对象中记录交点坐标,平面法向量,透明度,物体序号等 } } 对于距光线起点最近的那个点,执行 ComputeIntensity(物体数组,交点数组序号,光源数组,递归深度) } V oid ComputeIntensity(物体数组,交点数组序号,光源数组,递归深度) { 给物体加上环境光强 for (每个光源) { 生成一条从光源指向交点的光线 判断该光线是否与其他不透明的物体相交 if (不相交) 将该光线光强乘以满反射系数和镜面反射系数加到被跟踪光线的光强中 } if (递归深度< 设定深度) { if (需要反射) { 生成一条以交点为起点的反射光线reflectRay reflectRay.RayTrace(物体数组,光源数组,递归深度+1) 将reflectRay的光强与镜面反射系数相乘,加到原被跟踪光线光强中} if (需要折射) { 生成一条以交点为起点的折射光线refractRay refractRay.RayTrace(物体数组,光源数组,递归深度+1) 将refractRay的光强与透明系数相乘,加到原被跟踪光线光强中} } } 4.光线跟踪加速算法(层次包围球) 本作业选择了包围球而不是包围和来实现加速。这是基于光线与包围球求交比与包围盒求交速度快的考虑。虽然包围盒比包围球能更紧密地包围住物体,但与包围盒求交时需要处理所有可见面片并且对求出的交点还要判断是否在面片内,这样,当物体数量较少时反而起不到加速的作用。因此我觉得包围盒更适合于规模很大的光线跟踪计算。

光线跟踪算法

光线跟踪算法的研究与进展 刘进 摘要:光线跟踪算法是图形绘制技术中的经典算法,但是该算法光线与物体的求交量庞大,严重制约着应用。本文从经典的光线跟踪算法出发,研究了目前光线跟踪算法的国内外研究状况,具体从改进的光线跟踪算法和光线跟踪算法的加速技术,并进行了对比和分析。最后对近几年的光线跟踪方法发展进行了总结,对未来研究热点及应用前景进行了展望。 关键词:可视化;光线跟踪算法;并行绘制;GPU Research Status and Prospect for ray tracing algorithms Abstract: As an classic algorithms of volume rendering in computer graphics, ray tracing algorithms is hindered by the huge computation cost in ray and volume. This paper summarizes the research status in ray tracing technology from the two main solutions: different extended ray tracing algorithms and the acceleration techniques in ray tracing algorithms. Comparison and analysis the different performance. Both current research focus and the future research prospect are also discussed in recent years. Key words: visualization; ray tracing algorithms; parallel rendering; GPU 引言 随着科学技术和计算机高速发展,人类已经进入到一个科技支撑的时代,在我们的生活中到处充满了高科技产品和技术,给我们的生活带来了改变和方便,其中计算机图形学的应用已经渗透到了各个工程技术领域,其已经成为计算机科学的重要学科之一,具有相当的重要性和无可替代的作用。计算机图形学自诞生以来得到了飞速发展,其通过计算机的输入设备、显示设备及绘制设备等对图形的表示、绘制、存储、显示等相关理论知识、算法技术进行研究的一门学科。真实感图形绘制是计算机图形学的主要研究内容之一,在虚拟现实、文物保护、影视游戏、三维动画、医学研究、建筑设计和系统仿真等领域中得到广泛应用,它追求对场景的逼真渲染[1]。其中逼真的图形绘制技术是最为活跃的研究领域之一。 光线跟踪算法是真实感图形绘制技术的主要算法之一,其原理简单,能够有效生成具有比较真实视观效果的各种各样的场景。该算法可通过一些光照明模型模拟在光源或环境光照射下物体表面发生的多种光照效果,例如漫反射、高光、镜面映像、场景消隐及阴影等。在计算机中对现实场景或是虚拟场景进行显示,除了要构建场景图形外,还要将场景中的各种光照效果模拟出来,这样生成的场景才能更逼真,光线跟踪算法就是既在几何上相似,也能模拟出大部分的光照效果的生成真实感图形的方法。光线跟踪算法是逆着真实光线的投射方向进行反向跟踪的,从视点向场景发射光线,光线与场景中的物体相交,计算光分量,因为视点向场景的光线较多,因而该算法光线与物体的求交量较大,但是因为其对场景的模拟的逼真,及其可以模拟漫反射、镜面反射、反射折射以及阴影等光照效果[1-2]。 进入90年代,随着计算机技术的发展,光线跟踪技术广泛应用于三维特技电影、电视广告、电子游戏的制作中,其应用领域也正在向如物理、化学、生物等其他学科领域渗透,其应用的范围正不断扩大,很多基于光线跟踪算法的新理论也应运而生,物理学中的相对论、地理中地层的绘图等与光线跟踪算法相结合的研究已经实现,极大的推动其学科的发展。可

光线追踪的应用及发展趋势

课程论文 课程论文题目:光线追踪的应用及未来发展 学院:人民武装学院 专业:计算机科学与技术 班级:物联人151 学号: 1500860346 学生姓名:谭朝艳 指导教师:宁阳 2016 年6 月3 日

目录 摘要 ............................................................... II 第一章绪论 . (1) 1.1 光线追踪的定义 (1) 1.2 光线追踪的原理 (1) 1.2.1 自然现象 (1) 1.2.2 光线追踪的原理 (1) 1.3 光线追踪的特点 (3) 1.3.1 光线追踪的优点 (3) 1.3.2 光线追踪的缺点 (3) 第二章光线追踪的应用 (4) 2.1 光线追踪在图形渲染中的应用 (4) 2.2 光线追踪在物理学中的应用 (4) 2.3 光线追踪在实际应用 (4) 2.4 实时跟踪 (4) 第三章光线追踪的未来发展趋势 (6) 3.1 光线追踪VS光栅化 (6) 3.2 显卡何时才能实时光线追踪 (7) 3.3 光线追踪的未来发展 (8)

光线追踪的应用及未来发展 摘要 光线跟踪是一种真实地显示物体的方法,该方法由Appe在1968年提出。光线跟踪方法沿着到达视点的光线的反方向跟踪,经过屏幕上每一个象素,找出与视线相交的物体表面点P0,并继续跟踪,找出影响P0点光强的所有光源,从而算出P0点上精确的光线强度,在材质编辑中经常用来表现镜面效果。光线跟踪或称光迹追踪是计算机图形学的核心算法之一。在算法中,光线从光源被抛射出来,当他们经过物体表面的时候,对他们应用种种符合物理光学定律的变换。最终,光线进入虚拟的摄像机底片中,图片被生成出来。 关键字:光线跟踪(Ray tracing),真实感

光线追踪实验报告

Ray Tracer---光线跟踪实验报告 711064XX XXX 一、实验目的 在计算机图形学课程作业中,题目要求是做Ray Tracing 或碰撞检测,其中对Ray Tracing 的要求是: (1)多种形状物体,Ball, box等 (2)包含多种材质物体:纯镜面反射、透明物体、纯漫反射、半透明物体等 (3)Moving in a 3D world (4)environment texture 二、实验原理 在这次实验中,使用了真正的光线跟踪算法,而不是采用环境纹理来反映周围环境。 1、光线跟踪简介 光线跟踪是一种真实地显示物体的方法,该方法由Appel在1968年提出为了 生成在三维计算机图形环境中的可见图像,光线跟踪是一个比光线投射或者 扫描线渲染更加逼真的实现方法。这种方法通过逆向跟踪与假象的照相机镜 头相交的光路进行工作,由于大量的类似光线横穿场景,所以从照相机角度 看到的场景可见信息以及软件特定的光照条件,就可以构建起来。当光线与 场景中的物体或者媒介相交的时候计算光线的反射、折射以及吸收。由于一 个光源发射出的光线的绝大部分不会在观察者看到的光线中占很大比例,这 些光线大部分经过多次反射逐渐消失或者至无限小,所以对于构建可见信息 来说,逆向跟踪光线要比真实地模拟光线相互作用的效率要高很多倍。计算 机模拟程序从光源发出的光线开始查询与观察点相交的光线从执行与获得正 确的图像来说是不现实的。 2

由以上经典的光线追踪算法可以发现,在此算法中,环境中的物体等模型,并不是 一次性的画好的,而是对整个场景一个像素一个像素的画上去的,光线跟踪算法中 的每一根光线要与场景中的每一个物体所含的每一个面求交。 三、光线跟踪算法实现 1、计算观察光线 首先需要确定光线的数学表达式。一条光线实际上只是一个起点和一个传播方向, 假设起点为O(x1,y1,z1),屏幕上一点为D(x2,y2,z2),则光线的方向dir(x3,y3,z3)为: dir=O–D; 即 在程序中,光线的起点定义为: 方向为: 由此可以确定一条光线

在光线跟踪算法的递归过程中

在光线跟踪算法的递归过程中,加速算法有哪几种?说明他们分别使用与哪些场合光线跟踪的基本原理 由光源发出的光到达物体表面后,产生反射和折射,简单光照明模型和光透射模型模拟了这两种现象。在简单光照明模型中,反射被分为理想漫反射和镜面反射光,在简单光透射模型把透射光分为理想漫透射光和规则透射光。由光源发出的光称为直接光,物体对直接光的反射或折射称为直接反射和直接折射,相对的,把物体表面间对光的反射和折射称为间接光,间接反射,间接折射。这些是光线在物体之间的传播方式,是光线跟踪算法的基础。 最基本的光线跟踪算法是跟踪镜面反射和折射。从光源发出的光遇到物体的表面,发生反射和折射,光就改变方向,沿着反射方向和折射方向继续前进,直到遇到新的物体。但是光源发出光线,经反射与折射,只有很少部分可以进入人的眼睛。因此实际光线跟踪算法的跟踪方向与光传播的方向是相反的,而是视线跟踪。由视点与象素(x,y) 发出一根射线,与第一个物体相交后,在其反射与折射方向上进行跟踪,如图4. 6.1所示。 图4.6.1 基本光线跟踪光路示意

为了详细介绍光线跟踪算法,我们先给出四种射线的定义与光强的计算方法。在光线跟踪算法中,我们有如下的四种光线:视线是由视点与象素 (x,y)发出的射线;阴影测试线是物体表面上点与光源的连线;以及反射光线与折射光线。当光线V与物体表面交于点P时,点P分为三部分,把这三部分光强相加,就是该条光线V在P点处的总的光强: a) 由光源产生的直接的光线照射光强,是交点处的局部光强,可以由下式计算: b) 反射方向上由其它物体引起的间接光照光强,由 I s K s'计算,I s通过对反射光线的递归跟踪得到 c) 折射方向上由其它物体引起的间接光照光强,由I t K t'计算,I t通过对折射光线的递归跟踪得到。 在有了上面介绍的这些基础之后,我们来讨论光线跟踪算法本身。我们将对一个由两个透明球和一个非透明物体组成的场景进行光线跟踪(图4.6.2)通过这个例子,可以把光线跟踪的基本过程解释清楚。

光线追踪算法的GPU加速算法(学习版)

加速构建KD树的方法 (声明:本文仅为笔者的相关整理和理解) 摘要:光线追踪算法是用来生成照片逼真的渲染效果最有前途的算法之一。然而,算法的计算开销使算法远达不到实时显示效果。许多学者提出了不同的改进,不断加速光线追踪算法。在本文中,我们将介绍一些的改进方法的关键步骤,例如GPU构建kd树,和专用硬件加速引擎。 关键词:KD树光线追踪 GPU 硬件 A Method Of Accelerating The Construction Of KD-Tree Abstract: The ray tracing algorithm is one of the most promising algorithms, which is used to generate photo realistic rendering effects. However, the expense cost of computing puts the real time ray tracing far from reaching. Many scientists come up with different improvements to stand closer to, real time ray tracing, the terminal goal. In this paper, we will introduce some key points of certain outstanding improvements, such as, constructing the KD tree on GPU, and dedicated hardware acceleration engine. Key words: KD Tree ray tracing GPU hardware 一、简介 光线追踪算法在真实感填充方面的效果非常出色,考虑了不同方向反射光线与折射光线对空间特定点亮度的影响,通过多次的迭代达到真实的效果。然而多次迭代跟踪反射光线与折射光线带来的结果就是三维空间中要进行大量的求交点运算,特别现在提倡的高清的时代,在2560*1440的区域上进行光线追踪算法,每秒几乎要发射出20亿条光线。有学者提出区域分割、八叉树、KD树等方法来快速计算光线与物体表面交点。区域分割是将整个空间划分成为相等大小的子区域,如果某个子区域内有实体,就标记该区域为有实体。八叉树是在空间划分上进行的一个改进,空间不是被等分,而是将实体使用大小不同的正方体来表示实体,算法中大小相邻的正方形空间之间大小比例是8:1。KD树可以看作是八叉树的一种改进,KD在划分子空间的时候总是选取散度最大的坐标轴方向,使得空间划分更有效。所以KD树是使用最广泛,并被认为是最有前景的方法。在加速构建KD树的领域,研究人员也做出了许多探索,部分小组成功的把构建KD树的算法移植到4核的CPU上运行。所以在并行计算能力非常强大的GPU上实现KD树构建算法成了很热的一个方向,与此同时,部分研究人员把目光转向专用硬件芯片FPGA,并取得了很好的成绩。 本文的结构是这样安排的:我们在第二本分介绍传统的序列SAH KD树的构建方法;在随后的第三部分介绍并行化计算SAH代价和排序的算法;在第四部分介绍现已有的硬件专用芯片;第五部分是实验结果的展示;最后是对本文的总结。

相关主题