iOS视觉

十四 OpenGL 纹理及相关函数

2020-08-05  本文已影响0人  王俏

纹理数据

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

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

纹理相关函数API

纹理对象

void glGenTextures(GLsizei n,GLuint * textTures);

void glBindTexture(GLenum target,GLunit texture);

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

设置纹理参数

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


image

线性过滤(GL_LINEAR)

image

两种过滤方式的比较:


image
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);//纹理缩⼩时,使用邻近过滤
image

参数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范围之外的只使用边界纹理单元。边界纹理单元是作为围绕基本图像的额外的行和列,并与基本纹理图像⼀起加载的。

不同的环绕方式的效果如下


image

改变和恢复像素存储方式

void glPixelStorei(GLenum pname, GLint param);
void glPixelStoref(GLenum pname, GLfloat param);
image

读/写颜色缓冲区内容

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

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

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

载入纹理

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

更新纹理

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

插入替换纹理

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

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

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

设置Mip贴图

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

压缩纹理

通用压缩纹理格式


image image

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

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

glHint(GL_TEXTURE_COMPRESSION_HINT,GL_DONT_CARE);
image

加载压缩纹理

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

提取的压缩纹理格式 glGetTexLevelParameter

image
上一篇下一篇

猜你喜欢

热点阅读