10

根据定义,当被纹理化的像素映射到大于一个纹理元素的区域时,使用GL_TEXTURE_MIN_FILTER 。

假设我有一个分辨率为 1024*768 的纹理,我想将它映射到一个矩形。投影矩阵使用以下方法设置:

glOrtho(0, 1024, 0, 768, 0, 1);

并且矩形设置为:

glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1024.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1024.0f, 768.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 768.0f, 0.0f);

在当前配置下,我的理解是矩形上的每个像素都映射到纹理中的一个像素。

然而经过测试,我发现MIN_FILTER正在为此配置工作。即使我将矩形的大小加倍,即 2048*1536 并且视口中只显示左下角,它仍然是 MIN_FILTER 起作用。

在这种情况下,我个人的理解是,视口中的每个像素只映射到纹理中的四分之一像素,为什么MIN_FILTER还在工作?

为了测试哪个过滤器在工作,我只是注释掉设置过滤器的行,看看结果是否错误。如果我注释掉MIN_FILTER设置行,结果将是完全黄色的,因为我没有设置纹理的最大级别以符合其级别。但是如果我注释掉MAG_FILTER行,结果仍然是正确的。

4

1 回答 1

15

据我了解,您将设置注释掉GL_TEXTURE_MIN_FILTER并且纹理不再起作用。由此得出结论,在纹理化期间使用了最小过滤器。正是这种推论是错误的。

当不设置最小过滤器时,它不会神奇地不起作用。取而代之的GL_NEAREST_MIPMAP_LINEAR是使用默认值,并且由于您没有为其他 mipmap 图层指定纹理图像,因此它不起作用(我认为您自己猜到了)。但这并不是说只有在 min filter 实际用于某个像素的情况下,结果才会出错。无论使用什么过滤器,纹理都不会起作用,因为它是不完整的(即使用 mipmaping 而没有每个 mipmap 级别的有效图像)。所以它也不适用于磁过滤。坏掉的不是滤镜,而是整个质感。

另一方面,GL_TEXTURE_MAG_FILTER没有 mipmapping 模式,当你不设置它时,它使用默认的GL_LINEAR. 因此,无论您是否设置了磁过滤器,纹理始终是完整且有效的。

因此,您检查是否使用了某个过滤器的方法是垃圾,并且您的实现可能完全按照您理论上的想法进行。

所以得出结论:

  1. 您不需要为纹理对象设置 min 和 mag 过滤器。如果您不这样做,他们将使用默认值。但默认情况下,min-filter 使用 mipmapping 并要求您为每个 mipmap 级别指定图像,否则纹理是不完整的(即无法工作),无论对特定片段使用什么过滤器。

  2. 始终为每个纹理对象显式设置过滤器模式以不依赖于您可能不确定的任何默认值是一个好主意。

  3. 当一个像素的大小恰好(在这个上下文中“究竟”是什么?)与一个纹素的大小相匹配时,很难说使用了两种过滤模式中的哪一种,但是没有简单的方法来检查使用了哪一种对于特定的片段。但是,如果您无论如何都需要像素完美的纹理(例如仅将位图绘制到 2D 屏幕),那么GL_NEAREST同时使用 min 和 mag 过滤器可能是最好的主意,并且让您不必考虑实际使用哪个过滤器。

于 2012-09-11T09:54:50.473 回答