我应该何时设置GL_TEXTURE_MIN_FILTER和GL_TEXTURE_MAG_FILTER?

Xin*_*ing 9 c++ opengl textures

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

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

glOrtho(0, 1024, 0, 768, 0, 1);
Run Code Online (Sandbox Code Playgroud)

并且矩形设置为:

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);
Run Code Online (Sandbox Code Playgroud)

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

然而在测试之后我发现MIN_FILTER正在为这个配置工作.即使我将矩形的大小加倍,即2048*1536,并且在视口中只显示左下角,它仍然是MIN_FILTER正在运行.

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

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

Chr*_*ica 15

据我了解,你注释掉设置,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屏幕),那么使用GL_NEARESTmin和mag滤镜可能是最好的想法,并且让你无需考虑实际使用哪个滤镜.