欢迎来到天天文库
浏览记录
ID:27848713
大小:346.00 KB
页数:12页
时间:2018-12-06
《光线追踪(RayTracing)算法描述.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、光线追踪(RayTracing)算法描述 一、理论基础 1、三维场景中创建图像 第一步:透视投影。这是一个将三维物体的形状投影到图像表面上的几何过程,这一步只需要连接从对象特征到眼睛之间的线,然后在画布上绘制这些投影线与图像平面相交的轮廓。 第二步:添加颜色。图像轮廓绘制好之后,给它的骨架添加颜色,这样就完成了三维场景中的图像创建过程。 2、物体的颜色和亮度 •主要是光线与物体材质相互作用的结果。 •光由光子(电磁粒子)组成,光子由各种光源发射。当一组光子撞击一个物体时,可能发生三
2、种情况:被吸收,反射或透射。发生这三种情况的光子百分比因材料而异,通常决定了物体在场景中的显现方式。然而,所有材料都有一个共性:入射光子总数总是与反射光子、吸收光子、透射光子的总和相同。 •白光由“红”、“蓝”、“绿”三种颜色光子组成。当白光照亮红色物体时,光子吸收过程会过滤掉“绿色”和“蓝色”光子。因为物体不吸收“红色”光子,所以它们将被反射,这就是物体呈现红色的原因。 •我们之所以能够看到物体,是因为物体反射的一些光子向我们传播并击中了我们的眼睛。我们的眼睛由光感受器组成,可以将光信号转换为神经
3、信号,然后我们的大脑能够使用这些信号来辨别不同的阴影和色调。 3、光与物体的关系 •没有光线,我们都看不到周围的物体。 •周围环境中没有物体,我们看不到光。 二、光线追踪(RayTracing)算法描述 1、ForwardTracing 在用计算机生成的图像中模拟光与物体相互作用过程之前,我们需要了解一个物理现象。一束光线照射在物体上时,反射的光子中只有少数会到达我们眼睛的表面。想象一下,假设有一个每次只发射一个光子的光源,光子从光源发出并沿着直线路径行进,直至撞击到物体表面,忽略光子的吸收
4、,该光子会以随机的方向反射。如果光子撞击到我们的眼睛表面,则我们会看到光子被反射的点。具体过程如下图所示。 现在从计算机图形的角度来看待这种情况。首先,我们用像素组成的平面代替我们的眼睛。在这种情况下,发射的光子将撞击图形平面上许多像素的一个,并将该点的亮度增加到大于零的值。重复多次直到所有的像素被调整,创建一个计算机生成的图像。这种技术称为前向光线追踪(ForwardTracing),因为我们是沿着光子从光源向观察者的前进的路径。 但是,这种技术在计算机中模拟光子与物体相互作用是不太现实的
5、,因为在实际中反射的光子击中眼睛表面的可能性是非常非常低的,我们必须投射大量的光子才能找到一个能够引起眼睛注意的。此外,我们也不能保证物体的表面被光子完全覆盖,这是这项技术的主要缺点。 换句话说,我们可能不得不让程序一直运行,直到足够的光子喷射到物体的表面上获得精确的显示。这意味着我们要监视正在呈现的图像以决定何时停止应用程序。这在实际生产环境中是不可能的。另外,正如我们将看到的,射线追踪器中最昂贵的任务是找到射线几何交点。从光源产生大量光子不是问题,但是在场景内找到所有的交点将会是非常昂贵的。 2
6、、BackwardTracing 这项技术为前向光线追踪技术的缺陷提供了一个方便的解决方案。由于我们的模拟不能像自然一样快速完美,所以我们必须妥协,并追踪从眼睛进入到场景中的光线。 光线照到一个物体时,我们可以通过将另一条光线(称为光线或阴影光线)从击中点投射到场景的光线,得到它所接受到的光子数量。这个“光线”有的时候会被另一个物体阻挡,这意味着我们原来的撞击点在阴影中,没有获得任何照明。 三、算法实现 1、基本原理 •光线追踪算法采用由像素组成的图像。对于图像中的每个像素,它将主光线投射
7、到场景中。该主光线的方向是通过追踪从眼睛到像素中心线获得的。一旦我们确定了主射线的方向,我们就开始检查场景中的每个对象,看它是否与其中的任何一个相交。当发生主射线与多个对象相交的情况时,我们选择交点离眼睛最近的物体。 •然后,我们从交叉点向光线投射阴影射线。如果这条特定的光线在通往光源的路上不与某个物体相交,那么这个点就被照亮了。 •如果它与另一个物体相交,则该物体在其上投下阴影。 •最后,如果我们对每个像素重复这一操作,就可以获得三维场景的二维表示。 2、伪代码 光线追踪算法实现
8、的伪代码如下所示: for(intj=0;jidth;++i){ //computeprimaryraydirection RayprimRay; computePrimRay(i,j,&primRay); //shootprimrayinthesceneandsearchforintersection NormalnHit; floatminDist=INFINITY; Objectobject=NULL; for(in
此文档下载收益归作者所有