OpenGL实战教程(10) -- 第九站:纹理贴图

纹理,指的是一张二维的图片,把它像贴纸一样贴在物体上面,让那个东西看起来像我们贴纸所要表现的东西那样。纹理映射功能将一些像素数据经过变换(即使是比较不规则的变换)将其附着到各种形状的多边形表面。利用纹理映射功能可以实现目前计算机动画中的大多数效果。

1、启用纹理和载入纹理

glEnable(GL_TEXTURE_2D); // 启用纹理功能 
glDisable(GL_TEXTURE_2D); // 关闭纹理功能

载入纹理:
void glTexImage2D (GLenum target,
GLint level,
GLint internalformat,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
const GLvoid *pixels);

GLenum target:始终使用GL_TEXTURE_2D。
GLint level:多重细节层次,一般参数设置为零。
GLint internalformat:表示颜色分量数目。RGB颜色,总共有红、绿、蓝三个值,因此参数设置为3;如果像素数据是用RGBA颜色表示,总共有红、绿、蓝、alpha四个值,因此参数设置为4。
GLsizei width:纹理像素的宽度
GLsizei height:纹理像素的高度
GLint border:纹理边框,一般设置为零
GLenum format:GL_BGR_EXT或GL_RGB或GL_RGBA或GL_BGRA_EXT
GLenum type:数据类型,一般为GL_UNSIGNED_BYTE,一个字节
const GLvoid *pixels:像素缓冲区。

2、纹理坐标

纹理坐标确定纹理与顶点的对应关系。
一张位图的4个坐标顶点分别为:
左下角(0.0,0.0)
右下角(1.0,0.0)
右上角(1.0,1.0)
左上角(0.0,1.0)

在这里插入图片描述

void glTexCoord2f (GLfloat s, GLfloat t);
void glTexCoord2fv (const GLfloat *v);

3、纹理参数

指定纹理的排放方式

void glTexParameteri (GLenum target, GLenum pname, GLint param);
GLenum target: GL_TEXTURE_2D
GLenum pname:GL_TEXTURE_MIN_FILTER,GL_TEXTURE_MAG_FILTER,GL_TEXTURE_WRAP_S,GL_TEXTURE_WRAP_T
GLint param:参数pname对应的方式

GL_TEXTURE_MIN_FILTER:指当纹理图象用在一个小于(或等于)它的形状上时的对应方式:可选择的设置有GL_NEAREST,GL_LINEAR,GL_NEAREST_MIPMAP_NEAREST,GL_NEAREST_MIPMAP_LINEAR,GL_LINEAR_MIPMAP_NEAREST和GL_LINEAR_MIPMAP_LINEAR
GL_TEXTURE_MAG_FILTE:指当纹理图象用在一个大于它的形状上时的对应方式:GL_NEAREST和GL_LINEAR

GL_TEXTURE_WRAP_S:指当纹理坐标的第一维坐标值大于1.0或小于0.0时的环绕方式
GL_TEXTURE_WRAP_T:指当纹理坐标的第二维坐标值大于1.0或小于0.0时的环绕方式
GL_REPEAT:重复
GL_CLAMP:裁切
GL_MIRRORED_REPEAT_ARB:镜像重复
CLAMP_TO_BORDER_ARB:边界截取
GL_CLAMP_TO_EDGE:边缘截取

4、纹理对象

由于频繁加载纹理,耗费计算资源,因此使用纹理对像把纹理预先加载到内存中。

void glGenTextures (GLsizei n, GLuint *textures);
生成一个纹理对像
GLsizei n:用来生成纹理的数量
GLuint *textures:存储纹理索引的第一个元素指针

void glDeleteTextures (GLsizei n, const GLuint *textures);
删除一个纹理对像
GLsizei n:用来生成纹理的数量
GLuint *textures:存储纹理索引的第一个元素指针

void glBindTexture (GLenum target, GLuint texture);
建立一个绑定到目标纹理的有名称的纹理
GLenum target: GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D或者GL_TEXTURE_CUBE_MAP
GLuint texture:纹理的名称,该纹理的名称不能被再次使用。

5、代理演示

	glGetIntegerv(GL_TEXTURE_BINDING_2D, &TextureID);
	glBindTexture(GL_TEXTURE_2D, texture_ID);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0,
		GL_BGR_EXT, GL_UNSIGNED_BYTE, pixels);
	glBindTexture(GL_TEXTURE_2D, TextureID);  
	glBindTexture(GL_TEXTURE_2D, Step9_texGround);
	glBegin(GL_QUADS);
	glTexCoord2f(0.0f, 0.0f); glVertex3f(-8.0f, -8.0f, 0.0f);
	glTexCoord2f(0.0f, 3.0f); glVertex3f(-8.0f, 8.0f, 0.0f);
	glTexCoord2f(3.0f, 3.0f); glVertex3f(8.0f, 8.0f, 0.0f);
	glTexCoord2f(3.0f, 0.0f); glVertex3f(8.0f, -8.0f, 0.0f);
	glEnd();

运行结果:

在这里插入图片描述

6、下载项目文件

在Debug–x86下编译

下载项目文件

发布了30 篇原创文章 · 获赞 9 · 访问量 830

猜你喜欢

转载自blog.csdn.net/x879014419/article/details/105223776
今日推荐