OpenGL之纹理映射Mipmap

一、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过滤
OpenGL之纹理映射Mipmap_第1张图片
纹理过滤模式.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, 则是各向同性的。

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

四、纹理压缩
OpenGL之纹理映射Mipmap_第2张图片
通用压缩纹理格式.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、提取压缩纹理格式


OpenGL之纹理映射Mipmap_第3张图片
提取压缩纹理格式.png

5、GL_EXT_texture_compression_s3tc压缩格式详解

OpenGL之纹理映射Mipmap_第4张图片
texture_compression_s3tc压缩格式.png

你可能感兴趣的:(OpenGL之纹理映射Mipmap)