美文网首页
OpenGL之Mipmap、压缩纹理

OpenGL之Mipmap、压缩纹理

作者: K哥的贼船 | 来源:发表于2020-07-25 20:27 被阅读0次

    Mipmap

    Mipmap是一个功能强大的纹理技术,它可以提高渲染的性能以及提升场景的视觉质量。为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为Mipmap。

    • 原理:它是把一张贴图按照2的倍数进行缩小。直到1X1。把缩小的图都存储起来。在渲染时,根据一个像素离眼睛的距离,来判断从一个合适的图层中取出texel颜色赋值给像素。

    • 优点:

    1. 解决闪烁,当屏幕上被渲染物体的表面与它所应用的纹理图像相比显得非常小时,就会出现闪烁,尤其当相机和物体在移动的时候,这种负面效果更容易出现。
    2. 性能问题,加载了大量纹理数据之后,还要对其缩小,在屏幕上显示的只是一小部分,纹理越大,所造成的影响越大。
    • 缺点:但是这会增加一些额外的内存,在正方形的纹理贴图中使用mipmap技术,大概要比原来多出三分之一的内存空间。

    mipmap有多少个层级是由glTexImage1D、glTexImage2D载入纹理的第二个参数level决定的。 层级从0开始,0,1,2,3这样递增,如果没有使用mipmap技术,只有第0层的纹理会被加载。在默认情况下, 为了使用mipmap,所有层级都会被加载,但是我们可以用纹理参数来控制要加载的层级范围。

    //GL_TEXTURE_BASE_LEVEL指定最低层级的level
    //GL_TEXTURE_MAX_LEVEL指定最高层级的level
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); 
    

    经过Mip贴图的纹理过滤

    Mipmap的纹理过滤
    各项特点对比:
    GL_NEAREST_MIPMAP_NEAREST具有非常好的性能,并且闪烁现象非常弱;
    GL_LINEAR_MIPMAP_NEAREST常常用于对游戏进行加速,它使用了高质量的线性过滤器;
    GL_LINEAR_MIPMAP_LINEARGL_NEAREST_MIPMAP_LINEAR 过滤器在Mip层之间执行了一些额外的插值,以消除他们之间的过滤痕迹;
    GL_LINEAR_MIPMAP_LINEAR 三线性Mip贴图。纹理过滤的黄金准则,具有最高的精度。

    各向异性过滤

    各向异性过滤 (Anisotropic Filtering )是用来过滤、处理当视角变化导致3D物体表面倾斜时造成的纹理错误。传统的双线性和三线性过滤技术都是指"Isotropy"(各向同性)的,其各方向上矢量值是一致的,就像正方形和正方体。
    各向异性过滤是最新型的过滤方法(相对各向同性2/3线性过滤),它需要对映射点周围方形8个或更多的像素进行取样,获得平均值后映射到像素点上。
    在3D游戏里,设置各向异性过滤后,游戏镜头随着鼠标不断移动,物体的显示依然很清晰,画面显示稳定、真实。
    我们来对比下使用了没使用各向异性过滤和使用了各向异性过滤的效果


    没有各向异性过滤效果 使用各向异性过滤效果

    压缩纹理

    • 通⽤压缩纹理格式


      通用压缩纹理格式
    • 判断压缩和选择压缩方式

    GLint comFlag;
    //判断纹理理是否被成功压缩
    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED, &comFlag);
    //根据选择的压缩纹理理格式,选择最快、最优、⾃自⾏行行选择的算法⽅方式选择压缩格式。
    glHint(GL_TEXTURE_COMPRESSION_HINT, GL_FASTEST);
    glHint(GL_TEXTURE_COMPRESSION_HINT, GL_NICEST);
    glHint(GL_TEXTURE_COMPRESSION_HINT, GL_DONT_CARE);
    
    • glGetTexLevelParameter函数提取的压缩纹理格式
      压缩纹理格式
    • 加载压缩纹理
    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);
    //target:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D
    //level:指定所加载的mip贴图层次。⼀般我们都把这个参数设置为0。
    //internalformat:每个纹理单元中存储多少颜⾊成分。 
    //width、height、depth参数:指加载纹理的宽度、高度、深度。
    //==注意!==
    //这些值必须是2的整数次⽅。这是因为旧版本上的遗留下的⼀个要求。当然现在已经可以⽀持不是2的整数次方。但是开发者们还是习惯使用2的数次⽅参数。
    //border:允许为纹理理贴图指定⼀一个边界宽度。
    //format、type、data参数:与我们在讲glDrawPixels 函数对于的参数相同
    
    • GL_EXT_texture_compression_s3tc压缩格式
      压缩格式

    相关文章

      网友评论

          本文标题:OpenGL之Mipmap、压缩纹理

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