美文网首页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 纹理及相关函数

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