1.1 Texture Mapping
1.1.1 在OpenGL编程中,应用纹理主要分为四步:
- 创建纹理对象,并为它装载一个纹理;
glGenTexture(1,&texName); //为每个纹理编号,1代表生成一个编号
glBindTexture(GL_TEXTURE_2D,texName); //绑定纹理,将会对绑定的纹理进行操作;
glTexImage2D(...); //装载纹理,从内存载入显存;
glDeleteTextures(GLsizei n,const GLuint *textures);
- 确定纹理如何应用到每个像素上;
glTexEnvf(GLenum target,GLenum pname,GLfloat param);
/*
target 必须是GL_TEXTURE_ENV;
pname必须是GL_TEXTURE_ENV_MODE;
param 可以为:GL_MODULATE、GL_DECAL、GL_BLEND、GL_REPLACE;纹理应用到每个像素的方式,就是在片元处理阶段是相乘、混合还是替代;
*/
- 启用纹理贴图功能;
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,texName);
- 绘制场景,提供纹理坐标和几何图形坐标;
glTexCoord2f(...);
/*
纹理坐标范围是[0,1]之间,如果出现超出范围的情况,可以设置纹理的wrap方式;
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); //设置S方向REPEAT,即重复;
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); //设置T方向CLAP,即截断;
*/
glVertex3f(...);
1.1.2 纹理的几何变换
glMatrixMode(GL_TEXTURE);
glTranslate(x,y,z);
glRotatef(angle,x,y,z);
glScalef(sx,sy,sz);
glMatrixMode(GL_MODELVIEW);
- 常见的应用是实现流动水面的效果;
1.1.3 一维纹理与三维纹理
- glTexImage1D
- glTexImage3D
1.2 在图形流水线中,纹理映射为:
- 在顶点处理阶段,给定顶点的纹理坐标;
- 光栅化阶段:插值得到每个片元的纹理坐标;
- 在片元处理阶段,根据纹理坐标获取片元的纹理值;
1.2.1 纹理数据的获取
- 程序生成;
- 读取图片文件
- 拷贝屏幕的部分区域为当前纹理;
glCopyTexImage2D();
- 替换纹理图像的一部分;
glTexSubImage2D();
- 拷贝屏幕并替换当前纹理的一部分区域;
glCopyTexSubImage2D();
- 使用帧缓冲区对象直接渲染到纹理;
1.2.2 BMP、JPEG等图像文件中不包含透明度信息,而TGA文件可以携带透明度信息,还具有压缩格式和非压缩格式两种存储方式。另外,png、dds等也可以携带透明通道信息。