立方体纹理映射

上传人:友**** 文档编号:172254101 上传时间:2022-12-02 格式:DOCX 页数:7 大小:78.63KB
收藏 版权申诉 举报 下载
立方体纹理映射_第1页
第1页 / 共7页
立方体纹理映射_第2页
第2页 / 共7页
立方体纹理映射_第3页
第3页 / 共7页
资源描述:

《立方体纹理映射》由会员分享,可在线阅读,更多相关《立方体纹理映射(7页珍藏版)》请在装配图网上搜索。

1、1 问题描述与算法思想1.1 纹理映射简介纹理映射(Texture Mapping)是将纹理空间中的纹理像素映射到屏幕空间中 的像素的过程。在三维图形中,纹理映射(Texture Mapping)的方法运用得最广, 尤其描述具有真实感的物体。比如绘制一面砖墙,就可以使用一幅具有真实感的 图像或者照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。如果 不用纹理映射的方法,这墙上的每一块砖都要作为一个独立的多边形来绘制。另 外,纹理映射能够保证在变换多边形时,多边形上的纹理也会随之变化。例如, 用透视投影模式观察墙面时,离视点远的墙壁的砖块的尺寸就会缩小,而离视点 近的就会大些,这些是符合

2、视觉规律的。此外,纹理映射也被用在其他一些领域。 如飞行仿真中常把一大片植被的图像映射到一些大多边形上用以表示地面,或者 用大理石、木材等自然物质的图像作为纹理映射到多边形上表示相应的物体。纹 理对象通过一个单独的数字来标识。这允许硬件能够在内存中保存多个纹理,而 不是每次使用的时候再加载它们,从而减少了运算量,提高了速度。纹理映射是 真实感图像制作的一个重要部分,运用它可以方便的制作出极具真实感的图形而 不必花过多时间来考虑物体的表面细节。然而纹理加载的过程可能会影响程序运 行速度,当纹理图像非常大时,这种情况尤为明显。如何妥善的管理纹理,减少 不必要的开销,是系统优化时必须考虑的一个问题。

3、还好,相关软件提供了纹理 对象对象管理技术来解决上述问题。与显示列表一样,纹理对象通过一个单独的 数字来标识。立方体映射(cube-map)纹理是一种特殊类型的纹理,用于环境映射,使用 一组图像并把他们作为立方体的面。立方体映射的 6 个面用正方形并且大小相同 的 6 个子纹理表示。要从立方体纹理中采样的时候,使用的纹理坐标是 3 维,并 且被看做来自原点的方向。方向指向用来读取纹理的立方体映射表面的位置。立 方体纹理映射主要思想是通过观察向量和表面的法向量反射来确定采样的纹理 坐标。1.2 实验目的1)掌握位图纹理读入方法;2)掌握立方体纹理映射算法。1.3 功能要求1)建立三维坐标系Oxy

4、z,远点位于屏幕客户区中心,x轴水平向右为正,y轴 垂直向上为正, z 轴垂直于屏幕指向观察者。2)设置屏幕背景色为黑色。3)读入六张构成天空盒的位图作为纹理映射到立方体的可见表面上。4)按下鼠标左键缩小立方体,按下鼠标右键增大立方体。5)使用键盘方向旋转纹理立方体。6)使用动画按钮播放或停止立方体动画。1.4 算法原理(算法思想)立方体进行纹理映射是纹理对象并不是直接绑定到着色器,而是绑定到一个 纹理单元,纹理单元的索引将会传递给做涩琪。要绑定到一个纹理单元,先要将 其激活,可以使用glActive Texture ()函数。可以使用多个纹理单元,每个纹理 单元可以绑定到相同的或者不同的纹理

5、对象。只要纹理对象的类型不同,一个纹 理单元可以绑定多个纹理对象。通过采样器变量来使用多个纹理。在片元着色器 中,采样函数需要通过采样器变量访问变量来访问多个纹理单元。采样器对象与 纹理对象不同。纹理对象中包含了纹理数据以及配置采样操作的参数,这些参数 是采样状态额一部分。另外也可以创建一个采样对象,用采样状态参数配置它, 并把它绑定到纹理单元中。这样,采样器对象会覆盖纹理对象中定义的采样状态。 2总体设计:功能类的结构设计1) 定义CFace类,将面片定点索引号和位图定点索引号绑定在一起,Normal为 面片的法失量;2) 定义 COLORREF 类型的 Image 二维数组,用 void

6、CTestView:ReadImage(int nface)函数读入纹理图片;3) void CTestView:ReadFace()定义面表,将四边形面片三维顶点的索引号和 位图二维顶点的索引号对应起来;4) void CTestView:DrawObject (CDC*pDC)绘制立方体,在绘制立方体之前先 对立方体进行背面剔除以提高效率,绘制时先调用ReadImage()函数读入纹理, 再调用ZBuffer类的SetPoint ()函数绑定纹理,最后根据TextureMap ()函 数根据位图颜色绘制立方体的可见面;5) 在CZBuffer类中添加纹理映射函数TextureMap (),

7、填充立方体每个可见 面内部时,使用COLORREF类型的clr变量读出Image纹理数组对应点的颜色值 进行绘制;6) void CTes tView:Ini tParame ter(),透视变换参数初始化,设定用户坐标系 的视点球坐标;7) void CTestView:PerProject(CP3 P),进行透视变换。实现世界坐标系到观 察坐标系的转换及屏幕坐标系到二维坐标系的转换;8) void CTestView:OnLButtonDown(UINT nFlags, CPoint point),鼠标左键 函数;void CTestView:OnRButtonDblClk(UINT nF

8、lags, CPoint point)鼠标 右键函数。点击鼠标左键使立方体缩小,点击右键使立方体增大;9) void CTestView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags), 键盘控制函数,点击键盘不同按键控制立方体的旋转;10) void CTestView:ClearImaMem(),最终删除纹理对象。3详细设计(流程图)+调用鼠标操作函数调用键盘操作函数调用各按钮操作函将位图拷贝到缓冲区删除纹理对象结束4 源程序(核心功能程序)4.1 绘制立方体void CTestView:DrawObject(CDC* pDC)/绘制立方体

9、 CPi3 Point4;面的顶点坐标CP2 Texture4;/面 的纹理坐标 CZBuffer *zbuf=new CZBuffer;zbuf-InitDeepBuffer(800,800,-1000); for(int nFace=0;nFace=0) 背面剔除for(int nEdge=O;nEdgevFnFace.En;nEdge+)/边循环PerProject(PFnFace.pnEdge);PointnEdge=ScreenP; TexturenEdge=FnFace.tnEdge;ReadImage(nFace);zbuf-SetPoint(Point,Texture,4);/

10、初始化(绑定顶点和各个顶点的纹理坐标点) zbuf-CreateBucket();创建桶表zbuf-CreateEdge();创建边表 zbuf-TextureMap(pDC,Image);/纹理映射 zbuf-ClearMemory();ClearImaMem();delete zbuf;4.2 读入图片void CTestView:ReadImage(int nface)/读入图片BYTE Texture=IDB_FRONT,IDB_BACK,IDB_LEFT,IDB_RIGHT,IDB_TOP,IDB_BOTTOM;CBitmap NewBitmap;NewBitmap.LoadBitm

11、ap(Texturenface);/调入位图资源 NewBitmap.GetBitmap(&bmp);/获得 CBitmap 的信息到 Bitmap 结构体中 int nbytesize=(bmp.bmWidth*bmp.bmHeight*bmp.bmBitsPixel+7)/8;/获得位图的总字节数im=new BYTEnbytesize;开辟装载位图的缓冲区 NewBitmap.GetBitmapBits(nbytesize,(LPVOID)im);/将位图拷贝到缓冲区 Image=new COLORREF*bmp.bmHeight;/建立二维颜色数组for(int n1=0;n1=0;n

12、1-)/位图高度for(int n2=0;n2v=bmp.bmWidth-l;n2+)/f立图宽度int pos=n1*bmp.bmWidthBytes+4*n2;/位置 Imagenln2=RGB(impos+2,impos+l,impos); delete im;4.3 鼠标键盘操作函数void CTestView:OnLButtonDown(UINT nFlags, CPoint point)/鼠 标左键函数 / TODO: Add your message handler code here and/or call default R+=100;Invalidate(FALSE); C

13、View:OnLButtonDown(nFlags, point);void CTestView:OnRButtonDblClk(UINT nFlags, CPoint point)/鼠 标右键函数/ TODO: Add your message handler code here and/or call default R-=100;Invalidate(FALSE); CView:OnRButtonDblClk(nFlags, point);void CTestView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)/ TODO: Add

14、your message handler code here and/or call default if(!Play)switch(nChar)case VK_UP: afa=-5; tran.RotateX(afa);break;case VK_DOWN: afa=5; tran.RotateX(afa);break;case VK_LEFT: beta=-5; tran.RotateY(beta);break;case VK_RIGHT:beta=5;tran.RotateY(beta);break;default:break;Invalidate(FALSE);CView:OnKeyD

15、own(nChar, nRepCnt, nFlags);5运行效果图x王右舷- b nM此F? HBp:i ttiHiX茹嗓 aw zr- basps6 结论与总结这一次的课程设计我选的是立方体纹理映射,与以前上课时要求完成的作业 有很大的区别,难度上提升了不少。上课时图形学实验作业的代码都是有实验参 考书,但这次课程设计却是没有代码提示的,需要自己查询资料并结合自己的理 解来一行行的敲代码。在敲代码的过程中自然是错误百出,无论是变量定义错误 还是输入大小写错误或是标点符号输入错误都会导致最后的图形出不来。此次写代码用的语言是C+,与此代码类似,编过相关类型的代码,也思 考了实现相关功能的对应

16、函数,并完整的实现过程序。在这个过程中,需要不断 地改进,不断地完善,调试,分析,和尝试,才能最终得出结果。而且复合基本 要求,就要在设计过程中勇于探讨,勇于实践。当时是刚开始写这门科目的代码, 一开始无从下手,直到查阅了很多资料,了解了一些相关知识,然后慢慢尝试。 这次在以前的基础上增加了一些难度,虽然程序总体来说较复杂,因为要区分字 母的大小写,还要区分标点符号,写的过程中容易出错,并充分使用所给的已知 信息。如何通过空间模型来实现,如何使用函数来绘制模型的各个部分,并进行 异常处理整个过程要足够的细心和耐心,但我相信,只要不断尝试,不断分析、 改正,最终会的出结果。我认为,对于类似的实践性较强的科目,我们从书本上 学到的东西是远远不够的,课本上只是讲了个大概思路,让我们对这门课有个基 本的了解,而更多的是需要我们自己课外查资料来完善课本上不能学到的,具体 操作需要我们课余时间抽空练习操作过程,从网上查阅相关资料。同时也培养了 自己的自学能力和探索精神,学这门课,不仅需要足够的信心,还要有耐心,我 相信,只要用心学,一定会不断地取得进步的。

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

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

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


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