什么是OpenGL中的Mipmapping?

时间:2014-03-27 09:02:48

标签: opengl filter interpolation

我对插值有基本知识:这是一种根据周围环境估算给定位置值的方法。因此,根据给定位置P,最近邻插值是选择网格中的最近邻居并复制其值。给定P在其间的两个网格点,线性插值是网格点的两个值的(线性)混合。如果P在半位置上,则从第一个值开始0.5,将第二个值的0.5加到结果值。对于二维,这称为双线性插值和三维三线性插值。

所以我知道Min Mag滤波器用于定义例如插值。 OpenGL纹理。例如。在此页http://gregs-blog.com/2008/01/17/opengl-texture-filter-parameters-explained/上,给出了下表:

Filter Combination                     | Bilinear | Bilinear | Mipmapping
(MAG_FILTER / MIN_FILTER)              | (Near)   | (FAR)    |
---------------------------------------+----------+----------+------------
GL_NEAREST / GL_NEAREST_MIPMAP_NEAREST | Off      | Off      | Standard
GL_NEAREST / GL_LINEAR_MIPMAP_NEAREST  | Off      | On       | Standard
GL_NEAREST / GL_NEAREST_MIPMAP_LINEAR  | Off      | Off      | Trilinear filtering
GL_NEAREST / GL_LINEAR_MIPMAP_LINEAR   | Off      | On       | Trilinear filtering
GL_NEAREST / GL_NEAREST                | Off      | Off      | None
GL_NEAREST / GL_LINEAR                 | Off      | On       | None
GL_LINEAR / GL_NEAREST_MIPMAP_NEAREST  | On       | Off      | Standard
GL_LINEAR / GL_LINEAR_MIPMAP_NEAREST   | On       | On       | Standard
GL_LINEAR / GL_NEAREST_MIPMAP_LINEAR   | On       | Off      | Trilinear filtering
GL_LINEAR / GL_LINEAR_MIPMAP_LINEAR    | On       | On       | Trilinear filtering
GL_LINEAR / GL_NEAREST                 | On       | Off      | None
GL_LINEAR / GL_LINEAR                  | On       | On       | None

同一页面解释了Min Filter适用于比纹理(远物体)和Mag滤镜更小的物体,适用于大于纹理(靠近物体)的物体。不过,考虑到3D纹理,如果将GL_LINEAR设置为两个滤镜,则插值方法应始终为三线性。

2 个答案:

答案 0 :(得分:3)

纹理插值仅在纹理的单个像素分布在显示器的多个像素上时才有效。如果纹理足够远以至于显示像素大于纹理像素,则根本不会显示某些纹理像素,导致锯齿状,杂乱的外观。

这是mipmapping的用法:不是单个版本的纹理,而是通过缩小纹理并将相邻像素混合在一起来创建多个版本,每个版本都比前一个版本小。这称为mipmap,传统上不同的版本只是最后一个版本的一半。显示纹理时,渲染器将选择在多个显示像素上传播纹理像素的最大版本,并在其上进行插值。

但这又有一个问题:纹理版本之间的过渡会在显示中产生一条突然的线条。对此的解决方案是三线性过滤:渲染器不是简单地在纹理中的像素之间进行插值,而是在纹理的版本之间进行插值。

答案 1 :(得分:0)

纹理mipmap是纹理的不同版本。例如,远程对象将在常见场景中使用较小分辨率版本的纹理,这有助于提高性能,甚至可以通过增加内存使用的成本来解决锯齿伪像。您甚至可以为采样器中的mipmap设置插值方法,例如最近邻居交换mipmap,但它们之间会有线性淡化。