光线追踪理论_第1页
光线追踪理论_第2页
光线追踪理论_第3页
光线追踪理论_第4页
光线追踪理论_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

光线跟踪:理论与实现(1)简介光线追踪的目的是模拟自然现象:你可以看到各种颜色,因为太阳发出的光被各种自然物体反射或折射后最终进入你的眼睛。如果我们暂时忽略其他因素,所有这些光应该是直线。如图所示,黄光从太阳直接进入相机。红光在与场景一起发射后到达相机,而蓝光被玻璃球折射并击中相机。图中未显示的是无法到达观察者的光线,这也是我们不从光源追踪到相机,而是使用相反路径的原因。上图显示了一个理想的情况,因为光线的方向没有影响。从上面,我们得到了一个启示:与其等待光源通过当前颜色或黑色的像素发出光,我们还不如从相机发出光,穿过平面的每个像素,观察这些光能击中几何图形上的哪些像素。/-/Raylastdefinition/-classRaypublic:射线():米_原点(矢量3(0,0,0),m _方向(矢量3(0,0,0) ;射线(矢量3a _原点,矢量3a _方向);空隙原点(矢量3a _原点) m _原点=a _原点;空隙设置方向(矢量3a _方向) m _方向=a _方向;向量3 GetOrigin() returnm _ Origin;向量3 GetDirection() returnm _ Direction;private:向量_原点;/光的起点向量_方向;/光的方向;一缕光有它的起点和方向。当光线从相机发出时,起点通常是一个固定点,光线穿过屏幕表面的像素。/-/fireraysinthessenneescanlineratime,fromleft/toright/-boolEngine:Render呈现()/renderscene向量3o(0,0,-5);/initializetimerint msecs=GetTickCount();/resetlastfoundprimitive pointerPrimitive*lastprim=0。/renderremaininglinesfor(int y=m _ CurrLine;y(m _ Height-20);y)/逐行扫描m _ SX=m _ WX1;/renderpixelsforcurrentline对于(intx=0;x255)红色=255;if(绿色255)绿色=255;if(blue 255)blue=255;m _ Destm _ PPs=(红色16)(绿色8)蓝色;m _ SX=m _ DX;m _ SY=m _ DY/seeifwebeenworkingtolonghaveyif(GetTickCount()-msecs)100)/returncontroltowindowssodescrenetsupdatem _ CurrLine=y 1;returnfalse/全部完成returntrue请注意此代码:向量3o(0,0,-5);向量3 dir=向量3(m_SX,m_SY,0)-o;标准化(dir);Rayr(o,dir);光线的起点是“o”,方向是朝向屏幕平面上的一个位置,并且方向是均匀的,从而建立光线。屏幕平面指的是在虚拟世界中浮动的矩形来代表屏幕。在代码中,它以原点为中心,宽8个单位,高6个单位,适用于800*600的分辨率。你可以用这个平面做各种事情:如果你把它从相机移开,光线的宽度会变窄,因此屏幕上的物体会变大。如果你旋转这个平面(并且相机在它的中心),你将得到虚拟世界的另一个视图。接下来,我们需要一个光线追踪的场景。场景包含各种元素:几何对象,如球体和平面。您还可以使用三角形面片,并使用它们来构造各种其他元素。元素球体和平面从图元继承而来,每个元素都有一个材质,并且都实现了相交和获取法线的方法。/-/场景定义/-课堂场景public:场景():m _原语(0),m _原语(0) ;场景();空隙场景();intGetNR原语() returnm _原语;原语*Get原语(inta _ Idx) returnm _原语a _ Idx;private:intm _原语;原始* * m _原语;/保存指向各种元素的指针;空隙场景:初始场景()m _原语=新原语*100;/最多100个立体元素/接地层m _原语0=新平面引物(向量3(0,1,0),4.4f);m _原语0-集合名称(”平面”;m _原语0-GetMaterial()-SetReflection(0);m _原语0-GetMaterial()-SetDiffuse(1.0f);m _原语0-GetMaterial()-SetColor(颜色(0.4f,0.3f,0.3f);/bigspherem _原语1=新闻这里(向量3(1,-0.8f,3),2.5f);m _原语1-集合名称(“大球体”);m _原语1-GetMaterial()-SetReflection(0.6 f);m _原语1-GetMaterial()-SetColor(颜色(0.7f,0.7f,0.7f);/smallspherem _原语2=新闻这里(向量3(-5.5f,-0.5,7),2);m _原语2-集合名称(“小球体”);m _原语2-GetMaterial()-SetReflection(1.0f);m _原语2-GetMaterial()-SetDiffuse(0.1f);m _原语2-GetMaterial()-SetColor(颜色(0.7f,0.7f,1.0f);/lightsource1m _原语3=新闻这里(向量3(0,5,5),0.1f);原始3-光(真);m _原语3-GetMaterial()-SetColor(颜色(0.6f,0.6f,0.6f);/lightsource2m _原语4=新闻这里(向量3(2,5,1),0.1f);原始4-光(真);m _原语4-GetMaterial()-SetColor(颜色(0.7f,0.7f,0.9f);/setnumberofprimitivesm _原语=5;这个方法中我们加入了一个地表平面,两个球体以及2个光源。现在就开始跟踪光线了,首先来看下处理的伪代码:前像素Constructrayfromcamerathroughpixel像素像素Findfirstprimitivehitbyray确定生态交叉点绘图颜色为了确定光线命中的最近的一个元素,我们必须对其所有可能的交点做测试。/-/天真追踪:与非常原始的相交/inthescenetodetermineclosestarkerspection/-原始*引擎:光线跟踪(Raya_Ray,Colora_Acc,inta_Depth,flove _ RinDex,flove _ Dist)if(a_DepthTRACEDEPTH)返回0;/traceprimaryraya_Dist=1000000.0f .vector3pi原始*原始=0。intresult/findneearestintersection对于(ints=0;sgetnr原语();s)图元* pr=m _场景-获取原语;兴趣;如果(分辨率=pr-相交(a_Ray,a_Dist)prim=pr结果=res/0=未命中,1=命中,-1=hitfroinsideprimitive/nohit,terminateray如果(!prim)返回0;/handleintersectionif(prim-IsLight()/我们打了很多,停止跟踪a _ Acc=颜色(1,1,1);其他/determinecoloratpointofintersection=射线。射线GetDirection()* a _ Dist;/跟踪灯对于(国际号码=0;lGetNrPrimitives();l)图元* p=m _场景-滚原语(l);if(p-IsLight()原始*光=p。/计算漫射阴影向量3L=(球面*)光)-GetCentre()-pi;标准化(L);向量3n=prim-GetNormal(pi);if(prim-GetMaterial()-GetDiffuse()0)浮点=点(不适用,适用);if(dot0)float diff=dot * prim-GetMaterial()-GetDiffuse();/添加扩散器组件或颜色a _ Acc=diff * prim-GetMaterial

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论