立方体纹理映射

上传人:jin****ng 文档编号:119743591 上传时间:2022-07-15 格式:DOC 页数:5 大小:127.50KB
返回 下载 相关 举报
立方体纹理映射_第1页
第1页 / 共5页
立方体纹理映射_第2页
第2页 / 共5页
立方体纹理映射_第3页
第3页 / 共5页
亲,该文档总共5页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1问题描述与算法思想11纹理映射简介纹理映射(TextureMapping)是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。在三维图形中,纹理映射(TextureMapping)的方法运用得最广,尤其描述具有真实感的物体。比如绘制一面砖墙,就可以使用一幅具有真实感的图像或者照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。如果不用纹理映射的方法,这墙上的每一块砖都要作为一个独立的多边形来绘制。另外,纹理映射能够保证在变换多边形时,多边形上的纹理也会随之变化。例如,用透视投影模式观察墙面时,离视点远的墙壁的砖块的尺寸就会缩小,而离视点近的就会大些,这些是符合视觉规律的。此外,纹理映射也被用在其他一些领域。如飞行仿真中常把一大片植被的图像映射到一些大多边形上用以表示地面,或者用大理石、木材等自然物质的图像作为纹理映射到多边形上表示相应的物体。纹理对象通过一个单独的数字来标识。这允许硬件能够在内存中保存多个纹理,而不是每次使用的时候再加载它们,从而减少了运算量,提高了速度。纹理映射是真实感图像制作的一个重要部分,运用它可以方便的制作出极具真实感的图形而不必花过多时间来考虑物体的表面细节。然而纹理加载的过程可能会影响程序运行速度,当纹理图像非常大时,这种情况尤为明显。如何妥善的管理纹理,减少不必要的开销,是系统优化时必须考虑的一个问题。还好,相关软件提供了纹理对象对象管理技术来解决上述问题。与显示列表一样,纹理对象通过一个单独的数字来标识。立方体映射(cube-map)纹理是一种特殊类型的纹理,用于环境映射,使用一组图像并把他们作为立方体的面。立方体映射的6个面用正方形并且大小相同的6个子纹理表示。要从立方体纹理中采样的时候,使用的纹理坐标是3维,并且被看做来自原点的方向。方向指向用来读取纹理的立方体映射表面的位置。立方体纹理映射主要思想是通过观察向量和表面的法向量反射来确定采样的纹理坐标。12实验目的1)掌握位图纹理读入方法;2)掌握立方体纹理映射算法。13功能要求1)建立三维坐标系Oxyz,远点位于屏幕客户区中心,x轴水平向右为正,y轴垂直向上为正,z轴垂直于屏幕指向观察者。2)设置屏幕背景色为黑色。3)读入六张构成天空盒的位图作为纹理映射到立方体的可见表面上。4)按下鼠标左键缩小立方体,按下鼠标右键增大立方体。5)使用键盘方向旋转纹理立方体。6)使用动画按钮播放或停止立方体动画。1.4算法原理(算法思想)立方体进行纹理映射是纹理对象并不是直接绑定到着色器,而是绑定到一个纹理单元,纹理单元的索引将会传递给做涩琪。要绑定到一个纹理单元,先要将其激活,可以使用glActiveTexture()函数。可以使用多个纹理单元,每个纹理单元可以绑定到相同的或者不同的纹理对象。只要纹理对象的类型不同,一个纹理单元可以绑定多个纹理对象。通过采样器变量来使用多个纹理。在片元着色器中,采样函数需要通过采样器变量访问变量来访问多个纹理单元。采样器对象与纹理对象不同。纹理对象中包含了纹理数据以及配置采样操作的参数,这些参数是采样状态额一部分。另外也可以创建一个采样对象,用采样状态参数配置它,并把它绑定到纹理单元中。这样,采样器对象会覆盖纹理对象中定义的采样状态。1) 2总体设计:功能类的结构设计定义CFace类,将面片定点索引号和位图定点索引号绑定在一起,Normal为面片的法失量;定义COLORRE类型的Image二维数组,用voidCTestView:Readlmage(intnface)函数读入纹理图片;voidCTestView:ReadFace()定义面表,将四边形面片三维顶点的索引号和位图二维顶点的索引号对应起来;voidCTestView:DrawObject(CDC*pDC绘制立方体,在绘制立方体之前先对立方体进行背面剔除以提高效率,绘制时先调用ReadImageO函数读入纹理,再调用ZBuffer类的SetPoint()函数绑定纹理,最后根据TextureMap()函数根据位图颜色绘制立方体的可见面;在CZBuffer类中添加纹理映射函数TextureMap(),填充立方体每个可见面内部时,使用COLORREF型的clr变量读出Image纹理数组对应点的颜色值进行绘制;voidCTestView:InitParameter(),透视变换参数初始化,设定用户坐标系的视点球坐标;voidCTestView:PerProject(CP3P),进行透视变换。实现世界坐标系到观察坐标系的转换及屏幕坐标系到二维坐标系的转换;voidCTestView:OnLButtonDown(UINTnFlags,CPointpoint),鼠标左键函数;voidCTestView:OnRButtonDblClk(UINTnFlags,CPointpoint),鼠标右键函数。点击鼠标左键使立方体缩小,点击右键使立方体增大;voidCTestView:OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags),键盘控制函数,点击键盘不同按键控制立方体的旋转;voidCTestView:ClearlmaMem(),最终删除纹理对象。3详细设计(流程图)开始定义纹理对象生成纹理对象数组4建立点表和面表透视变换参数初始化绘制立方体加载纹理图片调用键盘操作函数将位图拷贝到缓冲区删除纹理对象结束4源程序(核心功能程序)4.1绘制立方体voidCTestView:DrawObject(CDC*pDC)绘制立方体CPi3Point4;面的顶点坐标CP2Texture4;面的纹理坐标CZBuffer*zbuf=newCZBuffer;zbuf-lnitDeepBuffer(800,800,-1000);for(intnFace=0;nFace=0)背面剔除for(intnEdge=0;nEdgeSetPoint(Point,Texture,4);初始化(绑定顶点和各个顶点的纹理坐标点)zbuf-CreateBucket();创建桶表zbuf-CreateEdge();创建边表zbuf-TextureMap(pDC,lmage);纹理映射zbuf-ClearMemory();ClearImaMem();deletezbuf;4.2读入图片voidCTestView:Readlmage(intnface)/读入图片BYTETexture=IDB_FRONT,IDB_BACK,IDB_LEFT,IDB_RIGHT,IDB_TOP,IDB_BOTTOM;CBitmapNewBitmap;NewBitmap.LoadBitmap(Texturenface);/调入位图资源NewBitmap.GetBitmap(&bmp);获得CBitmap的信息到Bitmap结构体中intnbytesize=(bmp.bmWidth*bmp.bmHeight*bmp.bmBitsPixel+7)/8;获得位图的总字节数im=newBYTEnbytesize;/开辟装载位图的缓冲区NewBitmap.GetBitmapBits(nbytesize,(LPVOID)im);将位图拷贝到缓冲区Image=newCOLORREF*bmp.bmHeight;/建立二维颜色数组for(intn1=0;n1=0;n1-)位图高度for(intn2=0;n2=bmp.bmWidth-1;n2+)位图宽度intpos=n1*bmp.bmWidthBytes+4*n2;位置lmagen1n2=RGB(impos+2,impos+1,impos);deleteim;4.3鼠标键盘操作函数voidCTestView:OnLButtonDown(UINTnFlags,CPointpoint)鼠标左键函数/TODO:Addyourmessagehandlercodehereand/orcalldefaultR+=100;Invalidate(FALSE);CView:OnLButtonDown(nFlags,point);voidCTestView:OnRButtonDblClk(UINTnFlags,CPointpoint)/鼠标右键函数/TODO:Addyourmessagehandlercodehereand/orcalldefaultR-=100;Invalidate(FALSE);CView:OnRButtonDblClk(nFlags,point);voidCTestView:OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)/TODO:Addyourmessagehandlercodehereand/orcalldefaultif(!Play)switch(nChar)caseVK_UP:afa=-5;tran.RotateX(afa);break;caseVK_DOWN:afa=5;tran.RotateX(afa);break;caseVK_LEFT:beta=-5;tran.RotateY(beta);break;caseVK_RIGHT:beta=5;tran.RotateY(beta);break;default:break;Invalidate(FALSE);CView:OnKeyDown(nChar,nRepCnt,nFlags);5运行效果图SW)向帕IE6结论与总结这一次的课程设计我选的是立方体纹理映射,与以前上课时要求完成的作业有很大的区别,难度上提升了不少。上课时图形学实验作业的代码都是有实验参考书,但这次课程设计却是没有代码提示的,需要自己查询资料并结合自己的理解来一行行的敲代码。在敲代码的过程中自然是错误百出,无论是变量定义错误还是输入大小写错误或是标点符号输入错误都会导致最后的图形出不来。此次写代码用的语言是C+,与此代码类似,编过相关类型的代码,也思考了实现相关功能的对应函数,并完整的实现过程序。在这个过程中,需要不断地改进,不断地完善,调试,分析,和尝试,才能最终得出结果。而且复合基本要求,就要在设计过程中勇于探讨,勇于实践。当时是刚开始写这门科目的代码,一开始无从下手,直到查阅了很多资料,了解了一些相关知识,然后慢慢尝试。这次在以前的基础上增加了一些难度,虽然程序总体来说较复杂,因为要区分字母的大小写,还要区分标点符号,写的过程中容易出错,并充分使用所给的已知信息。如何通过空间模型来实现,如何使用函数来绘制模型的各个部分,并进行异常处理整个过程要足够的细心和耐心,但我相信,只要不断尝试,不断分析、改正,最终会的出结果。我认为,对于类似的实践性较强的科目,我们从书本上学到的东西是远远不够的,课本上只是讲了个大概思路,让我们对这门课有个基本的了解,而更多的是需要我们自己课外查资料来完善课本上不能学到的,具体操作需要我们课余时间抽空练习操作过程,从网上查阅相关资料。同时也培养了自己的自学能力和探索精神,学这门课,不仅需要足够的信心,还要有耐心,我相信,只要用心学,一定会不断地取得进步的。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 模板表格


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!