博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MipMap贴图原理
阅读量:5297 次
发布时间:2019-06-14

本文共 1768 字,大约阅读时间需要 5 分钟。

摘自:

    Mipmap在3D图形学中主要是用来做anti-aliasing,这跟图像学中的概念是一致的:图像在缩小时因为采样率不够,就会导致混叠现象,如果是线,就表现为断线,如果是纹理比较复杂,就表现为纹理变得杂乱。在图形学中,我们经常会用到纹理贴图(注意:图形学中的纹理与图像学中的是两个概念,图像中一般将图片中较复杂的区域,即频谱能量高的,称为纹理;图形学中将用来贴图的图片统称为纹理),用来贴图的纹理大小与真正要render的区域不一定是刚好匹配的,这样就需要做放大或缩小,如果缩小,也就会产生上面所述的混叠现象。

    图形学中经常会用到z值来控制物体的远近,有时会在一个多边形中用z值变化来生成纵深感很强的物体,这时在一个多边形内部的纹理贴图就会用到不同的缩小比率,如果只用原始的纹理去采样,就会在缩小比率大的地方(通常是z值大的地方)出现混叠。1983年,Lance willians在他的论文“Pyramidal Parametrics”中提出了一种解决上述问题的方法。他将原始纹理逐步做下采样(即图像缩小),从而生成一系列的不同大小的纹理,这些纹理被称为mipmap,使用时按照缩小比率来选择合适大小的纹理。比如,我们要用做贴图的纹理大小为 64x32,对它做下采样生成32x16,16x8,8x4,4x2,2x1,1x1的纹理,如果要render的区域大小为14x6,那么我们要么选16x8的纹理贴,要么选16x8与8x4的两块纹理做完线形平均的结果贴。

    这样看来,做mipmapping分为三个步骤,第一个步骤为选择合适的下采样方法来生成mipmaps。在图像学中,图像缩小时产生的混叠常用一些低通滤波器来减轻,即在缩小前先将图像做一个低通滤波。这个滤波器有多种选法,简单的可以是box平均滤波,复杂点可以是各向异性的滤波器,它常是由某些偏微分方程的数值解得到的,好处是在平滑的同时可以保持边缘的清晰度。这些在mipmapping中也可以使用,一般来说,我们都使用简单的box filter即可。

    第二个步骤就是计算缩小比率d,这是算法中的关键。这个算法也有好几类,我使用的是将像素看做是正方形的那一类,也是ES spec上给出的算法,即: d = sqrt( max((Ux^2 + Vx^2) , (Uy^2 + Vy^2)) );为了去掉乘法和开根号的运算,我又将其简化为:d = max((Ux + Vx) , (Uy + Vy));这个也满足spec上的要求。另一方面,如果对三角形中的每点都计算d,那就太费时间,所以就只对整个三角形算出一个d值,在内层循环中只对d做透视修正和下面的第三个步骤。如果是正投影,那内层循环就没有增加任何计算量。

    第三个步骤是根据d值确定选取哪一个mip做贴图对象。这个很简单,如果是linear_mipmaps_nearest,那么level = floor(log2(d+0.5));如果是linear_mipmaps_linear,level = floor(log2(d)); fraction =  d - floor(log2(d));用level层和level+1层的数据用fraction做混合后在贴图。

    从算法效果上来看,和OpenGL做出的结果基本一致,说明算法是正确的。从算法速度上来看,用GLBenchmark1.0 跑出的linear_mipmaps_nearest降了将近一成,linear_mipmaps_linear降了1.7成。

    一点讨论:此算法用linear_mipmaps_nearest时对我们应用的速度影响不太大,但是在level切换时能够比较明显看出切换动作;用linear_mipmaps_linear时看不出切换动作,可是对速度影响较大。另外,目前的box filter还是会造成过度模糊的现象。所以对于3D GUI等的应用,是清晰,快速,但是会闪烁重要呢?还是会平滑过渡无闪烁,但却模糊速度慢点更重要?这两者的权衡是个值得探讨的问题,还是要对具体应用具体分析了。

两个有用的网站:

                

一篇参考文章:

.

转载于:https://www.cnblogs.com/kfqcome/archive/2011/08/11/2136997.html

你可能感兴趣的文章
Visual studio之C# 调用系统软键盘(外部"osk.exe")
查看>>
linux远程win7教程
查看>>
移动应用开发选型:向左还是向右?
查看>>
开发进度一
查看>>
十天冲刺(6)
查看>>
加载selenium2Library失败---robotframework环境搭建(site-packages下无selenium2library文件夹)...
查看>>
MyBaits学习
查看>>
实体标签,媒体标签,飘动标签
查看>>
MySQL安装的详细步骤
查看>>
管道,数据共享,进程池
查看>>
Java基础--面向对象编程4(多态)
查看>>
CSS
查看>>
shell 管道和tee使用时获取前面命令返回值
查看>>
[LeetCode] 55. Jump Game_ Medium tag: Dynamic Programming
查看>>
[Cypress] Stub a Post Request for Successful Form Submission with Cypress
查看>>
[TypeScript] Understanding Generics with RxJS
查看>>
WordPress GRAND FlAGallery插件“s”跨站脚本漏洞
查看>>
程序集的混淆及签名
查看>>
java笔记
查看>>
MATLAB中subplot的用法
查看>>