重新认识下MipMap

        在看闫老师的图形学视频课程以前,我对MipMap一直以来的理解是:它可以对一个纹理贴图生成若干个更小分辨率的图,这样可以在远处时使用较低分辨率的图,在近处使用高分辨率的图,从而优化性能,但对于俯视角游戏则没必要使用了,因为基本不会有远处和近处的区别。但在看完闫老师关于MipMaps的讲解以后,我发觉自己原来对MipMap的理解其实是有误解的,我自认为理解的也算对,但不全面,因为以前并不是系统的学习了图形学才知道的,是通过人云亦云的方式了解到的MipMap的概念。
        首先,需要了解为什么要引入MipMap,假如我们要把一个2维的256X256大小的贴图渲染到1024X1024这么大的屏幕像素上的话,对于屏幕像素而言在根据纹理的UV进行采样时,因为无法做到一一对应,那么只能让每个像素渲染成对应的纹理上的最近的文素点的颜色,这就导致可能有16个点要渲染成一个颜色,因为1024X1024刚好是256X256的16倍大小,这样的结果就是会出现我们常见的图像马赛克,显得很不清晰,这个其实很常见,也很好理解。那反过来对于假如要把一个高分辨率的纹理,渲染到一个低分辨率的屏幕像素上呢?其实同样会出问题,如视频里下面这样图一样:

近处出现锯齿,远处出现摩尔纹,归根结底就是会出现:走样。那是什么原因产生的呢,因为在透视相机下,近大远小,如果还是用之前说的找最近的纹理像素值作为渲染那个屏幕像素的颜色的话,对于近处,那么屏幕上的一个像素对应到纹理贴图上的大小就是很小的一部分,但是对于远处,屏幕像素的一个点,可能要对应纹理图上的一大片地方。说的简单点就是比如图里的方块,对于近处的方块,你需要屏幕上的很多像素才能代表这一个方块,但是对于远处,甚至接近地平线的地方,可能 一个像素点就代表了一个方块。所以才会产生走样的现象。而MipMap的引入,就可以解决这个走样问题,因为它可以使得近处使用大一点的贴图,远处使用小一点的贴图。而代价是会增加三分之一的内存占用,但从渲染质量来说,这个代价其实很小了。
        那么回到我以前的理解,首先,mipmap是近处使用高分辨率图,远处使用低分辨率图这个没问题,但我以前以为的优化和说俯视角不用考虑,这就要说清楚了:优化指的是图像表现力的优化,而非性能优化,具体就是抗锯齿和防摩尔纹。而俯视角也要看是否是透视相机,还有这个角度具体到多少,能否看到一点远处,比如对于不是完全垂直地面的那种视角的游戏,就是说还是能看到远处的东西的情况下,还是应该打开MipMap的,这样能解决渲染的走样问题。

fantasycoding.net 2016-2024 © All rights Reserved京ICP备2020039454号-1