资源描述
摘要
随着图形处理器性能的提高、可编程特性的发展,及可编程硬件高级语言(如CG语言)的发展,人们开始将图形处理流水线的某些处理阶段和图形算法逐渐从CPU向GPU 转移。
光线跟踪算法是一种经典的真实感绘制算法,它利用光路可逆原理,通过追踪光线,能很好地渲染真实世界。本论文介绍了可编程图形硬件基础,分析了基于GPU 的光线跟踪技术的实现原理。设计的6 个实验场景所包含的三角形面片数,从2016 个到60960 个成复杂度递增;在3 种不同分辨率下,分别实现GPU 和CPU 的光线跟踪绘制。对实验结果比较、分析后,得到了GPU 加速的光线跟踪技术的特点。
关键词 CG;openGL;光线跟踪;图形处理器
ABSTRACT
With the improvement of the performance, the characteristics of programmable on graphics processor, and the high-level programmable hardware language (such as C for Graphics), people began to deal with the certain stage of graphics processing and graphics algorithm gradually translating to GPU from GPU.
Ray tracing algorithm which is one of the classic photorealistic rendering algorithm, uses optical reversible principle, by tracing light, can render the real world well. This paper introduces the basis of the programmable graphics hardware, and analysis the achievement of principle with the Ray tracing technology based on the GPU.The number of triangles drawed in the six scenes, increase complexitily from 2,016 to 60,960.Achieve the ray tracing map algorithm based on the CPU and GPU ,respectively, in three different resolutions.The characteristics of ray tracing technology based on GPU-accelerated will be got, after the comparison and analysis of the results.
Keyword CG;openGL;Ray tracing algorithm;GPU
目录
摘要 I
ABSTRACT II
第一章 绪论 1
1.1背景 1
1.1.1 计算机图形学的发展和应用 1
1.1.2 图形处理器(GPU)的现状和地位 2
1.1.3 图形及硬件编程语言 3
1.2 课题主要研究的内容 4
第二章 光照 6
2.1 光照模型 6
2.1.1 放射光 6
2.1.2 环境光 7
2.1.3 漫反色和Lambert模型 7
2.1.4 镜面反色和Phong模型 9
2.1.5 简单局部光照模型 10
2.2 插值算法 10
2.3 光线跟踪 11
第三章 CPU下的光线跟踪算法实现 13
3.1 openGL基础知识 13
3.1.1 openGL工作流程 13
3.1.2 openGL数据类型和函数名 14
3.1.3 openGL描述图元 15
3.2 算法中的变换实现 16
3.2.1 几何变换 16
3.2.2 投影变换 17
3.2.3 视口变换 18
3.2.4 视景转换 18
3.3 算法中的回调函数实现 19
3.4 算法中的绘图和分割面片实现 20
3.4.1 场景中物体顶点的确定 20
3.4.2 三角形面片的分割算法 21
3.5 CPU模型下参数设置及其他函数实现 22
3.5.1 设置光源属性 22
3.5.2 设置材质属性 23
3.5.3 启动光照 23
3.5.4 其他函数实现 24
第四章 GPU下的光线跟踪算法实现 25
4.1 算法中的变换实现 25
4.1.1 几何变换 25
4.1.2 投影变换 25
4.1.3 视口变换 26
4.1.4 视景转换 26
4.2 算法中的回调函数实现 27
4.3 算法中的绘图和分割面片实现 27
4.4 GPU模型下的其它函数实现 27
4.5 GPU模型下参数设置 28
4.5.1 设置光源属性 28
4.5.2 设置材质属性 28
4.5.3顶点程序配置 29
4.5.4 片段程序配置 30
4.6 CG光照程序 31
4.6.1 顶点的光照程序 31
4.6.2 片段的光照程序 33
第五章 实验结果与分析 34
5.1 实验结果 34
5.2 结果分析 35
第六章 结束语 37
致谢 38
参考文献 39
39
第一章 绪论
1.1背景
1.1.1 计算机图形学的发展和应用
1950年,第一台图形显示器作为美国麻省理工学院(MIT)旋风I号(Whirlwind I)计算机的附件诞生了。该显示器用一个类似于示波器的阴极射线管(CRT)来显示一些简单的图形。1958年美国Calcomp公司由联机的数字记录仪发展成滚筒式绘图仪,GerBer公司把数控机床发展成为平板式绘图仪。1962年,MIT林肯实验室的Ivan E.Sutherland 发表了一篇题为“Sketchpad:一个人机交互通信的图形系统”的博士论文,他在论文中首次使用了计算机图形学“Computer Graphics”这个术语,证明了交互计算机图形学是一个可行的、有用的研究领域,从而确定了计算机图形学作为一个崭新的科学分支的独立地位。他在论文中所提出的一些基本概念和技术,如交互技术、分层存储符号的数据结构等至今还在广为应用。1964年MIT的教授Steven A. Coons提出了被后人称为超限插值的新思想,通过插值四条任意的边界曲线来构造曲面。同在60年代早期,法国雷诺汽车公司的工程师Pierre Bézier发展了一套被后人称为Bézier曲线、曲面的理论,成功地用于几何外形设计,并开发了用于汽车外形设计的UNISURF系统。Coons方法和Bézier方法是CAGD最早的开创性工作。
70年代是计算机图形学发展过程中一个重要的历史时期,光栅显示器的产生,在60年代就已萌芽的光栅图形学算法,迅速发展起来,区域填充、裁剪、消隐等基本图形概念、及其相应算法纷纷诞生,图形学进入了第一个兴盛的时期,并开始出现实用的CAD图形系统。又因为通用、与设备无关的图形软件的发展,图形软件功能的标准化问题被提了出来。1974年,美国国家标准化局(ANSI)在ACM SIGGRAPH的一个与“与机器无关的图形技术”的工作会议上,提出了制定有关标准的基本规则。此后ACM专门成立了一个图形标准化委员会,开始制定有关标准。该委员会于1977、1979年先后制定和修改了“核心图形系统”(Core Graphics System)。ISO随后又发布了计算机图形接口CGI(Computer Graphics Interface)、计算机图形元文件标准CGM(Computer Graphics Metafile)、计算机图形核心系统GKS(Graphics Kernel system)、面向程序员的层次交互图形标准 PHIGS(Programmer's Hierarchical Interactive Graphics Standard)等。这些标准的制定,为计算机图形学的推广、应用、资源信息共享,起到了重要作用。
70年代,计算机图形学另外两个重要进展是真实感图形学和实体造型技术的产生。1970年Bouknight提出了第一个光反射模型,1971年Gourand提出“漫反射模型+插值”的思想,被称为Gourand明暗处理。1975年Phong提出了著名的简单光照模型-Phong模型。这些可以算是真实感图形学最早的开创性工作。另外,从1973年开始,相继出现了英国剑桥大学CAD小组的Build系统、美国罗彻斯特大学的PADL-1系统等实体造型系统。
1980年Whitted提出了一个光透视模型-Whitted模型,并第一次给出光线跟踪算法的范例,实现Whitted模型;1984年,美国Cornell大学和日本广岛大学的学者分别将热辐射工程中的辐射度方法引入到计算机图形学中,用辐射度方法成功地模拟了理想漫反射表面间的多重漫反射效果;光线跟踪算法和辐射度算法的提出,标志着真实感图形的显示算法已逐渐成熟。从80年代中期以来,超大规模集成电路的发展,为图形学的飞速发展奠定了物质基础。计算机的运算能力的提高,图形处理速度的加快,使得图形学的各个研究方向得到充分发展,图形学已广泛应用于动画、科学计算可视化、CAD/CAM、影视娱乐等各个领域。
1.1.2 图形处理器(GPU)的现状和地位
目前,计算机图形学正处于前所未有的发展时期。近5年来,GPU技术以令人惊异的速度在发展。渲染速度(以每秒钟渲染的像素计)每6个月就翻一番。成倍地增长以让人兴奋,而翻番再翻番的奇迹就更令人激动了。性能5年来翻了10次,也就是(2的10次方比2)提高了上千倍!
与此同时,不仅操作性能得到了提高。计算量和图形编程的灵活性也逐渐得以改善。5年前,PC和计算机工作站只有图形加速器,没有图形处理器(GPU),而图形加速器只能简单地加速图形渲染。此外加速器这个名词还意味着计算机执行与以前完全相同的渲染操作,只不过更快速而已。一旦GPU取代了图形加速器,我们就应该摒弃图形加速器的旧观念。让我们欢迎图形处理器的到来,同时也迎接它能够产生新图形运算和效果的崭新理念!
可编程的GPU是很灵敏的,以前困难的图形问题在性能提高1000倍的设备上变得轻而易举。离线渲染技术的交互式应用也变得更为现实。此外,算法的发展更为有趣。图形程序员现在可以用新的算法和技术做实验,这在像CPU那样缓慢的单线串行处理器上是不可能的。GPU的并行流处理性质加之灵活性和可编程性,可以开发运行新的算法并且将其投入实验。不仅是图形问题,任何计算机所要求的问题,凡是可以利用大规模并行处理器、更大的存储器空间以及几何性能增长的问题,都可以在GPU的执行中得到很好的实验。
近年来,随着计算机图形硬件的快速发展,真实感图形绘制成为图形学研究的热点。光线跟踪算法是一种经典的真实感绘制算法,它利用光路可逆原理,通过追踪光线,能很好地渲染真实世界。国内外在这方面做了大量的研究。随着GPU的可编程特性及可编程硬件高级语言(如CG)的发展,人们开始关注和研究如何利用GPU强大的运算能力将CPU从繁重的运算中解放出来。基于GPU的光线跟踪成为了一个活跃的研究方向。
1.1.3 图形及硬件编程语言
1、OpenGL
OpenGL是Open Graphics Lib的缩写,是一套三维图形处理库,也是该领域的工业标准。OpenGL源于SGI公司为其图形工作站开发的IRIS GL,在跨平台移植过程中发展成为OpenGL。OpenGL被设计成独立于硬件,独立于窗口系统的,在运行各种操作系统的各种计算机上都可用,并能在网络环境下以客户/服务器模式工作,是专业图形处理、科学计算等高端应用领域的标准图形库。
Microsoft、SGI、IBM、DEC、SUN、HP等大公司都采用了OpenGL作为三维图形标准。许多软件厂商也纷纷以OpenGL为基础开发出自己的产品,包括动画制作软件Soft Image和3D Studio MAX、仿真软件Open Inventor、VR软件World Tool Kit、CAD软件Pro/Engineer、GIS软件ARC/INFO等等。OpenGL实际上是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL与C++紧密接合,便于实现图形的相关算法,并可保证算法的正确性和可靠性;OpenGL使用简便,效率高。
2、Cg语言
Cg是一种高级编程语言,可使开发者更轻松、快捷地创建具有电影效果的实时图形。Cg是由NVIDIA公司和微软公司密切合作联手开发的,开发人员借助该语言可更抽象地进行工作,无需直接针对图形硬件进行编程。通用、熟悉的C-like语法可迅速为图形平台开发出实时渲染的鲜锐视觉效果,并与微软公司最近发布的面向DirectX9.0的高级渲染语言兼容。
Cg语言主要参照ANSI C建模,但也从C++和Java以及早期的绘制语言如RenderMan and the Stanford shading language中吸取了一些思想。这些使得很容易写程序然后由编译器进行优化,提高了可读性。而且Cg的设计考虑了GPU的体系结构,如可编程多处理器单元(顶点处理器,像素处理器,外加不可编程单元), 这些部分和应用都是通过数据流连接起来。Cg语言允许分别为顶点和像素写程序,Cg API引入了profiles的概念以处理顶点和像素编程所缺乏的通用性。一个Cg profile就定义了一套整个Cg语言的子集以适应不同的硬件平台和API。Cg程序可以根据运行时的需要或者事先编译成GPU汇编代码,这样可以很容易地将一个Cg像素程序和手写的顶点程序结合起来,或者甚至采用不可编程的OpenGL或者DirectX顶点流水线,反之亦然 。
NVIDIA CS编译器是NVIDIA Cg编程环境的核心,面向标准DirectX 8或DirectX 9兼容图形芯片(GPU)编写的程序可进行编译并可运行在任何兼容硬件上。它所形成的程序是一种高效的顶点或像素渲染引擎,其性能水平相当于或优于手工编码图形程序。NVIDIA的Cg编译器的设计目的是为了充分利用NVIDIA GPU的功能和通道,确保最优性能和视觉质量。此外,NVIDIA的Cg编译器还可支持OpenGL。面向OpenGL平台编写的Cg渲染引擎被编译和优化,以充分利用NVIDIA GPU里的扩展图形功能。NVIDIA的CS编译器还是一种交叉平台,可支持面向Windows、OSX、Linux、Mac和Xbox编写的程序。
1.2 课题主要研究的内容
在计算机图形学中模拟真实世界是一个比较困难的课题,随着图形处理器硬件的发展和图形模拟算法的不断改进,以及可编程硬件语言的出现,使模拟现实世界场景成为一种可能。光线跟踪技术是一个经典模拟现实世界的算法,它能很好的渲染场景。本课题是在GPU加速的基础上,利用光线跟踪算法去渲染一个三角形面片数不断增加的球体和圆锥体,片数从52个到20560个成复杂度递增。在不同复杂度下,分别比较在CPU和GPU下用光线跟踪算法渲染场景的效率。
我的工作主要是:
1. 查阅各种资料,提出设计方案
2. 确定编程语言OpenGL和CG。
3. 在VC.NET和CG Toolkit 2.0下通过光线跟踪算法模拟场景。
4. 测试在不同场景下的CPU和GPU的渲染时间。
5. 比较CPU和GPU的渲染效率,得出GPU加速的光线跟踪特点。
第二章 光照
计算机图形学的其中一大任务是对所表示的三维场景产生真实感效果。它在计算机辅助多媒体教育、科学计算可视化、动画制作、电影特技模拟、计算机游戏等教学、工作和生活中的许多方面均发挥了重要的作用。光照模型及真实感图形的输出研究也成为计算机图形学中一个最重要的组成部分之一。人们观察世界时,依靠的是从物体表面发射或反射出的光线。当物体的几何形态确定之后,光照决定了整个场景的显示结果。因此,真实感图形的生成取决于如何建立一个合适的光照模型( illumination model)。建立一个能模拟真实世界的光照模型相当困难在计算机图形学的应用中,一般没有必要,也不可能精确地模拟光的所有物理性质只要从某种程度上进行模拟即可,当然,其底线是避免由于近似而造成观察者对形体表示上的混淆。
2.1 光照模型
反射、透射的光进入人的视觉系统,产生视觉效果。为了模拟这一现象,需要建立一些数学模型来替代复杂的物理模型,这些模型称为明暗效应模型或者光照模型,每种模型都是对自然界复杂光照的抽象和近似描述。
2.1.1 放射光
放射项表示了物体表面所发出的光,这种光照作用是独立于所有光源的。放射项是一个RGB值,指明了表面所发出光的颜色。如果你在一个完全黑暗的房间里观察一种放射性材质,它将呈现出这种颜色。放射项可以模拟炽热的物体。图2-1从概念上说明了放射项。
放射
物体表面
图2-1 放射项
不像在真实世界里,场景中的放射性物体本身不是一个光源——它不照亮其他物体或投下阴影。用于放射项的数学公式:emissive = Ke ,Ke代表材质的放射光颜色。
2.1.2 环境光
环境光(ambient light):是邻近各物体所产生的光的多次反射最终达到平衡时的一种光,环境光是指光源间接对物体的影响。例如,透过厚厚云层的阳光就可以称为环境光,室内环境光即为墙壁、天花板、地板及室内各物体之间光的多次反射结果。可近似地认为其光强分布是均匀的,抽象为单一的强度值,它在任何一个方向上的分布都相同,统一地影响场景中所有物体的所有表面。图2-2举例说明了这个概念。
如果用Ia来表示环境光强度(简称光强),由于不同的物体对环境光有不同的反射属性,记为Ka(0<Ka<1)。这时,物体上某点的光强可以表示为:
Iambient=Ia Ka
一个可见物体在只有环境光的照射下其各点的明暗程度均一样,并让没有受到光源直接照射的地方也有明亮度,区分不出哪处明亮,哪处暗淡。因此,只有环境光是不能产生真实感图形的。
入射的环境光 反射的环境光
物体表面 物体表面
图2-2 环境项
2.1.3 漫反色和Lambert模型
环境光是对光照现像的最简单抽象,因而局限性很大。它仅能描述光线在空间中无方向并均匀散布时的状态。很多情况下,入射光是带有方向的,比如典型的阳光。如果光照射到比较粗糙的物体表面,如粉笔,由于这些表面从各个方向等强度地反射光,因而从各个视角出发,物体表面呈现相同的亮度,所看到的物体表面某点的明暗程度不随观测者的位置变化的,这种等同地向各个方向散射的现象称为光的漫反射(diffuse reflection)简单光照模型模拟物体表面对光的反射作用。光源被假定为点光源,其几何形状为一个点,向周围所有方向上辐射等强度的光,在物体表面产生反射作用。图2-3举例说明了这个概念。
入射光 反射的漫反射光
物体表面 物体表面
图2-3 漫反射项
漫反射光的强度近似的服从于Lambert定律,即漫反射光的光强仅与入射光的方向和反射点处表面法向夹角的余弦成正比。由此可以构造出Lambert漫反射模型:
Idiffuse =Id Kd cosθ
Idiffuse表示物体表面某点的漫反射光强,Id为点光源,Kd(0<Kd<1)表示物体表面该点对漫反射光的反射属性,θ是入射光线的方向与物体表面该点处法线N的夹角,或称为入射角(0≤θ≤90°)。入射角为零时,说明光线垂直于物体表面,漫反射光强最大;90°时光线与物体表面平行,物体接收不到任何光线。把环境光模型添加进来,最后,Lambert光照模型可写为:I= IaKa + Id Kdcosθ= IaKa + Id Kd(L·N),该模型包含环境光和漫反射光。
漫反射的颜色可由入射光的颜色和物体表面的颜色共同设定。例如,在RGB颜色模型下,物体的漫反射系数Kd的三元组(KdR KdG KdB)分别代表RGB三原色的漫反射系数,它们设定物体颜色。同样,照射光I的三元组为(IdR IdG IdB),通过这些分量的调整得到不同的彩色光照效果:
IR= IaRKaR + fatt IdR KdR(L·N)
IG= IaGKaG + fatt IdGKdG(L·N)
IB= IaBKaB + fatt IdBKdB(L·N)
2.1.4 镜面反色和Phong模型
Lambert模型较好地表现了粗糙表面上的光照现象,如石灰粉刷的墙壁、纸张等。但在用于诸如金属材质制成的物体时,则会显得呆板,表现不出光泽,主要原因是该模型没有考虑这些表面的镜面反射效果。如果光照射到相当光滑的表面,就产生镜面反射(specular reflection),镜面反射的特点是在光滑表面会产生一块称之为高光(high light)的特亮区域。图2-4举例说明了镜面反射的概念。
入射光 反射的镜面反射光
物体表面 物体表面
图2-4 镜面反射项
镜面反射遵循光的反射定律:反射光与入射光位于表面法向两侧,对理想反射面(如镜面),入射角等于反射角,观察者只能在表面法向的反射方向一侧才能看到反射光。
对于非理想反射面,如苹果、塑料球等的表面,由于镜面反射光复杂的物理性质,常采用Phong提出的一个经验模型,认为镜面反射的强度与反射光线和视线的夹角α相关:
Ispec = IsKscosns α (α∈(0,90º))
Ks为物体表面某点的高亮光系数,ns为物体表面的镜面反射指数,反映了物体表面的光泽程度,ns越大,表示物体越接近于镜面。只有视线与光源在物体表面的反射光线非常接近时才能看到镜面反射光,此时,镜面反射光将会在反射方向附近形成很亮的光斑,称为高光现象。ns越小,表示物体越粗糙;当ns为零时,镜面反射光便退化为与视点、光源均无关的环境光。将镜面反射光与环境光、漫反射光叠加起来形成单一光源照射下更为真实的Phong光照模型,θ:入射角,α :视线与镜面反射方向的夹角。
I = Ia Ka+IdKdcosθ+IsKscosns α
2.1.5 简单局部光照模型
将逐步增加、完善的,已经包含了环境光、漫反射光和镜面高光三大类光线的光照模型集成光线衰减和非折射透明模型,就能够得到一个较为完整的简单局部光照模型:
I=(1-Kt)(KaIa+∑i fi(Idi Kdcosθi+KsIsicosnsαi))+ItKt
Kt:透明度,表示物体表面上某点透过光线的比例。
Ka:环境反射系数,表示物体表面上某点对环境光的反射强度。
fi:距离衰减量,表示第i个光源在物体表面某点上因距离而产生的衰减系数。
Kd:漫反射系数,表示物体表面上某点对漫反射光的反射强度。
Ks:镜面反射系数,表示物体表面上某点对镜面反射光的反射强度。
Ia:环境光强度,表示所有光源对环境光造成影响的总和。
Idi:漫射光强度,表示第i个光源的漫射光强度。
Isi:镜面光强度,表示第i个光源的镜面光强度。
It:透射光强度,表示透明物体表面某点应该透射出的光强,这还决定于场景中
其它物体的摆放。
ns:镜面光指数,表示物体表面某点对镜面光的反射角度大小。
2.2 插值算法
光照模型最后的显示结果均依赖于物体表面法向量的计算,而当今流行的三维不规则几何物体通常是用多边形(三角形)来近似模拟的。由于每一个多边形的法向一致,因而多边形内部的象素的颜色都是相同的,而且在不同法向的多边形邻接处,光强突变,使具有不同光强的两个相邻区域之间的光强不连续性(马赫带效应)。为了保证多边形之间的光滑过渡,使连续的多边形呈现匀称的光强,就需要根据某种规则对顶点间的各种信息进行加权平均,即所谓的插值算法。基本思想是在每一个多边形的顶点处计算出光照强度或参数,然后在各个多边形内部进行均匀插值,得到多边形的光滑颜色分布。计算机图形学中的两个主要算法是:Gouraud明暗处理(双线性光强插值算法),Phong明暗处理(双线性法向插值算法)。
1、恒定明暗处理
如果多面体表示的三维几何是物体的精确表示(非曲面表面逼近),此时一个多边形面上的任意一点光强都是相同的,则可能构造一个最简单的插值方法:恒定明暗处理(flat shading)。这种算法对多边形面上的每一个点都使用相同的值,运算量最小(只有计算初值的计算量,不存在插值计算量)。
2、Gouraud明暗处理
用多边形顶点的光强进行双线性插值,先由顶点的光强插值计算各边的光强,然后由各边的光强插值计算出多边形内部点的光强,如图2-5。
IL1=IV1+(IV2-IV1)u (0=u=1;u=0,IL1=IV1;u=1,IL1=IV2)
IL2=IV2+(IV3-IV2)v (0=v=1;v=0,IL2=IV2;v=1,IL2=IV3)
IP=IL1+(IL2-IL1)t (0=t=1;t=0,IP= IL1;t=1,IP=IL2)
3、Phong明暗处理
用多边形顶点的光强进行双线性插值,先由顶点的光强插值计算各边的光强,然后由各边的光强插值计算出多边形内部点的光强,如图2-5。
NL1=NV1+(NV2-NV1)u (0=u=1;u=0,NL1=NV1;u=1,NL1=NV2)
NL2=NV2+(NV3-NV2)v (0=v=1;v=0,NL2=NV2;v=1,NL2=NV3)
NP=NL1+(NL2-NL1)t (0=t=1;t=0,NP= NL1;t=1,NP=NL2)
图2-5 插值扫描图
2.3 光线跟踪
对屏幕上每个像素沿深度方向确定该像素在哪个多边形表面上(如果一个像素区域覆盖多个多边形表面,可以只取中心点经过的多边形,或取占面积比重最大的多边形,也可取所有多边形按面积和距离的加权平均)。计算该区域上的光强值(通过各顶点插值并计算而来)。最后根据光强值输出该象素的颜色,这就是经典的光线
投射(ray casting)。光线投射到可见面上的效果,还以此为基础继续扩散,跟踪在此表面上生成的折射和反射光强信息,以表现全局光照效果,特别是镜面高光的反射效果,这有利于生成具有真实感的图象。这就需要考虑光线跟踪(ray tracing),
光线跟踪算法是真实感图形学中的主要算法之一,算法具有原理简单、实现方便和
能够生成各种逼真的视觉效果等优点
1、Whitted整体光照模型
Whitted光照模型在Phong模型中增加了镜面反射和折射光两个因素:它除了考虑光源照射引起的反射光到达观察者的亮度之外,还考虑从场景中其他景物镜面反射或透射来的光亮度,因此需要采用光线跟踪算法。
景物表面P点向观察者辐射的光亮度由3部分组成,Whitted整体光照模型可表述如下:I=Ic+KsIs+KtIt
Ic —— 光源直接照射P点引起的亮度,由Phong模型计算。
Is、Ks——其他景物因镜面的反射而向P点辐射的光亮度;Ks为P点的反射系数。
It、Kt——其他景物因折射而向P点辐射的光亮度;Kt为P点的折射系数。
2、光线跟踪基本原理
由光源发出的光到达景物表面后,产生反射和折射,简单光照明模型和简单光透射模型模拟了这两种现象。在简单光照明模型中,反射被分为理想漫反射和镜面反射光,在简单光透射模型中,把透射光分为理想漫透射光和规则透射光。由光源发出的光称为直接光,景物对直接光的反射或折射称为直接反射和直接折射,相对地,把景物表面间对光的反射和折射称为间接光,间接反射、间接折射。最基本的光线跟踪算法是跟踪镜面反射和折射。从光源发出的光遇到景物的表面,发生反射和折射,光就改变方向,沿着反射方向和折射方向继续前进,直到遇到新的景物。但是光源发出光线,经反射与折射,只有很少的部分可以进入人的眼睛。因此实际光线跟踪算法的跟踪方向与光传播的方向是相反的,而是视线跟踪。由视点向象素发出一根射线,与第一个景物相交后,在其反射与折射方向上进行跟踪。
第三章 CPU下的光线跟踪算法实现
3.1 openGL基础知识
3.1.1 openGL工作流程
在OpenGL中进行主要的图形操作直至在计算机屏幕上渲染绘制出三维图形景观的基本步骤:
1、根据基本图形单元建立景物模型,并且对所建立的模型进行数学描述OpenGL中把点、线、多边形、图像和位图都作为基本图形单元;
2、把景物模型放在三维空间中的合适的位置,并且设置视点(viewpoint)以观察所感兴趣的景观;
3、计算模型中所有物体的色彩,其中的色彩根据应用要求来确定,同时确定光照条件、纹理粘贴方式等;
4、把景物模型的数学描述及其色彩信息转换至计算机屏幕上的象素,这个过程也就是光栅化(rasterization)。
在这些步骤的执行过程中,OpenGL可能执行其他的一些操作,例如自动消隐处理等。另外,景物光栅化之后被送入帧缓冲器之前还可以根据需要对象素数据进行操作。整个OpenGL的基本工作流程如图3-1。
几何顶点数据
图像像素数据
显示列表
运算器
逐个顶点操作和图元组装
图像操作
光栅化
纹理映射
逐个顶点操作
帧缓冲区
图 3-1 openGL基本工作流程
3.1.2 openGL数据类型和函数名
OpenGL的数据类型定义可以与其它语言一致,但建议在ANSI C下最好使用以下定义的据类型,如GLint、GLfloat等。具体类型见表3-1.
表3-1 命令前缀和参数数据类型
前缀 数据类型 相应C语言类型 OpenGL类型
b 8-bit integer signed char GLbyte
s 16-bit integer short GLshort
i 32-bit integer long GLint,GLsizei
f 32-bit floating-point float GLfloat,GLclampf
d 64-bit floating-point double GLdouble,GLclampd
ub 8-bit unsigned integer unsigned char GLubyte,GLboolean
us 16-bit unsigned integer unsigned short GLushort
ui 32-bit unsigned integer unsigned long GLuint,GLenum,GLbitfield
OpenGL的库函数命名方式很有规律,了解这种规律后阅读和编写程序都比较容易
方便。首先,每个库函数有前缀 gl、glu、glx或aux,表示此函数分属于基本库、实用库、X 窗口扩充库或辅助库,其后的函数名头字母大写,后缀是参数类型的简写,取i、f,参见表3-1。
例:
glVertex2i(2,4);
glVertex3f(2.0,4.0,5.0);
注意,有的函数参数类型后缀前带有数字2、3、4。2代表二维,3代表三维,4代表alpha值。
有些OpenGL函数最后带一个字母v,表示函数参数可用一个指针指向一个向量(或数组)来替代一系列单个参数值。下面两种格式都表示设置当前颜色为红色,二者等价。
glColor3f(1.0,0.0,0.0);
float color_array[]={1.0,0.0,0.0};
glColor3fv(color_array);
除了以上基本命名方式外,还有一种带“*”星号的表示方法,如glColor*(),它表示可以用函数的各种方式来设置当前颜色。同理,glVertex*v()表示用一个指针指向所有类型的向量来定义一系列顶点坐标值。
最后,OpenGL也定义GLvoid类型,如果用C语言编写,可以用它替代void类型。
3.1.3 openGL描述图元
OpenGL是三维图形的函数库,它所定义的点、线、多边形等图元与一般的定义不太一样,存在一定的差别。一种差别源于基于计算机计算的限制:OpenGL中所有浮点计算精度有限,故点、线 、多边形的坐标值存在一定的误差。另一种差别源于位图显示的限制:以这种方式显示图形,最小的显示图元是一个象素,尽管每个象素宽度很小,但它们仍然比数学上所定义的点或线宽要大得多。当用OpenGL进行计算时,虽然是用一系列浮点值定义点串,但每个点仍然是用单个象素显示,只是近似拟合。OpenGL图元是抽象的几何概念,不是真实世界中的物体,因此须用相关的数学模型来描述。
1、齐次坐标
在空间直角坐标系中,任意一点可用一个三维坐标矩阵[x y z]表示。如果将该点用一个四维坐标的矩阵[Hx Hy Hz H]表示时,则称为齐次坐标表示方法。在齐次坐标中,最后一维坐标H称为比例因子。在OpenGL中,二维坐标点全看作三维坐标点,所有的点都用齐次坐标来描述,统一作为三维齐次点来处理。每个齐次点用一个向量(x,y,z,w)表示,其中四个元素全不为零。
2、 点
用浮点值表示的点称为顶点(Vertex)。所有顶点在OpenGL内部计算时都作为三维点处理,用二维坐标(x,y)定义的点在OpenGL中默认z值为0。所有顶点坐标用齐次坐标(x,y,z,w)表示,如果w不为0.0,这些齐次坐标表示的顶点即为三维空间点(x/w,y/w,z/w)。编程者可以自己指定w值,但很少这样做。一般来说,w缺省为1.0。
3、 线
在OpenGL中,线代表线段(Line Segment),不是数学意义上的那种沿轴两个方向无限延伸的线。这里的线由一系列顶点顺次连结而成,有闭合和不闭合两种。
4、 多边形
OpenGL中定义的多边形是由一系列线段依次连结而成的封闭区域。这些线段不能交叉,区域内不能有空洞,多边形必须在凸多边形,否则不能被OpenGL函数接受。OpenGL多边形可以是平面多边形,即所有顶点在一个平面上,也可以是空间多边形。
3.2 算法中的变换实现
3.2.1 几何变换
1、平移
平移变换函数如下:void glTranslate{fd}(TYPE x,TYPE y,TYPE z),三个函数参数就是目标分别沿三个轴向平移的偏
展开阅读全文