OpenGL 纹理及相关函数

259

纹理数据

图像图形在内存中最终会转化为位图,以.tag格式存储,存储图像的数据大小计算如下:

图像存储空间的大小 = 图像高度的像素点 * 图像宽度的像素点 * 描述每个像素的字节数

纹理相关函数API

纹理对象

void glGenTextures(GLsizei n,GLuint * textTures);

void glBindTexture(GLenum target,GLunit texture);

void glDeleteTextures(GLsizei n,GLuint *textures); 	
GLboolean glIsTexture(GLuint texture);

设置纹理参数

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);


  • 设置过滤方式 邻近过滤(GL_NEAREST)

线性过滤(GL_LINEAR)

两种过滤方式的比较:

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);//纹理放大时,使⽤线性过滤

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);//纹理缩小时,使⽤邻近过滤

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//纹理放大时,使用线性过滤

 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);//纹理缩⼩时,使用邻近过滤
  • 设置环绕方式: 当纹理坐标超出默认范围是,每种环绕方式有不同的效果,可选的环绕方式有:

参数1:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D

参数2:GL_TEXTURE_WRAP_S、GL_TEXTURE_T、GL_TEXTURE_R,针对s,t,r坐标

参数3: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 glPixelStorei(GLenum pname, GLint param);
void glPixelStoref(GLenum pname, GLfloat param);

读/写颜色缓冲区内容

void glReadPixels(GLint x,GLint y,GLSizei width,GLSizei
height, GLenum format, GLenum type,const void * pixels);

void glReadBuffer (GLenum mode)	//指定读取的缓存	

glWriteBuffer(Glenum mode);//	指定写⼊入的缓存

载入纹理

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);

更新纹理

void glTexSubImage1D(GLenum target,GLint level,GLint xOffset,GLsizei width,GLenum
    format,GLenum type,const GLvoid *data);
    
void glTexSubImage2D(GLenum target,GLint level,GLint xOffset,GLint yOffset,GLsizei
    width,GLsizei height,GLenum format,GLenum type,const GLvoid *data);
    
void glTexSubImage3D(GLenum target,GLint level,GLint xOffset,GLint yOffset,GLint
    zOffset,GLsizei width,GLsizei height,GLsizei depth,Glenum type,const GLvoid * data);

插入替换纹理

void glCopyTexSubImage1D(GLenum target,GLint level,GLint xoffset,GLint x,GLint y,GLsize
width);


void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)	

void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)	

使用颜色缓存区加载数据,形成新的纹理使用

void glCopyTexImage1D(GLenum target,GLint level,GLenum
  internalformt,GLint x,GLint y,GLsizei width,GLint border);
  
 void glCopyTexImage2D(GLenum target,GLint level,GLenum
  internalformt,GLint x,GLint y,GLsizei width,GLsizei
  height,GLint border);	

设置Mip贴图

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0); 	//设置mip贴图基层
 
 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0);	//设置mip贴图最大层

压缩纹理

通用压缩纹理格式

判断压缩 与 选择压缩⽅方式

glHint(GL_TEXTURE_COMPRESSION_HINT,GL_FASTEST); 	
	
glHint(GL_TEXTURE_COMPRESSION_HINT,GL_NICEST);	

glHint(GL_TEXTURE_COMPRESSION_HINT,GL_DONT_CARE);

加载压缩纹理

void glCompressedTexImage1D(GLenum target,GLint level,GLenum internalFormat,GLsizei
 width,GLint border,GLsizei imageSize,void *data);


 void glCompressedTexImage2D(GLenum target,GLint level,GLenum internalFormat,GLsizei
 width,GLint heigth,GLint border,GLsizei imageSize,void *data);
 
 void glCompressedTexImage3D(GLenum target,GLint level,GLenum internalFormat,GLsizei
 width,GLsizei heigth,GLsizei depth,GLint border,GLsizei imageSize,void *data);

提取的压缩纹理格式 glGetTexLevelParameter