logo资料库

光线追踪综述paper.pdf

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
引言
纵览
算法原理
框架
初步实现
计算交点
球体
平面
其他几何体
反射光线
折射光线
Lambert 明暗模型
颜色
光照颜色
叠加颜色
颜色衰减
物体属性
反射比例(reflect)
折射比例(refract)
初步算法演示
Phong 光照模型
原理
Phong 模型中的物体属性
漫反射亮度(diffuse)
反射亮度(specular)
效果对比图
参数
阴影
计算方法
阴影效果
软阴影、抗锯齿和漫反射
采样
蒙特卡罗算法
软阴影和漫反射效果
镜头
纹理
改进后的光线追踪效果图
折射
折射定律
计算折射光线
一些问题
折射效果演示
景深
叠加方法
蒙特卡罗方法
实时计算
效率
减少不必要的递归计算
叠加方法添加概率模型
盒包围模型
基于硬件的优化
并行、分布式算法
展望
光子映射(Photon Mapping)
辐射度算法
材质
动态、自适应以及其他
光线追踪算法的实现和思考 丁戍 (学号 13307130299) 2013 年 12 月 3 日 摘要 本文介绍了光线追踪渲染算法原理、实现方法、真实模拟算法和实时渲染算法, 并提出了一些优化方法 关键词 光线追踪, 计算几何, 计算机图形学, C++, OpenGL, 实时渲染 1 引⾔ 光线追踪 (Ray Tracing) 算法是一种基于真实 光路模拟的计算机三维图形渲染算法. 相比其它大 部分渲染算法, 光线追踪算法可以提供更为真实的 光影效果. 此算法由 Appel 在 1968 年初步提出,1980 年由 Whitted 改良为递归算法并提出全局光照模型. 直到 今天, 光线追踪算法仍是图形学的热点, 大量的改进 在不断涌现. 基于对自然界光路的研究, 光线追踪采取逆向 计算光路来还原真实颜色. 模拟的过程中涵盖了光 的反射、折射、吸收等特性 (精确计算), 并辅以其 它重要渲染思想 (进一步模拟). 其中包含了重要方 法, 诸如冯氏光照模型 (Phong Shading)、辐射度 (Radiosity)、光子映射 (Photon Mapping)、蒙特卡 罗方法 (Monte Carlo) 等等. 鉴于光线追踪算法对场景仿真程度之高, 其被 普遍认为是计算机图形学的核心内容, 以及游戏设 计、电影特效等相关领域的未来方向. 近年来由于硬 件系统的迅速改良, 基于分布式、GPU, 甚至实时渲 染的光线追踪算法也纷纷出现. 本文先给出光线追踪算法的基本框架结构和数 学理论基础, 实现算法框架. 后介绍更多优化模型以 及实现方法, 最后提出一些自己的改良算法, 并将其 移植于 OpenGL 环境并实现简易实时移动渲染. 2 纵览 2.1 算法原理 从视点向屏幕上每一个像素发出一条光线, 追 踪此光路并计算其其逆向光线的颜色, 映射到对应 的像素上. 1 图 1: 光线追踪基本⽰意图 如图 1, 通过计算光路上颜色衰减和叠加, 即可 基本确定每一像素的颜色. 2.2 框架 使用 C++ 实现完整的空间向量类, 包括相交检 测、计算光线反射与折射. 对反射和折射后的光线递 归计算颜色再叠加起来即可算得原光线颜色.(若光 线未遇到物体则可返回背景色) 在递归的过程中, 光亮会不断衰减. 因此可以限 制迭代的深度或者光亮小于特定值时停止迭代. 将对应于每一像素的光线颜色绘制到图片文件 的相应坐标, 最后输出绘制所得图像. 基本 rayColor() 递归算法伪代码如下:
算法 1: 光线追踪递归框架 输⼊: 光线发出位置向量和方向向量 输出: 反向光颜色 function rayColor() if no intersection with any object then else return background color; obj find nearest object from the ray; reflect ray calculate reflect ray with obj; refract ray calculate refract ray with obj; main color the radiance of obj; reflect color rayColor(reflect ray); refract color rayColor(refract ray); return mix(main color, reflect color, refract color); 3 初步实现 对于任意几何体, 都需要建立特定函数 f (x). 自 变量 x 表示空间点的坐标, 函数 8>><>>:1 点x在几何体外部 0 点x在几何体表面上 1 点x在几何体内部 f (x) = 3.1 计算交点 复杂几何体都可以近似划分为基本几何体, 一 般只需要实现光线与球体或平面求交. 光线上的点坐标(以向量表示)可以写为 p = s + td 其中 s; d 分别是起始点坐标和方向向量. 因此交点可以表示为方程 f (p = s + td) = 0 (2) (3) 解出 t 值即可. 3.1.1 球体 球面方程为 jp cj = r p 为 (2) 式中坐标向量. 此时 f (p) = sgn(r jp cj) = 0 解出 t 值即可. 3.1.2 平⾯ 设平面法向量的坐标为 c, 法向量方向为 N, 则 有以下方程 (p c)N = 0 (5) 同理也可解出交点位置. 3.1.3 其他⼏何体 可以将复杂曲面划分为许多个小平面(或三角 形)的近似. 因此将复杂问题化归为光线与空间内多 边形求交点. 首先求出光线与多边形所在平面的交点, 将此 交点的空间坐标向量与该平面的两个基向量相乘即 可得到其对应于此平面的二维坐标. 判断平面上点与多边形的位置关系可以使用经 典的射线法. 3.2 反射光线 (1) 由反射定律, 入射光线与反射光线、法线共面, 且两条光线关于法线对称. 以上讨论的几种基本情 况, 法线向量 N 是易求得的. 由几何关系可知 d′ d = 2N (6) 其中 d′ 是反射光线, 故可直接求得. 3.3 折射光线 首先通过折射定律判断是否存在折射, 如有则 求出折射角. 将入射光线、折射光线、法线向量平移 拼为三角形, 由正余弦定理即可求出折射光线向量. 3.4 Lambert 明暗模型 假设入射光线为 d, 反射光线为 d′, 入射点和光 源的连线向量为 l, 那么此处光亮可以定义为1 k = cos < d′ ; l > = d′l ∥d′∥∥l∥ (7) 此处反射颜色是原反射颜色乘以 k 之后的值. (4) 1根据亮度公式可近似推导 2
3.5 颜⾊ 与传统 255 色不同, 这里颜色使用标准的全值 域 RGB 模型, 会更便于计算. 将颜色表示为向量 (r; g; b), 其中 r; g; b 均为 0 到 1 之间的实数2. 3.5.1 光照颜⾊ RGB 值为 c1 的光线照射到 RGB 值为 c2 的物 为笛卡尔 体上, 反射或折射后的颜色为 c1 积. c2, ⊗ ⊗ 3.5.2 叠加颜⾊ ⊕ ⊕ RGB 值为 c1 的光线和 RGB 值为 c2 的光线叠 为笛卡尔和. 叠加后大于 1 加后颜色为 c1 的 r; g; b 值直接赋为 1. c2, 3.5.3 颜⾊衰减 RGB 值为 c 的光线照射在衰减度为 k 的材质 表面后, 颜色表现为 kc. 3.6 物体属性 3.6.1 反射⽐例(reflect) 表示与物体相交后, 有多少比例的光线产生了 反射. 3.6.2 折射⽐例(refract) 表示与物体相交后, 有多少比例的光线产生了 折射. 3.7 初步算法演⽰ 应用了光源、球面、反射、漫反射、颜色叠加 的基本光线追踪模型, 效果如右图所示: 图 2: 初步算法效果 4 Phong 光照模型 4.1 原理 为 了 提 供 更 为 真 实 的 渲 染 效 果,Bùi Tuòng Phong 发明了 Phong 着色法. 这种方法将漫反射 (diffuse reflection)和正反射(specular reflection) 叠加在一起, 并给正反射加以高光, 使得“光晕”效 果更明显. 使用 Phong 着色法需要给物体添加许多额外的 物理参数: 4.2 Phong 模型中的物体属性 4.2.1 漫反射亮度(diffuse) 表示漫反射光的衰减比例. 4.2.2 反射亮度(specular) 表示正反射光的高光比例. 4.3 效果对⽐图 2一般的, 近似认为三原色光模式为线性且无偏移 3
图 3: 球⾯及平⾯反射效果(普通) 图 4: 球⾯及平⾯反射效果(Phong 着⾊) 4.4 参数 5.2 阴影效果 “光晕”在越接近正反射处表现得越明显, 因此 高光函数应选取一个基于夹角余弦值的单调、且剧 烈变化的函数. 有很多种模拟方法, 上图取了额外高 光系数 s = cos50 (8) 此时物体的表现光由以下组成 obj:ref lect obj:specular cos50 specularColor +obj:ref lect obj:dif f use dif f useColor +obj:ref ract ref ractColor 5 阴影 阴影和高光一样, 也是让渲染增强真实感不可 缺少的元素. 5.1 计算⽅法 图 5: 普通阴影 将入射点和光源连线, 若与物体相交则可判断 此处有阴影. 若判断有阴影, 则将 obj:ref lect; obj:ref ract 两 个参数乘上一个小于 1 的倍数, 以产生变暗效果. 这 里取值 shadowRate = 0:4. 4
6 镜头 观察发现, 靠近画面边缘的球体显示为椭球. 这 是由于屏幕以斜面截取视线, 即所谓的广角镜头. 我 们可以通过调整屏幕的形状(将平面映射到一个球 面上), 或者在镜头前加一个透镜. 同一场景, 调整镜头前后对比如下: 5.3 软阴影、抗锯齿和漫反射 上面产生的阴影, 边缘太过尖锐, 没有现实中阴 影的平滑. 软阴影有两种常见渲染方法. 5.3.1 采样 任何物体都不等价于一个质点, 光源亦如此. 光 源放大来看就是一个球体, 因此阴影边缘的一个点 可能被部分光源照到, 那么它就介于阴影和非阴影 之间. 有一种思路是计算被光照的比例, 但难以实现. 目前被广泛应用的方法是“采样”. 我们随机在光源球体中取若干个点, 并每次将 光源定于其中一点, 计算阴影. 这样计算若干次, 每 一次由于光源位置稍有不同, 故阴影也不同. 将这些 结果叠加起来, 根据概率知识, 很容易发现当取点数 量达到一定时, 叠加起来的阴影越接近真实. 5.3.2 蒙特卡罗算法 蒙特卡罗算法是一大类随机算法的统称, 也是 另一种接近真实的渲染方法. 在现实中不存在绝对 平滑的物体, 所以不存在正反射. 利用这一点, 可以 在每一次计算反射光的时候随机偏离一个角度. 如 此随机很多次, 再将颜色平均起来就得到这一点的 颜色. 蒙特卡罗算法既可以模拟计算漫反射, 也可以 计算软阴影. 给物体添加附加属性“粗糙度”, 代表这个随机 角的范围. 越粗糙的物体表面随机角越大. 图 7: ⼲⾓镜头 5.3.3 软阴影和漫反射效果 图 6: 采样与蒙特卡罗算法结合 图 8: ⻥眼镜头 5
7 纹理 通过照射点的三维坐标, 可以还原出这个点对 于此物体的坐标, 基于此就能给物体加上纹理. 例如 对于平面有 8.2 计算折射光线 通过常规解方程法计算折射光线太过繁琐. 因 为向量之间便于计算夹角, 可以通过光学几何关系 来确定折射光线. x′ (9) 其中 n 是平面的基向量,x 是点的三维坐标,x′ = nx 是点相对于平面的坐标. 7.1 改进后的光线追踪效果图 再对物体的各种参数进行微调, 给平面添加纹 理后得到效果图如下. 图 10: 计算折射光线 由正弦定理: jOBj jOAj sin \OCB sin \OCA = = r sin \OBC r sin \OAC 由折射定律: sin \OCB sin \OCA = n2 n1 又因为 \OCA + \OAC = \OCB + \OBC 结合上面四个方程就可解出折射光线. 图 9: 添加纹理后的效果 8.3 ⼀些问题 (11) (12) (13) (14) 考虑折射(穿透)时, 往往会产生不止一个交 点, 需要就发光点与物体位置关系进行讨论. 当光线 存在于物体内部时, 折射率应该倒过来. 当折射角大 于 90° 时应该不予考虑. 玻璃的折射率大致在 1:5, 也可以自己调整. 类似的, 球面映射也可以通过极坐标(确定经纬 度)来计算. 8 折射 8.1 折射定律 光线折射遵循斯涅耳定律 sin 1 sin 2 = n2 n1 (10) 其中 1; 2 分别为入射角、折射角,n1; n2 表示 两种材质的折射率. 6 O A BCr
8.4 折射效果演⽰ 图 11: 折射效果图 9.2 蒙特卡罗⽅法 图 12: 叠加⽅法 将每一条发出的视线方向上随机扰动一个角度. 关键点在于扰动角度的范围, 与视线和焦点的夹角 正相关. 这样的概率分布明显是合乎逻辑的. 经过 绘制实验, 发现经过一次绘制, 聚焦效果就已经十分 显著. 缺陷是图像噪点多, 仍需进行稍许叠加方法计 算. 9 景深 人眼和摄像机会因聚焦而产生景深的效果, 即 在焦点外会产生模糊效果. 经过自己的思考, 下面通 过两种方法实现模拟的景深效果. 9.1 叠加⽅法 将视点和视线方向随机扰动若干次, 但保证每 一次均聚焦同一点, 再把绘制出来的图像叠加起来. 这样的优点是图像各处更为平滑, 缺点是需要大量 “随机 -重绘”过程来增加真实感. 图 13: 蒙特卡罗⽅法 7
10 实时计算 11.2 叠加⽅法添加概率模型 在游戏等实际应用里, 对光线追踪算法的要求 是能进行实时计算. 本文选取了移植于 OpenGL 库的实时光线追踪 算法程序. 此程序可以随意移动视点和改变视线方 向, 并实时输出绘制画面. 一般情况下, 只有在物体边缘处颜色会产生剧 烈变化. 当使用随机扰动或采样法对某一位置计算 时, 可以采用如下策略: 当经过数次计算, 发现此区域颜色变化不大时, 可以立即结束此处采样; 反之可以不断重复采样, 直 到样本数量足够为止. 经过测试, 在渲染折射效果图(本文图 11)时, 通过直接重复采样计算软阴影耗时约 14 秒, 未修改 其他地方, 经过优化采样概率模型, 耗时减少到约 6 秒, 而人眼无法观察出两结果的不同. 11.3 盒包围模型 光线追踪中, 很大一部分效率消耗在直线与三 维图形交点计算里. 而许多光线不会遇到物体. 当物 体数量多时, 可以通过盒模型来快速排除直线与几 何形相离的情况. 盒包围模型采用了类似空间划分树的数据结构, 常用 BSP 或 K-D Tree 模型, 把空间分成许多立方 体或球体, 每一部分完全包含了一些物体. 这些块与 直线判断相交是极其容易的, 故可以直接排除与其 内部物体的相交判断. 因此盒包围模型可以有效减 少计算量. 图 14: 基于 OpenGL 的实时光线追踪程序 11.4 基于硬件的优化 算法大体部分没有改变, 主要不同的细节在于: 根据视点、视线的移动来调整重绘帧数; 直接利用基于 OpenGL 的光照系统、颜色系 统、三维矩阵模型; 重绘的时候不必填白上一帧, 重绘像素点的顺 序可以随机, 这样视觉上更有连续感. 重写某些计算函数(快速开根法等)、通过显卡 (GPU)计算等等. 11.5 并⾏、分布式算法 利用多核 CPU, 将需要绘制的图像划分成许多 部分, 并行计算或分布式计算. 11 效率 12 展望 光线追踪因其计算量大, 算法效率的优化显得 尤为重要. 下面列举出作者经过总结和思考得到的 优化方法. 11.1 减少不必要的递归计算 当光线经过多次变向而减弱到一定程度, 大部 分时候就可以直接忽略此光线而结束递归. 基本的光线追踪算法除基本光线效果(反射、 折射)外, 仍不能实现许多更为真实、更复杂的物理 效果. 例如绘制透明物体时, 光线产生的阴影下聚焦 效果, 需要用到“光子映射”算法. 12.1 光⼦映射(Photon Mapping) 此算法利用了光子在物体表面的概率分布模型. 8
分享到:
收藏