我应该何时设置GL_TEXTURE_MIN_FILTER和GL_TEXTURE_MAG_FILTER?

时间:2012-09-11 05:48:11

标签: c++ opengl textures

根据定义,当纹理像素映射到大于一个纹理元素的区域时,使用 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 行,结果仍然正确。

1 个答案:

答案 0 :(得分:12)

根据我的理解,你注释掉GL_TEXTURE_MIN_FILTER的设置,纹理不再起作用了。由此可以得出结论,在纹理化过程中使用了min过滤器。确切地说,这种做法是错误的。

当没有设置最小过滤器时,它不会神奇地不起作用。相反,使用了默认值GL_NEAREST_MIPMAP_LINEAR,因为你没有为其他mipmap图层指定纹理图像,所以它不起作用(我想你自己猜对了)。但是,如果min滤镜实际用于某个像素,则结果并非错误。无论使用什么过滤器,纹理都不会起作用,因为它是不完整的(即使用mipmapping而不是每个mipmap级别没有有效的图像)。所以它也不适用于磁过滤。它不是破碎的过滤器,而是整个纹理。

另一方面,GL_TEXTURE_MAG_FILTER没有mipmapping模式,当你没有设置它时,它使用默认的GL_LINEAR。所以纹理总是完整无缺,无论你是否设置了磁过滤器。

因此,检查是否使用某个过滤器的方法是垃圾,您的实现可能正是您理论上所做的。

总结如下:

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

  2. 最好明确设置每个纹理对象的过滤模式,使其不依赖于您可能不确定的任何默认值。

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

相关问题