【转】关于Mip贴图

2023-10-11 23:59
文章标签 贴图 mip

本文主要是介绍【转】关于Mip贴图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、Mip概念

1.Mip的理解

当摄像机的视点前后移动,比如游戏中的人物移动,距离人物较远的画面纹理如果使用的贴图大小和距离较近的纹理大小相同,那么我们将无法分辨远近距离。

要想解决这样的问题,就需要将距离视点远的图形纹理等比缩小,这时候,我们就需要一种缩小纹理的技术,这也就是Mip的需求。

为了减少这个问题造成的影响,我们可以将贴图提前进行滤波,并且将滤波后的图像存储为连续的,低分辨率的版本(原始图像是全分辨率),这个动作就是Mip贴图。

Mip贴图解决的实际问题就是提高了纹理渲染的性能,同时改善了纹理的显示质量。其主要使用场景就是在有贴图场景需要缩小贴图显示的情况下使用。

2.OpenGL中的解决思路。

OpenGL中提出了一个叫做:多级渐远纹理(Mipmap)的概念来解决了这样的问题,其方法主要就是将一个纹理进行分辨率的缩小,距离视点每远离到一个阀值,纹理的分辨率就变成之前的1/2,这样,就能在远距离的视图上使用分辨率小的纹理贴图,也就不会那么的突兀。

那么根本上的解决办法就是把这一系列的Mip图全部都加载到对应的单个纹理状态中,Mip贴图的大小就是后一个要比前一个小1/2,直到最后一个图像的大小是1*1的纹理单元为止。

3.关于Mip层的加载

glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);

glTexImage2D函数中这个level就是指定图像数据要用于哪个Mip层,第一层是0,往后逐步+1。如果不使用Mip,那么就只有第0层,也就是原始的纹理被加载。在默认的情况下,为了能使用到所有的Mip贴图,我们要将所有的Mip贴图都加载进来,假如有6层的Mip纹理,那么就要使用到如下函数来设置Mip基层和Mip最大层:


//设置Mip贴图基层
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0);//设置Mip贴图最大层
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_LEVEL,6);

还可以使用最小层级GL_TEXTURE_MIN_LOD和最大层级GL_TEXTURE_MAX_LOD来限制纹理层级的使用范围。

4.什么时候需要Mip贴图

只有在需要缩小的时候才要用Mip,放大是不用Mip的,也就是只有在使用minFilter最小过滤方式的时候才要用Mip!!!

关于minFilter的四种模式:

  • GL_NEAREST_MIPMAP_NEAREST : 具有非常好的性能,也可以减弱闪烁的问题,但是视觉效果差。

  • GL_LINEAR_MIPMAP_NEAREST : 使用了高质量的线性过滤器,常用于游戏的加速,和快速的选择方式。

  • GL_LINEAR_MIPMAP_LINEARGL_NEAREST_MIPMAP_LINEAR : 他们在Mip层之间执行了一些额外的线形插值,消除了不同mip层之间的变换痕迹,需要消耗一些性能。

  • GL_LINEAR_MIPMAP_LINEAR : 具有最高的精度,三线形Mip贴图。

纹理过滤模式表如下图1.1:

5.glGenerateMipmap函数

void glGenerateMipmap (GLenum target);

这个函数会为纹理生成完整的一组mipmap。

生成所有的Mip贴图:

if(minFilter == GL_LINEAR_MIPMAP_LINEAR  ||minFilter == GL_LINEAR_MIPMAP_NEAREST ||minFilter == GL_NEAREST_MIPMAP_LINEAR ||minFilter == GL_NEAREST_MIPMAP_NEAREST){//纹理生成所有的mip层//݇参数:GL_TEXTURE_1D,GL_TEXTURE_2D,GL_TEXTURE_3DglGenerateMipmap(GL_TEXTURE_2D);}

二、各向异性过滤

各向异性过滤主要是能提高纹理过滤操作的质量。

当我们对几何图形进行纹理贴图的时候,如果观察方向和观察点恰好是垂直的,那么不会有什么问题出现,但是如果观察方向出现了角度的偏差或者倾斜,那么在对周围的纹理单元进行常规的纹理采样的时候,比如这时候只用最常规的两种过滤方式GL_NEARESTGL_LINEAR进行过滤采样,那么就会丢失一些纹理信息,导致几何图形的纹理渲染出现模糊的现象。

为了解决这个模糊的现象,我们在纹理过滤的时候就要考虑到这个观察的角度问题,使用了解决这个观察角度偏差的方法,这个方法就是各向异性过滤。

在Mip贴图纹理过滤中,或者常规的纹理过滤中,都可以使用各向异性过滤。

各向异性过滤的两个步骤如下:

(1). 获取可以获得支持的最大的各向异性过滤的数量

//存储这个最大的数GLfloat flargest;//获取可以获得支持的最大的各向异性过滤的数量glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT,&fLargest);

(2). 在设置纹理参数的时候,使用GL_TEXTURE_MAX_ANISOTROPY_EXT参数,设置各向异性数据

    //各向异性采样glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAX_ANISOTROPY_EXT,fLargest)//恢复到各相同性采样glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);

各向异性过滤的数值越大,沿着最大变化方向所采样的纹理单元就越多。各向异性过滤会增加性能的支出,但是现在的硬件设备性能也是过剩的,所以性能的影响并不是很大。

这篇关于【转】关于Mip贴图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/191777

相关文章

图形API学习工程(25):实现法线贴图

工程GIT地址:https://gitee.com/yaksue/yaksue-graphics 目标 在《图形API学习工程(10):基础光照》中,我实现了最基础的光照,同时也表现了法线的作用。 在《图形API学习工程(11):使用纹理》中,工程已经能够加载纹理贴图。 这样,法线贴图 所需的准备已经完成,可以在工程里实现这个技术了。 (关于法线贴图的意义,可见上一篇博客《从“法线贴图的意义

从“法线贴图的意义”到“切线空间公式的推导与验证”

目录 目标1. 法线贴图1.1 “法线”的意义1.2 “法线贴图”的意义 2. 切线空间2.1 法线贴图中数据的含义2.2 “切线空间”的定义 3. 切线空间计算公式3.1 构造几何关系等式3.2 切线空间计算公式 4. 代码5. 验证——与其他美术软件计算的结果进行比较总结 目标 本篇的重点是 讨论法线贴图的意义讨论切线空间的意义推导切线空间的计算公式根据公式编写代码将其计算

【教学类-52-08】20240905动物数独(6宫格)一页2张任务卡,一页一个动物贴图卡,有答案

背景需求: 前文提到6宫格数独的图片6*6=36图,如果将6张任务卡放在一个A4上,看上去6种动物很小,所以我换了一个word模板,变成了2张任务卡放在一个A4上。 【教学类-52-07】20240903动物数独(6宫格)一页2张任务卡,无答案-CSDN博客文章浏览阅读846次,点赞25次,收藏6次。【教学类-52-07】20240903动物数独(6宫格)一页2张任务卡,无答案https:

Three.js new THREE.TextureLoader()纹理贴图使用png图片显示为黑色

问题代码如下: const texture = new THREE.TextureLoader().load('./image.png');droneGeometry = new THREE.PlaneGeometry(1, 1);droneMaterial = new THREE.MeshBasicMaterial({ map: texture});droneMesh = new THRE

WordPress MIP 插件:WordPress MIP 独立域名绑定及支持熊掌号

WordPress MIP 主题的同名插件,WordPress MIP 之 WordPress MIP 插件,用于支持发布的所有收费 MIP 主题,支持绑定独立 MIP 域名及熊掌号的快速接入,就是为了让更多的 WordPress 同学更快更方便的引入百度 MIP,享受百度 MIP 带来的流量、权重或者是快感。为了继承 WordPress MIP 主题的免费思想,所以 WordPress MIP

WordPressMIP主题下载,WordPress MIP与百度熊掌号改造接入(V3.4.1)

WordPressMIP主题,是基于熊掌号最新移动端主题,根据百度MIP开发规范升级改造而成,移除冗余代码,完美符合百度MIP规范的一款WordPress移动端主题。   WordPress快速引入百度MIP其实也挺简单,懂代码的人可以直接根据百度MIP官网的规范和验证提示进行原有移动端的改造,不过需要说一点的就是,那些使用自适应的网站引入MIP估计是有点繁琐,甚至基本不太可能,与其改造原

【基础】Three.js加载纹理贴图、加载外部gltf格式文件

1. 模型使用纹理贴图 const geometry = new THREE.BoxGeometry(10, 10, 10);const textureLoader = new THREE.TextureLoader(); // 创建纹理贴图加载器const texture = textureLoader.load("/crate.gif"); // 加载纹理贴图const material

Unity性能优化之编辑器检查——贴图

优化选项 图片资源一般可做如下优化设置 打包图集mipmap不必要时选择关闭Read/Write Enabled不必要时关闭纹理压缩 图集打包的可以参考Unity性能优化之图集打包;mipmap是多级渐变纹理,Unity会生成多张不同像素的纹理以优化性能,因此不必要时就不要设置mipmap防止增加内存;Read/Write Enabled开启时可能会存在内存拷贝以便io操作,因此尽量不

Unity 动态光照贴图,加载后显示变暗或者变白问题 ReflectionProbe的使用

动态加载光照贴图代码,可参考这个帖子 Unity 预制动态绑定光照贴图遇到变白问题_unity urp 动态加载光照信息 变黑-CSDN博客 这次遇到的问题是,在编辑器下光照贴图能正常显示,打出apk后光照贴图加载后变黑的问题 以下4张图代表4种状态: 左图1:未加载光照贴图 右图2:加载光照贴图后,变黑 出现这个问题,是shader的针对lightmap的变体被剥离的

基于 HTML5 Canvas 的 3D 模型贴图问题

之前注意到的一个例子,但是一直没有沉下心来看这个例子到底有什么优点,总觉得就是一个 list 列表,也不知道右边的 3d 场景放两个节点是要干嘛,今天突然想起来就仔细地看了一下这个例子的代码,实际操作中应该还是有用处的,就跟大家分享一下。 本例地址: http://hightopo.com/guide/guide/core/listview/examples/example_custom.htm