下面是根据最近的一个纹理项目,总结一下常用的纹理API及参数解释,以备后期查阅。
-
分配纹理对象
void glGenTextures(GLsizei n,GLuint * textTures); n:指定纹理对象的数量 textTures:指针(指针指向一个无符号整形数组,由纹理对象标识符填充) 例: GLuint uiTextures[3]; glGenTextures(3, uiTextures);
-
绑定纹理状态
void glBindTexture(GLenum target,GLunit texture); target:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D texture:纹理对象 例: glBindTexture(GL_TEXTURE_2D, uiTextures[0]);
-
删除绑定纹理对象
void glDeleteTextures(GLsizei n,GLuint *textures); n:纹理对象的数量 textTures:指针(指针指向一个无符号整形数组,由纹理对象标识符填充) 例: glDeleteTextures(3, uiTextures);
-
测试纹理对象是否有效
GLboolean glIsTexture(GLuint texture); textTures:指针(指针指向一个无符号整形数组,由纹理对象标识符填充) 如果texture是一个已经分配空间的纹理对象,那么这个函数会返回GL_TRUE,否则会返回GL_FALSE。
-
读取TGA 纹理
GLbyte *gltReadTGABits(const char *szFileName, GLint *iWidth, GLint *iHeight, GLint *iComponents, GLenum *eFormat); szFileName:纹理文件名称 iWidth:文件宽度地址 iHeight:文件高度地址 iComponents:文件组件地址 eFormat:文件格式地址 例: GLbyte *pBits; pBits = gltReadTGABits(szFileName, &nWidth, &nHeight, &nComponents, &eFormat); pBits:指向图像数据的指针
-
纹理参数设置
glTexParameterf(GLenum target,GLenum pname,GLFloat param); glTexParameteri(GLenum target,GLenum pname,GLint param); glTexParameterfv(GLenum target,GLenum pname,GLFloat *param); glTexParameteriv(GLenum target,GLenum pname,GLint *param); target:指定这些参数将要应用在哪个纹理模式上,比如GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D。 pname:指定需要设置那个纹理参数 param:设定特定的纹理参数的值 说明:一般用glTexParameteri这个方法比较多。
(1)设置放大/缩小过滤方式
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); GL_TEXTURE_MAG_FILTER:放大过滤参数 GL_TEXTURE_MIN_FILTER:缩小过滤参数 GL_NEAREST:邻近过滤 GL_LINEAR:线性过滤
(2)S/T轴环绕方式
glTextParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAR_S,GL_CLAMP_TO_EDGE); glTextParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAR_T,GL_CLAMP_TO_EDGE); GL_TEXTURE_WRAP_S、GL_TEXTURE_WRAP_T、GL_TEXTURE_WRAP_R,针对s,t,r坐标 参数三可以设置GL_REPEAT、GL_CLAMP、GL_CLAMP_TO_EDGE、GL_CLAMP_TO_BORDER这几种环绕模式。 GL_REPEAT:OpenGL 在纹理坐标超过1.0的⽅向上对纹理进行重复。 GL_CLAMP:所需的纹理单元取⾃纹理边界或TEXTURE_BORDER_COLOR。 GL_CLAMP_TO_EDGE:强制对范围之外的纹理坐标沿着合法的纹理单元的最后一⾏或者最后⼀列来进⾏采样。 GL_CLAMP_TO_BORDER:在纹理坐标在0.0到1.0范围之外的只使用边界纹理单元。边界纹理单元是作为围绕基本图像的额外的⾏和列,并与基本纹理图像一起加载的。
-
载入纹理
void glTexImage1D(GLenum target,GLint level,GLint internalformat,GLsizei width,GLint border,GLenum format,GLenum type,void *data); void glTexImage2D(GLenum target,GLint level,GLint internalformat,GLsizei width,GLsizei height,GLint border,GLenum format,GLenum type,void * data); void glTexImage3D(GLenum target,GLint level,GLint internalformat,GLSizei width,GLsizei height,GLsizei depth,GLint border,GLenum format,GLenum type,void *data); target:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D 。 Level :指定所加载的mip贴图层次。一般我们都把这个参数设置为0。 internalformat:每个纹理单元中存储多少颜色成分。 width、height、depth 参数:指加载纹理的宽度、高度、深度。 border参数:允许为纹理贴图指定一个边界宽度。 format参数:gltReadTGABits函数中,通过 eFormat 参数返回图片的颜色格式 type参数:OpenGL 数据存储方式,一般使用 GL_UNSIGNED_BYTE data参数:图片数据指针 例: glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB, nWidth, nHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBits);
-
Mip贴图
if(minFilter == GL_LINEAR_MIPMAP_LINEAR || minFilter == GL_LINEAR_MIPMAP_NEAREST || minFilter == GL_NEAREST_MIPMAP_LINEAR || minFilter == GL_NEAREST_MIPMAP_NEAREST) glGenerateMipmap(GL_TEXTURE_2D); 只有minFilter 等于以下四种模式,才可以生成Mip贴图 GL_NEAREST_MIPMAP_NEAREST具有非常好的性能,并且闪烁现象非常弱 GL_LINEAR_MIPMAP_NEAREST常常用于对游戏进行加速,它使用了高质量的线性过滤器 GL_LINEAR_MIPMAP_LINEAR 和GL_NEAREST_MIPMAP_LINEAR 过滤器在Mip层之间执行了一些额外的插值,以消除他们之间的过滤痕迹 GL_LINEAR_MIPMAP_LINEAR 三线性Mip贴图。纹理过滤的黄金准则,具有最高的精度
以上有不正确的地方欢迎留言指出,有问题随时联系,有需要补充的也可以提出,谢谢。