计算机图形学

光线跟踪算法
光线跟踪算法性质是比光线投射,缺点是需要假设光线在观察点处终止。

简介

为了生成在三维计算机图形环境中的可见图像,光线跟踪是一个比光线投射或者扫描线渲染更加逼真的实现方法。这种方法通过逆向跟踪与假象的照相机镜头相交的光路进行工作,由于大量的类似光线横穿场景,所以从照相机角度看到的场景可见信息以及软件特定的光照条件,就可以构建起来。当光线与场景中的物体或者媒介相交的时候计算光线的反射、折射以及吸收
[1] 。
光线跟踪的场景经常是由程序员用数学工具进行描述,也可以由视觉艺术家使用中间工具描述,也可以使用从数码相机等不同技术方法捕捉到的图像或者模型数据。
由于一个光源发射出的光线的绝大部分不会在观察者看到的光线中占很大比例,这些光线大部分经过多次反射逐渐消失或者至无限小,所以对于构建可见信息来说,逆向跟踪光线要比真实地模拟光线相互作用的效率要高很多倍。计算机模拟程序从光源发出的光线开始查询与观察点相交的光线从执行与获得正确的图像来说是不现实的。
这种方法的一个明显缺点就是需要假设光线在观察点处终止,然后进行逆向跟踪。在一定数量的最大反射之后,最后交点处的光线强度使用多种算法进行估计,这些算法可能包括经典的渲染算法,也可能包括如辐射着色这样的技术。

算法的详细描述

自然现象
在自然界中,光源发出的光线向前传播,最后到达一个妨碍它继续传播的物体表面,我们可以将“光线”看作在同样的路径传输的光子流,在完全真空中,这条光线将是一条直线。但是在现实中,在光路上会受到三个因素的影响:吸收、反射与折射。物体表面可能在一个或者多个方向反射全部或者部分光线,它也可能吸收部分光线,使得反射或者折射的光线强度减弱。如果物体表面是透明的或者半透明的,那么它就会将一部分光线按照不同的方向折射到物体内部,同时吸收部分或者全部光谱或者改变光线的颜色。吸收、反射以及折射的光线都来自于入射光线,而不会超出入射光线的强度。例如,一个物体表面不可能反射
66% 的输入光线,然后再折射 50% 的输入光线,因为这二者相加将会达到
116%。这样,反射或者折射的光线可以到达其它的物体表面,同样,吸收、反射、折射的光线重新根据入射光线进行计算。其中一部分光线通过这样的途径传播到我们的眼睛,我们就能够看到最终的渲染图像及场景。

光线投射算法

Arthur Appel 于 1968
年首次提出用于渲染的光线投射算法。光线投射的基础就是从眼睛投射光线到物体上的每个点,查找阻挡光线的最近物体,也就是将图像当作一个屏风,每个点就是屏风上的一个正方形。通常这就是眼睛看到的那个点的物体。根据材料的特性以及场景中的光线效果,这个算法可以确定物体的浓淡效果。其中一个简单假设就是如果表面面向光线,那么这个表面就会被照亮而不会处于阴影中。表面的浓淡效果根据传统的三维计算机图形学的浓淡模型进行计算。光线投射超出扫描线渲染的一个重要优点是它能够很容易地处理非平面的表面以及实体,如圆锥和球体等。如果一个数学表面与光线相交,那么就可以用光线投射进行渲染。复杂的物体可以用实体造型技术构建,并且可以很容易地进行渲染。
位于纽约Elmsford, New YorkMathematical Applications Group,
Inc.(MAGI)的科学家首次将光线投射技术用于生成计算机图形。1966 年,为了替美国国防部计算放射性污染创立了这个公司。MAGI
不仅计算了伽马射线如何从表面进行反射(辐射的光线投射自从二十世纪四十年代就已经开始计算了),也计算了它们如何穿透以及折射。这些研究工作帮助政府确定一些特定的军事应用;建造能够保护军队避免辐射的军用车辆,设计可以重入的太空探索交通工具。在
Philip Mittelman 博士的指导下,科学家们开发了一种使用同样基本软件生成图像的方法。1972 年,MAGI
转变成了一个商业动画工作室,这个工作室使用光线投射技术为商业电视、教育电影以及最后为故事片制作三维计算机动画,他们全部使用光线投射制作了
Tron 电影中的绝大部分动画。MAGI 于 1985 年破产。

光线跟踪算法

下一个重要的研究突破是 Turner Whitted 于 1979
年做出的。以前的算法从眼睛到场景投射光线,但是并不跟踪这些光线。当光线碰到一个物体表面的时候,可能产生三种新的类型的光线:反射、折射与阴影。光滑的物体表面将光线按照镜像反射的方向反射出去,然后这个光线与场景中的物体相交,最近的相交物体就是反射中看到的物体。在透明物质中传输的光线以类似的方式传播,但是在进入或者离开一种物质的时候会发生折射。为了避免跟踪场景中的所有光线,人们使用阴影光线来测试光线是否可以照射到物体表面。光线照射到物体表面上的某些点上,如果这些点面向光线,那么就跟踪这段交点与光源之间的光线。如果在表面与光源之间是不透明的物体,那么这个表面就位于阴影之中,光线无法照射。这种新层次的光线计算使得光线跟踪图像更加真实。
光线跟踪的优点
光线跟踪的流行来源于它比其它渲染方法如扫描线渲染或者光线投射更加能够现实地模拟光线,象反射和阴影这样一些对于其它的算法来说都很难实现的效果,却是光线跟踪算法的一种自然结果。光线跟踪易于实现并且视觉效果很好,所以它通常是图形编程中首次尝试的领域。

光线跟踪的缺点

光线跟踪的一个最大的缺点就是性能,扫描线算法以及其它算法利用了数据的一致性从而在像素之间共享计算,但是光线跟踪通常是将每条光线当作独立的光线,每次都要重新计算。但是,这种独立的做法也有一些其它的优点,例如可以使用更多的光线以抗混叠现象,并且在需要的时候可以提高图像质量。尽管它正确地处理了相互反射的现象以及折射等光学效果,但是传统的光线跟踪并不一定是真实效果图像,只有在非常近似或者完全实现渲染方程的时候才能实现真正的真实效果图像。由于渲染方程描述了每个光束的物理效果,所以实现渲染方程可以得到真正的真实效果,但是,考虑到所需要的计算资源,这通常是无法实现的。于是,所有可以实现的渲染模型都必须是渲染方程的近似,而光线跟踪就不一定是最为可行的方法。包括光子映射在内的一些方法,都是依据光线跟踪实现一部分算法,但是可以得到更好的效果。
光线穿过场景的反方向
从眼睛发出光线到达光源从而渲染图像的过程有时也称为后向光线跟踪,这是因为它是实际光线传播方向的反方向。但是,对于这个术语来说还有一些混淆的地方。早期的光线跟踪经常是从眼睛开始,James
Arvo
等早期研究人员用后向光线跟踪表示从光源发出光线然后收集得到的结果。因为如此,将它们分成基于眼睛或者基于光源的光线跟踪将会更加清楚。在过去的几十年中,研究人员已经开发了许多组合了这两种方向的计算方法与机制以生成投降或者偏离交叉表面的或多或少的光线。例如,辐射着色算法通常根据光源对于表面的影响进行计算并且存储这些结果,然后一个标准的递归光线跟踪器可以使用这些数据生成场景的真实、物理正确的图像。在全局照明
算法如光子映射以及 Metropolis light transport 中,光线跟踪只是一个用来计算光线在表面之间传输的简单工具。

经典递归光线跟踪算法

对图像中的每一个像素 {创建从视点通过该像素的光线 初始化 最近T 为 无限大,最近物体 为 空值 对场景中的每一个物体 {如果光线与物体相交 {如果交点处的 t 比 最近T 小 {设置 最近T 为焦点的 t 值 设置 最近物体 为该物体}}}如果 最近物体 为 空值 {用背景色填充该像素}否则  {对每个光源射出一条光线来检测是否处在阴影中 如果表面是反射面,生成反射光;递归 如果表面透明,生成折射光;递归 使用 最近物体 和 最近T 来计算着色函数 以着色函数的结果填充该像素}
}

实时光线跟踪

人们已经进行了许多努力,改进如计算机与视频游戏这些交互式三维图形应用程序中的实时光线跟踪速度。 OpenRT
项目包含一个高度优化的光线跟踪软件内核,并且提供了一套类似于 OpenGL 的 API
用于替代目前交互式三维图形处理中基于光栅化(rasterization)的实现方法。 一些光线跟踪硬件,如 Saarland
大学开发的实验性光线处理单元,都是设计用来加速光线跟踪处理中那些需要大量计算的操作。 自从二十世纪九十年代末开始,一些 demo
programmers 爱好者就已经开发了一些光线跟踪的实时三维引擎软件。但是,demos
中的光线跟踪为了实现足够高的帧速经常使用一些不正确的近似甚至是欺骗的手段。 光学设计中的光线跟踪编辑
计算机图形学中的光线跟踪的名称与原理源自于二十世纪最初十年就已经开始出现的光学镜头设计中的古老技术。几何光线跟踪用于描述光线通过镜头系统或者光学仪器时的传输特性,并创建系统的成像属性模型。这用于建造前优化光学仪器的设计,例如减少色像差或者其它的光学像差。光线跟踪也用于计算光学系统中的光程差,光程差用于计算光学波前,而光学波前用于计算系统的衍射作用,例如点扩展函数、调制传递函数以及
Strehl
ratio。光线跟踪不仅用于摄影领域的镜头设计,也可以用于微波设计甚至是无线电系统这样的较长波长应用,也可以用于紫外线或者X射线光学这样的较短波长领域。
计算机图形学与光学设计领域所用的光线跟踪的基本原理都是类似的,但是光学设计所用的技术通常更加严格,并且能够更加正确地反映光线行为。尤其是光的色散、衍射效应以及光学镀膜的特性在光学镜头设计中都是非常重要的,但是在计算机图形学领域就没有那么重要了。
在计算机出现以前,光线跟踪需要使用三角以及对数表手工计算,许多传统摄影镜头的光学公式都是许多人共同完成优化的,每个人只能处理其中一小部分的计算工作。现在这些计算可以在如来自于
Lambda Research 的 OSLO 或者 TracePro、Code-V 或者 Zemax
这些光学设计软件上完成。一个简单的光线跟踪版本是光线传递矩阵分析,它通常用于激光光学谐振腔的设计。

例子

为了说明光线跟踪所用的基本原理,我们来看计算一个光线与球体交点的例子。用 I 表示球面上的点,C 表示球心,r 表示半径,那么球面的公式为
. 如果定义一条线的起点即光线起点是 S,方向是 d,那么线上的每个点都可以表示为 其中 t 是定义线上与起点距离的常数,为了简化起见,通常
d 定义为单位矢量。那么,在这种情况下已知 S、d、C 以及 r,于是代入 I 得到: 简化 ,那么 那么二次方程的解是
这只是直线光线与球体交点的所用的数学公式,当然对于通用的光线跟踪来说是远远不够的,但是它至少表示了这个算法如何使用的一个实例。

计算机图形学-光线追踪学习相关推荐

  1. 计算机图形学——光线追踪(RayTracing)算法

    转自:https://blog.csdn.net/hmbxsy/article/details/80509876?depth_1-utm_source=distribute.pc_relevant.n ...

  2. 计算机图形学基础学习笔记-其一:向量与线性代数

    计算机图形学基础学习笔记-其一:向量与线性代数 前言 计算机图形学概述 向量(矢量) 点乘 叉乘 点乘,叉乘与直角坐标系 矩阵 前言 GAMES101现代计算机图形学入门的学习笔记 正在为TA实习攒作 ...

  3. 计算机图形学——OpenGL学习系列之绘制3D下的小桌子

    计算机图形学--OpenGL学习系列之绘制3D下的小桌子 做的一个小练习,主要用到了几何变换还有gl自带的一个绘制立方体的函数,顺便体会一下glPush和glPop的用法.另外,从2D到3D,开心到飞 ...

  4. 关于计算机图形学的学习(转)

    本文合适的题目应当是:白话说学计算机图形学? 1. 引言 什么是计算机图形学? 本文尽量避免给它做严格的定义,但是通常来说,计算机图形学是数字图象处理的逆过程,这只是一个不确切的定义,后面我们会看到, ...

  5. 关于计算机图形学的学习的书籍推荐

    引言 什么是计算机图形学? 本文尽量避免给它做严格的定义,但是通常来说,计算机图形学是数字图象处理的逆过程,这只是一个不确切的定义,后面我们会看到,实际上,计算机图形学.数字图象处理和计算机视觉在很多 ...

  6. 图形学基础 | 计算机图形学MOOC学习笔记

    计算机图形学 学习笔记 视频链接 http://www.icourse163.org/learn/CAU-45006?tid=1001746004#/learn/announce 补充一下一些图形学基 ...

  7. 《计算机图形学》学习笔记(二)

    图形显示设备 图形输出包括推行的显示和图形的绘制 图形显示指的是在屏幕上输出图形 图形绘制通常是指把图形画在纸上,也称硬拷贝,打印机和绘图仪是两种最常用的硬拷贝设备. 阴极射线管(CRT Cathod ...

  8. [计算机图形学]光线追踪的基本原理(前瞻预习/复习回顾)

    一.光栅化的弊端 我们为什么要用光线追踪呢,在之前的篇章中,我们提到了,光栅化的方式很难表示一些全局的效果,如(1)软阴影,(2)Glossy的反射(类似镜子但又不像镜子那么光滑的材质,如打磨的铜镜和 ...

  9. 计算机图形学相关书籍

    关于计算机图形学的学习 注意: 本文尽量避免理论化的描述,试图用最通俗的语言介绍一下计算机图形学的学习,以及一些参考书目和网络资源: 本文不涉及对概念的定义,以免陷入学术讨论之中 本文是作者学习计算机 ...

最新文章

  1. Keras输出网络结构图
  2. Table-values parameter(TVP)系列之一:在T-SQL中创建和使用TVP
  3. JavaFX 2.0示例介绍书
  4. 状态反射在体育运动中的作用_体育运动木地板时刻运行在最佳状态的秘诀
  5. Windows 文件含义大全
  6. DedeCMS 批量删除垃圾注册用户和垃圾文档
  7. 关于C++中常用的对DEBUG_NEW、THIS_FILE重定义的说明
  8. 社区版PyCharm(PyCharm Community)也可以有可视化的数据库工具呀
  9. windows 查看ttf字体
  10. 数据库候选关键词怎么求_如何选取关键词?
  11. html设置背景颜色宽度,如何设置div的背景色和高度 CSS示例代码
  12. Tomcat运行黄色叉号
  13. Liunx-centos8入门+配置网络
  14. matlab在线性系统中的应用,MATLAB在控制系统仿真中的应用
  15. Shiro登录的使用以及原理(一)
  16. BZOJ 4668 冷战
  17. Ubuntu主机有线连接浙大校园网|浙大校园网Ubuntu有线连接
  18. 一文看懂BP神经网络的基础数学知识
  19. Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/account
  20. vue element-ui 通过身份证获取年龄,出生日期

热门文章

  1. anaconda无法启动,一直停在loading applications卡住的解决方案
  2. php抽奖的数字滚动器,jQuery数字滚动插件
  3. 【论文学习】《A Survey on Neural Speech Synthesis》
  4. 【java笔记-006】【uni-app】当前运行的基座不包含原生插件[xxx],请在manifest中配置该插件,重新制作包括该原生插件的自定义运行基座
  5. Hadoop完全分布式搭建(在三台虚拟机中实现)
  6. Vue Vue3的生命周期
  7. 思科、华为、瞻博juniper、中兴、阿尔卡特中高端网络设备查看端口收发光功率-命令汇总
  8. VR全景拍摄的具体张数
  9. oracle分类账设置,Oracle EBS R12 总帐和子分类账关系详解[转载]
  10. JavaWeb项目中使用到的过滤器