OpenGL学习笔记 (6) —— 纹理映射

来源:互联网 发布:网络语言gh是什么意思 编辑:程序博客网 时间:2024/05/09 19:51

2011-04-15 wcdj

 

 

学习Texture Map纹理映射(贴图)有很多好处。比方说您想让一颗导弹飞过屏幕。根据前几课的知识,我们最可行的办法可能是很多个多边形来构建导弹的轮廓并加上有趣的颜色。使用纹理映射,您可以使用真实的导弹图像并让它飞过屏幕。您觉得哪个更好看?照片还是一大堆三角形和四边形?使用纹理映射的好处还不止是更好看,而且您的程序运行会更快。导弹贴图可能只是一个飞过窗口的四边形。一个由多边形构建而来的导弹却很可能包括成百上千的多边形。很显然,贴图极大的节省了CPU时间。

现在我们在第一课的代码开始处增加五行新代码。新增的第一行是#include <stdio.h> 。它允许我们对文件进行操作,为了在后面的代码中使用fopen(),我们增加了这一行。然后我们增加了三个新的浮点变量 xrot、 yrot、zrot。这些变量用来使立方体绕X、Y、Z轴旋转。最后一行GLuint texture[1]为一个纹理分配存储空间。如果您需要不止一个的纹理,应该将数字1改成您所需要的数字。



紧跟上面的代码在ReSizeGLScene()之前,我们增加了下面这一段代码。这段代码用来加载位图文件。如果文件不存在,返回NULL告知程序无法加载位图。在我开始解释这段代码之前,关于用作纹理的图像我想有几点十分重要,并且您必须明白。此图像的宽和高必须是2的n次方宽度和高度最小必须是64像素;并且出于兼容性的原因,图像的宽度和高度不应超过256像素如果您的原始素材的宽度和高度不是64,128,256象素的话,使用图像处理软件重新改变图像的大小。可以肯定有办法能绕过这些限制,但现在我们只需要用标准的纹理尺寸。

步骤
(1) 首先,我们创建一个文件句柄。句柄是个用来鉴别资源的数值,它使程序能够访问此资源。我们开始先将句柄设为NULL 。
(2) 下一部分代码载入位图(调用上面的代码)并转换成纹理。
(3) 只在 InitGL 中增加很少的几行代码。
(4) 现在我们绘制贴图(纹理映射)过的立方体。

注意
不能在glBegin()和glEnd()之间绑定纹理,必须在glBegin()之前或 glEnd()之后绑定。
为了将纹理正确的映射到四边形上,您必须将纹理的右上角映射到四边形的右上角,纹理的左上角映射到四边形的左上角,纹理的右下角映射到四边形的右下角,纹理的左下角映射到四边形的左下角。如果映射错误的话,图像显示时可能上下颠倒,侧向一边或者什么都不是。

(5) 现在增加xrot、yrot及zrot的值。尝试变化每次各变量的改变值来及调节立方体的旋转速度,或改变+/-号来调节立方体的旋转方向。

现在您应该比较好的理解纹理映射(贴图)了。您应该掌握了给任意四边形表面贴上您所喜爱的图像的技术。一旦您对2D纹理映射的理解感到自信的时候,试试给立方体的六个面贴上不同的纹理。
当您理解纹理坐标的概念后,纹理映射并不难理解。

You should now have a better understanding of texture mapping. You should be able to texture map the surface of any quad with an image of your choice. Once you feel confident with your understanding of 2D texture mapping, try adding six different textures to the cube.
Texture mapping isn't to difficult to understand once you understand texture coordinates.

主要修改下面三个函数:



完整代码:(因为是在Lesson 5基础上修改的,所以有点儿乱)

 

 

显示效果图片:

pic

 

 

留一个问题

如何将bmp图片资源集成在可执行文件里,而不是单独地放在一个文件夹里?

 


参考
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=06
nehe-src-cn —— Nehe的OpenGL教程中文版及代码下载
http://code.google.com/p/nehe-src-cn/downloads/list
Nehe的OpenGL教程中文版及代码下载
http://www.yakergong.com/nehe/

 

原创粉丝点击