我应该啥时候设置 GL_TEXTURE_MIN_FILTER 和 GL_TEXTURE_MIN_FILTER?

Posted

技术标签:

【中文标题】我应该啥时候设置 GL_TEXTURE_MIN_FILTER 和 GL_TEXTURE_MIN_FILTER?【英文标题】:When should I set GL_TEXTURE_MIN_FILTER and GL_TEXTURE_MAG_FILTER?我应该什么时候设置 GL_TEXTURE_MIN_FILTER 和 GL_TEXTURE_MIN_FILTER? 【发布时间】:2012-09-11 05:48:11 【问题描述】:

根据定义,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 行注释掉,结果还是正确的。

【问题讨论】:

您所说的“正在工作”和“不工作”是什么意思? 如果在您的情况下视口小于 1024×768,那么您将有效地进行缩小。 【参考方案1】:

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

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

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

所以你检查某个过滤器是否被使用的方法是垃圾,你的实现可能完全按照你理论上的想法。

所以总结一下:

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

    李>

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

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

【讨论】:

以上是关于我应该啥时候设置 GL_TEXTURE_MIN_FILTER 和 GL_TEXTURE_MIN_FILTER?的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该在 JavaScript 中使用 delete vs 将元素设置为 null? [复制]

我应该啥时候设置 GL_TEXTURE_MIN_FILTER 和 GL_TEXTURE_MIN_FILTER?

我啥时候应该在我的响应标头中真正将“Access-Control-Allow-Credentials”设置为“true”?

我应该啥时候在安装了 Flask 的 Dockerfile 中执行单元测试和集成测试?

C++ 标准库 - 我应该啥时候使用它,啥时候不应该使用它?

我啥时候应该在 C 中使用 malloc,啥时候不应该?