OpenGL入门学习之十一——纹理的使用入门.pdf
文本预览下载声明
OpenGL 入门学习之十一——纹理的使用入门
2009-01-07 12:09
1、启用纹理和载入纹理
就像我们曾经学习过的 OpenGL 光照、混合等功能一样。在使用纹理前,必须启用它。
OpenGL 支持一维纹理、二维纹理和三维纹理,这里我们仅介绍二维纹理。可以使用以下语
句来启用和禁用二维纹理:
glEnable(GL_TEXTURE_2D); // 启用二维纹理
glDisable(GL_TEXTURE_2D); // 禁用二维纹理
使用纹理前,还必须载入纹理。利用 glTexImage2D 函数可以载入一个二维的纹理,该函数
有多达九个参数(虽然某些参数我们可以暂时不去了解),现在分别说明如下:
第一个参数为指定的目标,在我们的入门教材中,这个参数将始终使用
GL_TEXTURE_2D 。
第二个参数为“多重细节层次”,现在我们并不考虑多重纹理细节,因此这个参数设置为零。
第三个参数有两种用法。在 OpenGL 1.0,即最初的版本中,使用整数来表示颜色分量数目,
例如:像素数据用 RGB 颜色表示,总共有红、绿、蓝三个值,因此参数设置为 3,而如果像
素数据是用RGBA 颜色表示,总共有红、绿、蓝、alpha 四个值,因此参数设置为4 。而在
后来的版本中,可以直接使用 GL_RGB 或 GL_RGBA 来表示以上情况,显得更直观(并带
来其它一些好处,这里暂时不提)。注意:虽然我们使用 Windows 的BMP 文件作为纹理时,
一般是蓝色的像素在最前,其真实的格式为 GL_BGR 而不是 GL_RGB,在数据的顺序上有
所不同,但因为同样是红、绿、蓝三种颜色,因此这里仍然使用 GL_RGB 。(如果使用
GL_BGR ,OpenGL 将无法识别这个参数,造成错误)
第四、五个参数是二维纹理像素的宽度和高度。这里有一个很需要注意的地方:OpenGL 在
以前的很多版本中,限制纹理的大小必须是2 的整数次方,即纹理的宽度和高度只能是 16,
32, 64, 128, 256 等值,直到最近的新版本才取消了这个限制。而且,一些 OpenGL 实现(例
如,某些 PC 机上板载显卡的驱动程序附带的 OpenGL )并没有支持到如此高的OpenGL 版
本。因此在使用纹理时要特别注意其大小。尽量使用大小为 2 的整数次方的纹理,当这个要
求无法满足时,使用 gluScaleImage 函数把图象缩放至所指定的大小(在后面的例子中有用
到)。另外,无论旧版本还是新版本,都限制了纹理大小的最大值,例如,某 OpenGL 实现
可能要求纹理最大不能超过 1024*1024。可以使用如下的代码来获得OpenGL 所支持的最大
纹理:
GLint max;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, max);
这 ma 的值就是当前OpenGL 实现中所支持的最大纹理。
在很长一段时间内,很多图形程序都喜欢使用 256*256 大小的纹理,不仅因为 256 是2 的整
数次方,也因为某些硬件可以使用 8 位的整数来表示纹理坐标,2 的8 次方正好是256 ,这
一巧妙的组合为处理纹理坐标时的硬件优化创造了一些不错的条件。
第六个参数是纹理边框的大小,我们没有使用纹理边框,因此这里设置为零。
最后三个参数与 glDrawPixels 函数的最后三个参数的使用方法相同,其含义可以参考
glReadPixels 的最后三个参数。大家可以复习一下第 10 课的相关内容,这里不再重复。
举个例子,如果有一幅大小为width*height ,格式为Windows 系统中使用最普遍的24 位
BGR ,保存在pixels 中的像素图象。则把这样一幅图象载入为纹理可使用以下代码:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR_EXT,
GL_UNSIGNED_BYTE, pixels);
注意,载入纹理的过程可能比较慢,原因是纹理数据通常比较大,例如一幅512*512 的BGR
格式的图象,大小为 0.75M 。把这些像素数据从主内存传送到专门的图形硬件,这个过程中
还可能需要把程序中所指定的像素格式转化为图形硬件所能识别的格式(或最能发挥图形硬
件 能的格式),这些操作都需要较多时间。
2 、纹理坐标
我们先来回忆一下之前学过的一点内容:
当我们绘制一个三角形时,只需要指定三个顶点的颜色。三角形中其它各点的颜色不需要我
们指定,这些点的颜色是OpenGL 自己通过计算得到的。
在我们学习 Op
显示全部