c – 我应该何时设置GL_TEXTURE_MIN_FILTER和GL_TEXTURE_MAG_FILTER?

前端之家收集整理的这篇文章主要介绍了c – 我应该何时设置GL_TEXTURE_MIN_FILTER和GL_TEXTURE_MAG_FILTER?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_0@
根据定义,当纹理化的像素映射到大于一个纹理元素的区域时,使用GL_TEXTURE_MIN_FILTER.

假设我有一个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_TEXTURE_MIN_FILTER的设置,纹理不再起作用了.由此可以得出结论,在纹理化过程中使用了min过滤器.确切地说,这种做法是错误的.

当没有设置最小过滤器时,它不会神奇地不起作用.相反,使用了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过滤器可能是最好的想法,并且无需考虑实际使用哪个过滤器.

原文链接:https://www.f2er.com/c/119550.html

猜你在找的C&C++相关文章