1. 读取数据
1.1 从颜色缓存取内容作为像素图直接读取
glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
参数解析
x: 矩形左下⻆角的窗⼝口坐标
y: 矩形左下⻆角的窗⼝口坐标
width: 矩形的宽,以像素为单位
height: 矩形的⾼高,以像素为单位
format: OpenGL 的像素格式
type: 像素数据的数据类型,解释参数pixels指向的数据,告诉OpenGL 使⽤用缓存区中的什数据类型来存储颜⾊色分量
pixels: 指向图形数据的指针
1.2 从TGA文件中读取像素图
GLbyte *gltReadTGABits(const char *szFileName, GLint *iWidth, GLint *iHeight, GLint *iComponents, GLenum *eFormat);
参数解析
szFileName:纹理文件名称
iWidth、iHeight:文件宽高的指针
iComponents:文件组件的指针
eFormat:文件格式的指针
返回值 指向图像数据的指针
2. 载入数据
void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type,constGLvoid *pixels);
参数解析
target:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D,一般只用 GL_TEXTURE_2D
level:指定所加载的mip贴图层次。一般我们都把这个参数设置为0 。
internalformat:每个纹理理单元中存储多少颜⾊色成分
width、height:加载纹理理的宽度、高度
这些值一般是2的整数次⽅。(这是因为OpenGL 旧版本上的遗留留下的一个要求。当然现在已经可以⽀支持不是 2的整数次方)
border:允许为纹理贴图指定⼀个边界宽度
format:
type:
pixels:像素数据的数据类型,解释参数pixels指向的数据,告诉OpenGL 使⽤用缓存区中的什数据类型来存储颜色分量
3.使用函数分配纹理对象
指定纹理理对象的数量 和 指针(指针指向⼀个无符号整形数组,由纹理对象标识符填充)
void glGenTextures(GLsizei n, GLuint *textTures);
参数解析
n:指定纹理对象的数量
textTures:指向一个无符号整形的数组的指针
4.绑定纹理状态
void glBindTexture(GLenum target, GLunit texture);
参数解析
target:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D
texture:需要绑定的纹理对象
5.删除绑定纹理对象
void glDeleteTextures(GLsizei n, GLuint *textures);
6.测试纹理对象是否有效
如果texture是一个已经分配空间的纹理理对象,那么这个函数会返回GL_TRUE,否则会返回GL_FALSE
GLboolean glIsTexture(GLuint texture);
7.设置纹理参数
voidglTexParameterf(GLenum target, GLenum pname, GLfloat param)
voidglTexParameterfv(GLenum target, GLenum pname,constGLfloat *params)
voidglTexParameteri(GLenum target, GLenum pname, GLint param)
voidglTexParameteriv(GLenum target, GLenum pname,constGLint *params)
参数解析
target:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D
pname:指定需要设定的纹理参数
param:设定指定的纹理参数的值
7.1 过滤方式
GL_TEXTURE_MIN_FILTER // 纹理缩小
GL_TEXTURE_MAG_FILTER // 纹理放大
GL_NEAREST // 邻近过滤,取最近的点的颜色
GL_LINEAR // 线性过滤,去周围点的颜色的混合值
通常
纹理缩小时,使用邻近过滤
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)
纹理放大时,使⽤线性过滤
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
7.2 环绕方式
GL_TEXTURE_WRAP_S、GL_TEXTURE_T、GL_TEXTURE_R(3D),针对s,t,r坐标
GL_REPEAT // 默认行为,在纹理坐标超过1.0的方向上对纹理进行重复
GL_CLAMP
GL_CLAMP_TO_EDGE // 强制对范围之外的纹理坐标沿着合法的纹理单元的最后一行或者最后一列来进行采样,超出范围的会重复纹理边缘,拉伸效果
GL_CLAMP_TO_BORDER // 超出范围的使用边界纹理单元
8.纹理坐标
纹理坐标左下角为零点,在映射时,可以任意映射,但不可相交
9.Mip贴图(mipmap)
mipmap是一种功能强大的纹理技巧,可以提高渲染性能的同时还可以改善场景的显示质量。
只有在使用缩小过滤的时候,才会去设置mipmap。
glGenerateMipmap(GL_TEXTURE_2D);
网友评论