没有合适的资源?快使用搜索试试~ 我知道了~
光线追踪技术的理论和实践
5星 · 超过95%的资源 需积分: 9 228 下载量 77 浏览量
2010-06-11
15:28:25
上传
评论 3
收藏 715KB PDF 举报
温馨提示
试读
12页
这篇文章将介绍光线追踪技术。在计算机图形领域中,这种技术被普遍应用于生成高质量的照片级图像。在为一个场景计算光照的时候,通过固定图形渲染管线可以计算phong光照模型,由于该模型的特征,使得渲染的物体看起来有塑料的质感。如果要渲染一个有金属质感且能反射周围环境的物体,phong模型就无能为力了。和固定渲染管线相比,可编程图形渲染管线的力能要强的多,虽然可以实现很多逼真的光照效果,比如利用环境贴图来现实物体对环境的反射效果。但是这种环境反射只能反射出已经保存在Cube Map中的图像。在真实世界中,如果一个能反射周围环境的物体周围还有很多其他物体,它们就会相互反射。一般的环境贴图技术达不到这样的效果,于是在渲染照片级画面的时候,就要用到光线追踪的技术。文本还将利用c++面向对象的方法来实现光线追踪。
资源推荐
资源详情
资源评论
Theory & Practice of RayTracing
2
介绍
这篇文章将介绍光线追踪技术。在计算机图形领域中,这种技术被普遍应用于生成高质量的照片级
图像。在为一个场景计算光照的时候,通过固定图形渲染管线可以计算 phong 光照模型,由于该模
型的特征,使得渲染的物体看起来有塑料的质感。如果要渲染一个有金属质感且能反射周围环境的
物体,phong 模型就无能为力了。和固定渲染管线相比,可编程图形渲染管线的力能要强的多,虽
然可以实现很多逼真的光照效果,比如利用环境贴图来现实物体对环境的反射效果。但是这种环境
反射只能反射出已经保存在 Cube Map 中的图像。在真实世界中,如果一个能反射周围环境的物体
周围还有很多其他物体,它们就会相互反射。一般的环境贴图技术达不到这样的效果,于是在渲染
照片级画面的时候,就要用到光线追踪的技术。文本还将利用 c++面向对象的方法来实现光线追踪。
原理
在介绍原理之前,先考虑一个问题:我们是怎样看到真实世界中的物体的?我们能看到物体,是因
为该物体上有反射光线到达我们的眼睛。没有任何光线传入眼睛,我们就看不到任何东西。我们还
经常看到一个物体表面能反射另一个物体。这也是因为被反射物体表面的反射光线到达该物体表面
后,该物体继续将光线反射到我们的眼睛里,于是我们看到了该物体表面反射其他物体的效果。现
在,我们将从物体表面出发最后到达眼睛的光线的方向反向。先来看看下面的 Fig1,在 Fig1 中是一
个虚拟的场景,场景中有 2 个球和 1 个圆锥,白色的点代表光源,中间四边形就是虚拟屏幕,屏幕
上一个一个的小方格就代表像素,相机的位置代表观察者眼睛的位置。
(a)
(b)
Fig1 光线追踪场景
光线追踪的原理就是从相机的位置发出一条条通过每一个像素的射线,如果该射线和场景中的物体
相交,那么就可以计算出该交点的颜色,这个颜色就是对应的像素的颜色。当然,计算像素颜色的
时候首先要计算出交点处所有与光照计算相关量,比如法线,入射光线和反射光线等等。
Theory & Practice of RayTracing
3
(a)
(b)
Fig2 光线和空间物体相交
在 Fig2 中可以看到,从相机出发的射线依次穿过每一个像素,图中显示出其中的三条。这些射线都
与物体有交点,不同物体的交点计算方法也不一样。射线与平面的交点计算方法和射线与球的交点
计算方法是截然不同的。为了计算方便,这里就只以球为例。如果一个物体可以反射周围的环境,
那么当一条射线与该物体相交后,射线还会在该点产生反射和折射等。例如在 Fig2 中,当射线和蓝
色球相交后,光线会反射,反射的光线又可能和橙色圆锥和绿色球相交,所以我们能在蓝色球的表
面看到橙色的圆锥和绿色球。整个光线追踪的原理就是这么简单,但是实际操作起来又有很多要注
意的地方。
实践
用面向对象的方法来实现光线追踪比使用面向结构要来的容易一些。因为在光线追踪的整个过程中,
比较容易抽象出对象的共同特征,比如我们可以抽象出射线,物体,光源,材质等等。当然,最最
基本的一个类就是向量类,在计算光照的时候向量很重要。在这里我们假设已经实现了一个三维向
量类 GVector3,该类提供所有有关向量的操作。
除了向量,我们最先能想到一个关于射线的类,叫 CRay。
对于一条射线最基本的就是它的出发点和方向,所以在 CRay 的类图中,能看到两个私有成员变量
CRay
-m_Origin: GVector3
-m_Direction: GVector3
+CRay(_Origin: GVector3 = 0, _Direction: GVector3 = 0)
+~CRay()
+setOrigin(_Origin: GVector3 = 0)
+setDirection(_Direction: GVector3 = 0)
+getOrigin(): GVector3
+getDirection(): GVector3
+getPoint(_t: double): GVector3
剩余11页未读,继续阅读
张赐
- 粉丝: 829
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于yolov5识别算法实现的DNF自动脚本源码.zip
- 基于Python实现的自动化办公项目.zip
- 基于python实现的基于PyQt5和爬虫的小说阅读系统.zip
- 机械设计整经机上纱自动化sw20非常好的设计图纸100%好用.zip
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页