美文网首页
OpenGL之纹理映射Mipmap

OpenGL之纹理映射Mipmap

作者: 我的大好时光 | 来源:发表于2018-03-06 13:38 被阅读101次
一、Mipmapping

1、Mipmapping是一个功能强大的纹理技术,它可以提高渲染的性能以及提升场景的视觉质量,它可以用来解决一般纹理贴图出现的两个常见问题:

  • 闪烁,当屏幕上被渲染物体的表面与它所应用的纹理图像相比显得非常小时,就会出现闪烁,尤其当相机和物体在移动的时候,这种负面效果更容易出现。

  • 性能问题,加载了大量纹理数据之后,还要对其缩小,在屏幕上显示的只是一小部分,纹理越大,所造成的影响越大。

2、Mipmap就可以解决上面那两个问题,当加载纹理的时候,不单单加载一个纹理,而是加载一系列从大到小的纹理mipmapped纹理状态,然后OpenGL会根据给定的几何图像的大小选择最合适的纹理。

3、Mipmap是把纹理按照2的倍数进行缩放,直到图像1X1的大小,然后把这些图都存储起来,当要使用就选择一个合适的图像。

4、但是这会增加一些额外的内存,在正方形的纹理贴图中使用Mipmap技术,大概要比原来多出三分之一的内存空间。

5、mipmap有多少个层级是有glTexImage1D、glTexImage2D载入纹理的第二个参数level决定的。 层级从0开始,0,1,2,3这样递增,如果没有使用mipmap技术,只有第0层的纹理会被加载。

6、在默认情况下, 为了使用mipmap,所有层级都会被加载,但是我们可以用纹理参数来控制要加载的层级范围:

  • 使用glTexParameteri, 设定纹理参数。
  • 参数为GL_TEXTURE_BASE_LEVEL来指定最低层级的level
  • 参数为GL_TEXTURE_MAX_LEVEL来指定最高层级的level,

例如我只需要加载0到4层级的纹理

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_LEVEL,4); 
二、Mipmap过滤
纹理过滤模式.png
  • 如果纹理过滤选择为GL_NEAREST或GL_LINEAR模式,那么只有基层的纹理会被加载,其他的纹理将会被忽略。

  • 我们必须指定其中一个mipmap过滤器,这样才能使用所有已加载的纹理。

  • 这个mipmap过滤器的常量是GL_FILTER_MIPMAP_SELECTOR的形式,其中FLILTER指定了过滤模式,SELECTOR指定了如何选择mipmap层。

  • 例如GL_NEAREST_MIPMAP_LINEAR模式,它的SELECTOR是GL_LINEAR,它会在两个最邻近的mip层中执行线性插值,然后得出的结果又由被选择的过滤器GL_NEAREST进行过滤。

三、各向同性采样 & 各向异性采样
当需要贴图的三维平面平行于viewport, 则是各向同性的。

当需要贴图的三维平面与屏幕有一定夹角,则是各向异性的。

四、纹理压缩
通用压缩纹理格式.png

1、判断压缩

GLint comFlag;
//判断纹 是否被成功压缩 
glGetTexLevelParameteriv(GL_TEXTURE_2D,0,GL_TEXTURE_COMPRESSED,&comFlag);

2、根据选择的压缩纹 格式,选择最快、最优、 选择的算法 式选择压缩格式。

glHint(GL_TEXTURE_COMPRESSION_HINT,GL_FASTEST)
glHint(GL_TEXTURE_COMPRESSION_HINT,GL_NICEST)
glHint(GL_TEXTURE_COMPRESSION_HINT,GL_DONT_CARE)

3、加载压缩纹理

/**
target: `GL_TEXTURE_1D`、`GL_TEXTURE_2D`、`GL_TEXTURE_3D`。
Level: 指定所加载的mip贴图层次。 般我们都把这个参数设置为0。
internalformat: 每个纹 单元中存储多少颜 成分。
width、height、depth: 指加载纹 的宽度、 度、深度。==注意!==这些值必须是2的整数次 。(这是因为O
旧版本上的遗 下的 个要求。当然现在已经可以 持 是2的整数次 。但是开发者们还是习惯使 以2的整数次 去
参数。)
border:允许为纹 贴图指定 个边界宽度。 
format: 像素格式
type: 像素类型
data:纹理压缩的数据
*/
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);

4、提取压缩纹理格式


提取压缩纹理格式.png

5、GL_EXT_texture_compression_s3tc压缩格式详解

texture_compression_s3tc压缩格式.png

相关文章

  • OpenGL之纹理映射Mipmap

    一、Mipmapping 1、Mipmapping是一个功能强大的纹理技术,它可以提高渲染的性能以及提升场景的视觉...

  • mipmap 和 drawable 的区别

    mipmap 翻译过来就是纹理映射技术,mipmap文件夹下的图标会通过Mipmap纹理技术进行优化。androi...

  • mipmap和drawable的区别

    mipmap 翻译过来就是纹理映射技术,mipmap文件夹下的图标会通过Mipmap纹理技术进行优化。androi...

  • OpenGL之Mipmap、压缩纹理

    Mipmap Mipmap是一个功能强大的纹理技术,它可以提高渲染的性能以及提升场景的视觉质量。为了加快渲染速度和...

  • OpenGL ES学习之纹理贴图

    OpenGL ES学习之纹理贴图 基本原理 启用纹理映射功能后,如果想把一副纹理应用到相应的几何图元,就必须告知渲...

  • OpenGL纹理MipMap和隧道案例

    开场白 本文介绍一下纹理的mip映射以及用一个隧道案例来展示不同mip过滤模式的效果。 MipMap简介一下 Mi...

  • OpenGL纹理坐标&&隧道案例(二)

    一.隧道案例效果 二.纹理坐标 纹理坐标主要是把图形映射到OpenGL中去,图形中每个顶点关联到对应的纹理坐标下,...

  • OpenGL笔记八:2D纹理坐标解析

    前言 期待您移步上篇:OpenGL笔记七:纹理常用API(二) 纹理采样 为了能够把纹理映射(Map)到三角形上,...

  • 第七课:纹理滤波、光源和键盘控制

    纹理滤波 在纹理映射的过程中,如果图元的大小不等于纹理的大小,OpenGL便会对纹理进行缩放以适应图元的尺寸。我们...

  • OpenGL ES学习笔记(三):纹理相关概念

    纹理映射到转换后的顶点 纹理 概念:纹理是一个用来保存图像颜色元素值的OpenGL ES缓存。 应该尽量使用最小的...

网友评论

      本文标题:OpenGL之纹理映射Mipmap

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