美文网首页iOS视觉
十四 OpenGL 纹理及相关函数

十四 OpenGL 纹理及相关函数

作者: 王俏 | 来源:发表于2020-08-05 08:39 被阅读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_NEAREST)


    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

相关文章

  • 十四 OpenGL 纹理及相关函数

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

  • OpenGL 纹理----相关函数

    1、原始图像数据 纹理文件.TGA。纹理其实就是图像。图像包装:图像存储空间 = 图像的⾼度 * 图像宽度 * 每...

  • OpenGL-纹理相关函数

    开场白 本文主要记录一些OpenGL中有关纹理相关的函数,有些函数使用频率不高,简单记录一下,为将来遇到使用场景时...

  • OpenGL纹理加载与镜像

    OpenGL纹理加载步骤以及相关API 在准备工作SetupRC函数中 在渲染函数中不同的纹理需要一一对应再次绑定...

  • OpenGL——纹理过滤函数glTexParameteri()

    OpenGL——纹理过滤函数glTexParameteri()

  • OpenGL 纹理及相关API

    一、原始图像数据 纹理文件:一般使用TGA文件iOS开发中一般是使用png/jpg文件解码成位图作为纹理 二、相关...

  • 六、OpenGL - 纹理及纹理相关API

    图像数据的存储空间 我们都知道图片展示在屏幕上,都是以位图来显示的 纹理其实就位图,只是在OpenGL中我们通常称...

  • OpenGL纹理内容

    纹理可以理解为一张图片,OpenGL渲染图片会将图片的像素保存在纹理缓存中。 OpenGL常用纹理函数 载入纹理 ...

  • OpenGL纹理

    纹理可以理解为一张图片,OpenGL渲染图片会将图片的像素保存在纹理缓存中。OpenGL常用纹理函数 载入纹理 纹...

  • OPenGL ES纹理翻转解决方案

    纹理翻转 在使用OpenGL函数加载纹理到图形时,经常遇到纹理上下颠倒的问题。原因是因为OpenGL要求纹理坐标原...

网友评论

    本文标题:十四 OpenGL 纹理及相关函数

    本文链接:https://www.haomeiwen.com/subject/bfgwrktx.html