乌啦呀哈呀哈乌啦!

欢迎光临,这里是喵pass的个人博客,希望有能帮到你的地方

0%

MipMap

MipMap(多级纹理映射)是计算机图形学中用于提高渲染效率和图像质量的一种技术。在Unity 3D等游戏开发中,MipMap的作用主要体现在以下几个方面:

  • 减少模糊效果:当纹理在屏幕上缩小时,使用MipMap可以避免出现模糊和失真现象。MipMap的概念是为同一纹理创建多个采样级别,每个级别的分辨率逐渐降低。当物体离摄像机较远时,使用较低分辨率的纹理进行渲染,从而提供更清晰、自然的视觉效果。
  • 提高渲染效率:通过选择合适的MipMap级别,可以减少显存带宽的使用。这是因为较低分辨率的纹理占用的内存较少,传输到显卡时也能够更快速,从而提高渲染速度。
  • 减少锯齿现象:MipMap有助于减少远景物体的锯齿效果。当物体距离摄像机较远时,使用低分辨率的MipMap纹理能够更自然地显示物体的轮廓。
  • 支持纹理过滤:MipMap通常和各种纹理过滤技术(如双线性、三线性过滤)结合使用,进一步改善渲染质量。

在Unity中,开发者可以在材质的设置中开启MipMap,系统会自动为指定的纹理生成适当的MipMap级别,从而优化游戏的表现。总之,MipMap在Unity 3D中的作用是提高画面质量和渲染性能,使游戏体验更加流畅和真实。

纹理采样

我们对纹理采样进行显示的过程,可以理解为将屏幕上的一个像素(下文用像素表示)映射到纹理上的一个像素(下文用纹素表示),然后用纹理上的这个像素的颜色进行显示。

理想情况下,屏幕上的每个像素都可以正好对应到纹理上的一个纹素。

如上图这种情况,将3X3的纹理显示到3X3的屏幕上时,屏幕坐标(1,1)的像素对应的正好也是纹理上(1,1)的纹素。
图中黑点代表的是每个纹素的位置,红点代表的是屏幕像素映射到纹理上的位置(uv),此时只需要取对应纹素的颜色进行显示即可。

  • 这里的 UV 通常指归一化坐标,一般在 [0, 1] 范围内,可以理解为百分比位置,但实际用小数表示。例如 (0.5, 0.5) 表示纹理中心。它不是直接的纹素坐标。
  • 对于宽 W、高 H 的纹理:UV (u, v) 对应纹素空间的位置为 (u × W, v × H)。

但在实际情况中,纹理采样的范围与显示该纹理的屏幕范围并不是一一对应的;
并且在透视相机下,随着纹理所附着的物体与摄像机间的距离改变,其占据的屏幕空间的大小也会发生变化,也就是纹理覆盖的屏幕区域的大小会发生变化。这就会出现纹理过小和纹理过大两种情况。

纹理过小

当物体靠近透视相机,占据的屏幕空间变大,屏幕上更大范围的像素会被用来显示物体身上的纹理,就会出现纹理过小的情况。

比如上图3X3的纹理需要显示在6X6的屏幕范围上时,图中红点和黄点分别代表屏幕空间的前两个像素,此时二者都对应纹理空间的第一个纹素,且其采样位置也不是正好在纹素的位置。
可见,纹理过小时会出现多个像素拥挤到同一个纹理像素上,并且纹理与屏幕范围差距越大,拥挤到同一个纹素上的像素数量越多。此时可以采用:

  • 就近点采样(最近邻采样):根据 UV 选择最近的纹素中心,返回它的颜色。
  • 双线性过滤:混合周围几个纹素的颜色。

就近点采样



如上图所示,红点为屏幕像素映射到的位置,当使用就近点采样进行滤波时,会查找距离目标最近的纹素进行采样,也就是图中的蓝点对应的纹素。

就近点采样速度快,但问题也很明显,当纹理过小且纹理与屏幕范围差距较大时,如果采用就近点采样,就会导致大片的像素都采样到同一个颜色,使渲染出来的图像看起来一块一块的,颗粒感(或像素化)严重。

双线性插值



在双线性插值中,会考虑离采样点最近的四个纹素作为参考点,也就是上图中P1 P2 P3 P4四个蓝点
根据采样点与参考点的水平距离,对P1 P2进行插值得到新参考点P5的颜色、对P3 P4进行插值得到新参考点P6的颜色



之后根据采样点与参考点之间的纵向距离对新参考点P5P6进行插值,从而得到最终的采样颜色。

双线性插值通过两次插值计算,使采样结果在一定程度上反映出采样点附近的综合颜色,且速度也较快,是最常用的滤波方式。

纹理过大

当物体远离透视相机,占据的屏幕空间变小,物体身上的纹理只能被显示在屏幕上很少的几个像素上,就会出现纹理过大的情况。

当出现纹理过大时,如将6X6的纹理显示在4X4的屏幕范围内,一个屏幕像素内就需要塞下多个纹素,上图中红框和黄框分别代表相邻的2个屏幕像素对应的纹素范围。

由于一个像素无法包含如此多的颜色,因而会导致纹理信息丢失,并进一步导致相邻像素间颜色信息不连贯,从而产生摩尔纹或者锯齿化的现象(采样不足产生的混叠现象)。

  • 锯齿:斜线或物体边缘呈阶梯状。屏幕像素数量有限,无法准确表达连续的边界;物体移动时,边缘还可能闪烁
  • 摩尔纹:密集的重复图案出现原本不存在的条纹、波纹。例如远处的砖墙、格子地板,看起来产生大块明暗条带,移动时也可能闪烁

Mipmap

纹理过大问题的本质是一个像素无法表达多个纹素而导致的颜色信息丢失。
最直观的解决方案便是对单个屏幕像素覆盖的多个纹素进行多次采样,然后按照取平均值或者其他方式进行合并,以最终的合并结果作为采样得到的颜色值,也就是超采样技术。

实时超采样的开销无疑是巨大的,为了提升采样速度,我们可以按照一定范围将纹素提前进行合并,生成一张新的纹理,当需要进行超采样时,只要对新生成的纹理直接采样显示即可。
另外一个问题是,当物体与透视相机的距离发生改变,单个屏幕像素要表达的纹素数量也会发生变化,为了使采样结果更加可靠,我们可以以像素覆盖纹素的数量作为依据划分几个等级,计算每个等级需要合并的纹素范围,生成多张新纹理,在渲染时选择对应等级的新纹理进行采样。

以上便是MipMap的原理。

在MipMap中,以原始纹理作为Level 0。
将当前Level D的相邻四个像素进行合并,生成次一级的纹理Level D + 1。所以 Mipmap 每升一级,宽和高都减半。
在渲染时,根据相邻屏幕像素的UV坐标最大距离,算出每个屏幕像素覆盖的纹素范围L,然后对 L 取以 2 为底的对数即可得到对应的MipMap等级D。
最后从已经提前生成的Level D级的纹理中进行采样。


Credits

https://blog.csdn.net/zhiai315/article/details/138750976