、先了解纹理过滤

        想要了解为什么要使用Mipmap,首先要知道纹理过滤是什么。

        当你在玩吃鸡的时候可能会发现一个现象,一个人在距离你5米的地方,可以观察到敌人的一举一动,包括身上的装备等等,但当你拿到98k时,你会蹲在远处狙击别人,这时不开镜的你看500米远处的敌人只能看到一个黑点,这其中远近看到的区别就有应用到纹理过滤

        游戏中A物体的游戏设计纹理贴图是400*400Texel(纹理像素)

        1.当你(摄像机)跟A物体的距离为0时,在你屏幕上显示的像素就是400*400,跟贴图的纹理像素大小相同,此时不需要做特殊处理

        2.假设你离A物体10米远时,屏幕显示的pix为200*200,当200*200的像素要显示400*400纹理像素的物体时,此时的一颗像素需要映射2*2的纹理像素,这个时候就有个问题了,这颗像素要显示什么颜色?只能用合适的算法在这2*2里的纹理像素中计算得出,在这里引用OpenGL中的邻近过滤和线性过滤:

        GL_NEAREST(也叫邻近过滤,Nearest Neighbor Filtering)是OpenGL默认的纹理过滤方式。当设置为GL_NEAREST的时候,OpenGL会选择中心点最接近纹理坐标的那个像素。下图中你可以看到四个像素,加号代表纹理坐标。左上角那个纹理像素的中心距离纹理坐标最近,所以它会被选择为样本颜色:

        GL_LINEAR(也叫线性过滤,(Bi)linear Filtering)它会基于纹理坐标附近的纹理像素,计算出一个插值,近似出这些纹理像素之间的颜色。一个纹理像素的中心距离纹理坐标越近,那么这个纹理像素的颜色对最终的样本颜色的贡献越大。下图中你可以看到返回的颜色是邻近像素的混合色:

        那么这两种纹理过滤方式有怎样的视觉效果呢?让我们看看在一个很大的物体上应用一张低分辨率的纹理会发生什么吧(纹理被放大了,每个纹理像素都能看到):

二、当距离很远的时候怎么算?

        此时的你来到远离市区500米的山上,想要狙击别人,你只能看到一个个很小的人影,在不开镜的情况下只能看到人的跑动。

        此时敌人在屏幕显示为20*20,400*400的纹理像素映射在20*20的像素内,一颗像素需要映射20*20的纹理像素,如果直接进行纹理过滤,那么在使用线性过滤的情况下,只会使用纹理坐标映射点的周围4颗纹理像素进行计算,那么其他的396颗纹理像素就没了参考价值,考虑极端情况下,如果纹理坐标映射点在人的头发,那么不就只是显示黑色了? ,那么在最终的显示效果上可能会产生锯齿或者摩尔纹,摩尔纹长这样:

        这视觉效果必须得改善,那我不能参考所有需要映射的纹理像素进行平均取色吗?可以,但是你的GPU允许你这么做吗,有兴趣可以做个实验,自己采样所有纹理像素进行纹理过滤,此时你如果远处的模型较多的情况下,

        使用原生的线性过滤:60FPS,渲染一个物体每颗像素的颜色需要计算4个纹理像素的插值。

        采样所有纹理像素进行纹理过滤:1FPS,渲染一个物体每颗像素的颜色需要采样计算400个纹理像素的插值。

        可以想象性能换质量的消耗实在太大,在如今的GPU算力下是施行不了的.

        那有办法不损耗算力,又可以提升显示质量吗?可以,使用Mipmap.

三、Mipmap概念

          想象一下,假设我们有一个包含着上千物体的大房间,每个物体上都有纹理。有些物体会很远,但其纹理会拥有与近处物体同样高的分辨率。由于远处的物体可能只产生很少的片段,OpenGL从高分辨率纹理中为这些片段获取正确的颜色值就很困难,因为它需要对一个跨过纹理很大部分的片段只拾取一个纹理颜色。在小物体上这会产生不真实的感觉,更不用说对它们使用高分辨率纹理浪费内存的问题了。

          OpenGL使用一种叫做多级渐远纹理(Mipmap)的概念来解决这个问题,它简单来说就是一系列的纹理图像,后一个纹理图像是前一个的二分之一。多级渐远纹理背后的理念很简单:距观察者的距离超过一定的阈值,OpenGL会使用不同的多级渐远纹理,即最适合物体的距离的那个。由于距离远,解析度不高也不会被用户注意到。同时,多级渐远纹理另一加分之处是它的性能非常好。

 四、Mipmap效果        

 上图是Mipmap的纹理,在储存上最大的为mipmap0,mipmap1的分辨率为mipmap0的一半,以此一直创建下去,直到纹理为一个像素时停止,在某些引擎中可以设置Mipmap的强弱,也就是Mipmap的创建次数。但一般直接拉到最强,因为越到后面创建的大小越小,占用的内存也就越小.

不使用Mipmap:

在先前讲的1颗像素需要映射20*20的纹理像素时,显示效果失真,锯齿以及可能会产生摩尔纹,发生的原因是在纹理过滤时,一颗像素只采样了原本20*20纹理像素里2*2纹理像素的颜色进行线性插值,得到最终的颜色,其他的396颗纹理像素无用,浪费显存且取色不精确。

使用Mipmap:

Mipmap创建:预先创建原纹理大小2分之一的多级渐远纹理,在多级渐远纹理取色采样时,也会进行线性过滤,可以理解成预先创建每隔一定阈值(也就是每次映射像素为上一级别多级渐远纹理的2分之一的时候)并经过了线性过滤的纹理。

        使用Mipmap的渲染过程:20*20的像素需要映射400*400的纹理像素时,检测到一颗像素需要映射到纹理像素为20*20,在Mipmap纹理中里寻找最接近20*20纹理像素的多级渐远纹理,并使用此多级渐远纹理进行采样。

        此时采样用的多级渐远纹理的颜色也是从上一级的多级渐远纹理迭代采样插值计算而来,也就是一颗像素映射此多级渐远纹理间接插值计算了20*20的纹理像素的颜色,取色的效果当然比一颗像素直接映射原图20*20只采样了2*2的纹理像素颜色进行线性插值要好得多,使用Mipmap就避免了采样的纹理像素过少而失真,

        理论上点对点的映射最为精确,而如果最邻近的子纹理跟20*20无法点对点采样映射,还可以设置多级渐远纹理的过滤方式

过滤方式 描述
GL_NEAREST_MIPMAP_NEAREST 使用最邻近的多级渐远纹理来匹配像素大小,并使用邻近插值进行纹理采样
GL_LINEAR_MIPMAP_NEAREST 使用最邻近的多级渐远纹理级别,并使用线性插值进行采样
GL_NEAREST_MIPMAP_LINEAR 在两个最匹配像素大小的多级渐远纹理之间进行线性插值,使用邻近插值进行采样
GL_LINEAR_MIPMAP_LINEAR 在两个邻近的多级渐远纹理之间使用线性插值,并使用线性插值进行采样

五、Mipmap的优点与缺点

  优点:

        1.质量高:避免了在远距离情况下的采样频率低和数据频率高造成的失真和摩尔纹,效果比无Mipmap好得多。

        2.性能好:避免了不使用Mipmap下距离远时采样频率低和数据频率高而照成texture cache命中率不高(相邻Pixel采样Texel时uv相差比较大)使性能下降。

  缺点:

         1.占用显存,可使用ue的纹理流缓存优化(IO换显存)。

六:UE4的纹理流缓存(多级渐变纹理的内存优化)

        UE4的纹理流缓存是动态的,在摄像机位置离物体远时,纹理流缓存会动态刷新目前位置的多级渐变纹理,所以在远的时候缓存区小,近的时候缓存区大,缓存的纹理大小随距离远近需求的纹理细节而改变.只有纹理细节大且多,占用显存过高的3A级别的游戏,才会使用纹理流缓存优化显存空间(IO换显存)。

Mipmap详解(有无Mipmap区别、原理、优点、缺点、优化)相关推荐

  1. 【转】OpenGL随笔(1)—— mipmap 详解

    [转]OpenGL随笔(1)-- mipmap 详解 注:本文使用的所有 OpenGL 函数来自 OpenGL 4.5,优先使用 DSA. 使用 mipmap 时,OpenGL 根据被映射对象的大小( ...

  2. otg usb 定位_详解USB OTG工作原理及其应用

    原标题:详解USB OTG工作原理及其应用 1994年,Intel,Compaq等七家软硬件全球知名企业为了突破当时PC使用串口和并口传输速度的限制,成立了通用串行 开发者论坛( Implemente ...

  3. php读取图片文件流,详解php文件包含原理(读取文件源码、图片马、各种协议、远程getshell等)...

    详解php文件包含原理(读取文件源码.图片马.各种协议.远程getshell等) 作者是namezz (看完图相当于做了一轮实验系列) 现有文件代码如下 1.png (21.16 KB, 下载次数: ...

  4. include详解 shell_详解php文件包含原理(读取文件源码、图片马、各种协议、远程getshell等) ......

    详解php文件包含原理(读取文件源码.图片马.各种协议.远程getshell等) 作者是namezz (看完图相当于做了一轮实验系列) 现有文件代码如下 include和include_once.re ...

  5. 算法:详解布隆过滤器的原理、使用场景和注意事项@知乎.Young Chen

    算法:详解布隆过滤器的原理.使用场景和注意事项@知乎.Young Chen 什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data struc ...

  6. Kubernetes Service详解(概念、原理、流量分析、代码)

    Kubernetes Service详解(概念.原理.流量分析.代码) 作者: liukuan73 原文:https://blog.csdn.net/liukuan73/article/details ...

  7. fdct算法 java_ImageSharp源码详解之JPEG压缩原理(3)DCT变换

    DCT变换可谓是JPEG编码原理里面数学难度最高的一环,我也是因为DCT变换的算法才对JPEG编码感兴趣(真是不自量力).这一章我就把我对DCT的研究心得体会分享出来,希望各位大神也不吝赐教. 1.离 ...

  8. 详解Oracle架构、原理、进程,学会世间再无复杂架构

    详解Oracle架构.原理.进程,学会世间再无复杂架构 学习是一个循序渐进的过程,从面到点.从宏观到微观,逐步渗透,各个击破,对于Oracle, 怎么样从宏观上来理解呢?先来看一个图,这个图取自于教材 ...

  9. 详解SYN Flood攻击原理与防范

    详解SYN Flood攻击原理与防范 SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,它是利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被 ...

最新文章

  1. 2022-2028年全球与中国青苔清洗剂市场研究及前瞻分析报告
  2. 用户空间和内核空间通讯之【proc文件系统】
  3. 概率统计:第七章 参数估计
  4. 浙江农林大学第二十一届程序设计竞赛校选拔赛(同步)
  5. PureXXX使用手记
  6. windows系统路径环境变量
  7. redis(17)--集群
  8. Pedestrian Identification (1) ——前景目标检测
  9. 深度学习之优化详解:batch normalization
  10. MSP, CMP傻傻分不清楚?一文读懂云管理的春天
  11. php mysql 复制数据库表结构图_MySQL_Mysql复制表结构、表数据的方法,本文给大家分享了好几种复制 - phpStudy...
  12. 3加密狗计算pin码_6 个芯片打造复古经典计算机:215 色显示,能编程能玩小游戏...
  13. Java关键字:synchronized
  14. SVM支持向量机,我用到的自学材料
  15. 系统更新链接服务器超时,win10系统更新导致Dr.com连接认证服务器超时的解决方法...
  16. 【原创】Kakfa log包源代码分析(一)
  17. 服务器和桌面操作系统有什么区别,服务器和桌面操作系统的区别
  18. android 缓存头像,android 实现类似微信缓存和即时更新好友头像
  19. Android 一款十分简洁、优雅的日记APP
  20. Gimp图像处理资料收集

热门文章

  1. 北邮人论坛登录页面测试用例
  2. 调用百度文字识别接口
  3. 三维电子沙盘开发教程 数字沙盘培训教程
  4. 名词性从句助动词,be动词,情态动词怎么变?两换一删,很简单!
  5. windows网络编程--学习笔记01
  6. div铺满全屏的三种方式
  7. fba海运是什么意思?FBA海运费用怎么算?
  8. java中文变成问号怎么解码_alpine 镜像 java 日志中文问号乱码
  9. 【时态】现在完成进行时
  10. Vertex and FragmentShader顶点与片段着色器