假设我有一个1024 * 768分辨率的纹理,我想将它映射到一个矩形.使用以下公式设置投影矩阵:
glOrtho(0,1024,768,1);
并且矩形设置为:
glTexCoord2f(0.0f,0.0f); glVertex3f(0.0f,0.0f,0.0f); glTexCoord2f(1.0f,0.0f); glVertex3f(1024.0f,1.0f); glVertex3f(1024.0f,768.0f,0.0f); glTexCoord2f(0.0f,1.0f); glVertex3f(0.0f,0.0f);
根据当前配置,我的理解是矩形上的每个像素都映射到纹理中的一个像素.
然而在测试之后我发现MIN_FILTER正在为这个配置工作.即使我将矩形的大小加倍,即2048 * 1536,并且在视口中只显示左下角,它仍然是MIN_FILTER正在运行.
在这种情况下,我个人的理解是,视口中的每个像素仅映射到纹理中的四分之一像素,为什么它仍然在MIN_FILTER工作?
为了测试哪个过滤器正在工作,我只是注释掉设置该过滤器的行,看看结果是否错误.如果我注释掉MIN_FILTER设置行,结果将是完全黄色,因为我没有将纹理的最大级别设置为与其级别一致.但是如果我注释掉MAG_FILTER行,结果仍然是正确的.
解决方法
当没有设置最小过滤器时,它不会神奇地不起作用.相反,使用了GL_NEAREST_MIPMAP_LINEAR的默认值,因为您没有为其他mipmap图层指定纹理图像,所以它不起作用(我猜你自己以某种方式猜对了).但是,如果min滤镜实际用于某个像素,那么结果并不是错误的.无论使用什么过滤器,纹理都不会起作用,因为它是不完整的(即使用mipmapping而不是每个mipmap级别没有有效的图像).所以它也不适用于磁过滤.它不是破碎的过滤器,而是整个纹理.
另一方面,GL_TEXTURE_MAG_FILTER没有mipmapping模式,当你不设置它时,它使用默认的GL_LINEAR.所以无论你是否设置了磁过滤器,纹理总是完整无缺.
因此,检查是否使用某个过滤器的方法是垃圾,您的实现可能正是您在理论上所做的.
总结如下:
>您不需要为纹理对象设置min和mag过滤器.如果不这样做,他们将使用默认值.但默认情况下,min-filter使用mipmapping并要求您为每个mipmap级别指定图像,否则纹理不完整(即不起作用),无论对特定片段使用什么过滤器.>总是明确地为每个纹理对象设置过滤模式,以便不依赖于您可能不确定的任何默认值,这是一个好主意.>当一个像素的大小完全(在这个上下文中“完全”是什么?)匹配纹素的大小时,很难说两种过滤模式中的哪一种被使用,但是没有简单的方法可以检查哪一个是用于特定片段.但是如果你需要像素完美纹理(比如只是将位图绘制到2D屏幕),那么使用GL_NEAREST进行min和mag过滤器可能是最好的想法,并且无需考虑实际使用哪个过滤器.