如何使各向异性过滤扩展工作?

Posted

技术标签:

【中文标题】如何使各向异性过滤扩展工作?【英文标题】:How do I get anisotropic filtering extensions to work? 【发布时间】:2019-05-02 09:47:11 【问题描述】:

在我的 (C++/OpenGL) 程序中,我正在加载一组纹理并设置纹理参数如下:

//TEXTURES
glGenTextures(1, &texture1);
glBindTexture(GL_TEXTURE_2D, texture1);
// set the texture wrapping parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
// set texture filtering parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

我发现各向异性过滤可以帮助我增强场景的外观。因此,我用这条线来实现它:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, 16);

虽然我在笔记本电脑(有 AMD GPU 供应商)上编译这行代码没有问题,但我无法使用 Intel(R) HD Graphics 530 (Skylake GT2) 在我的另一台计算机上编译这段代码. 具体来说,尝试使用 g++ 编译那段代码会输出以下错误:

error: ‘GL_TEXTURE_MAX_ANISOTROPY’ was not declared in this scope
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, 16);

更具体地说,在我的 Linux 终端中运行以下命令:

glxinfo | grep -i opengl

揭示了有关我的 GPU 供应商和 OpenGL 支持的以下详细信息:

我了解在 ARB_texture_filter_anisotropic 中启用了 ANISOTROPIC FILTERING,但老实说,我不知道如何检查我的 GPU 供应商是否支持该扩展,如果支持,我如何才能使用各向异性过滤?

顺便说一句:我正在使用 glfw3 和 GLAD 加载器。

【问题讨论】:

glfw.org/docs/latest/context_guide.html#context_glext_string 感谢您的链接,它帮助我更清楚地理解了问题。干杯 【参考方案1】:

各向异性值是一个浮点值,使用f前缀:例如,

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, value);

其中value 是一个浮点值。值得注意的是,尽管各向异性过滤技术上不是 GL 标准的一部分,但它可以被视为ubiquitous extension。也就是说,您可以依赖它在所有重要平台上的存在。

如果您想限制某个最大的各向异性,请尝试以下操作:

GLfloat value, max_anisotropy = 8.0f; /* don't exceed this value...*/
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, & value);

value = (value > max_anisotropy) ? max_anisotropy : value;
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, value);

【讨论】:

其实你的建议解决了我所有的问题。我的问题是使用 GlTexParameteri 而不是 glTexParameterf。我认为各向异性过滤的最大值是 16.0f,所以我刚刚将 value 参数固定为 16.0f。同样在纹理加载开始时,我正在通过运行检查扩展是否支持:glfwExtensionSupported("GL_ARB_texture_filter_anisotropic")。之后,条件标志决定是否使用各向异性过滤。非常感谢! @BrettHale:“OP 没有要求的过度设计的 C++ 解决方案。问题中没有 C++ 标签。”问题的第三个字说他正在使用C++。所以 C++ 及其标准库显然是适用的。此外,您的答案并未涉及 title。兔子的回答确实如此。如果用户正在搜索此问题并想知道如何检查扩展程序是否可见,那么他将找不到该答案。这就是为什么我更改了标题以更好地符合 OP 的要求。 "OP 的错误是调用glTexParameteri 而不是glTexParameterf" 不,不是。 as per the spec 实际上允许将此枚举与 i 变体一起使用。此外,在这种情况下,C++ 编译器 不会生成 OP 收到的错误消息。解决方案是您实际上(默默地)从 GL_TEXTURE_MAX_ANISOTROPY(源自 2017 年的 GL 4.6 / ARB_texture_filter_anisotropic)切换到 _EXT 变体(几十年来无处不在)。【参考方案2】:
error: ‘GL_TEXTURE_MAX_ANISOTROPY’ was not declared in this scope

这个GLenum 值是在GL_ARB_texture_filter_anisotropic 中定义的,这也是OpenGL 4.6 的核心特性。目前尚不清楚您正在使用哪种OpenGL extension 处理机制,以及您是否使用特定的GL loader library。

但是,在您的其他系统上,系统安装的 glext.h 或您的加载程序的某些标题(如 glew.hglad.h 或您使用的任何东西)可能不如您在其他系统。因此,不会定义此值。

在各向异性过滤的情况下,这不是什么大问题,因为 GL_EXT_texture_filter_anisotropic 提供完全相同的功能并且自 2000 年以来就已存在,因此您只需切换到常量 GL_TEXTURE_MAX_ANISOTROPY_EXT。这个扩展之所以这么晚才被提升到ARB 状态和核心 GL 功能是一些专利,最终直到最近才到期。

【讨论】:

感谢您的建议。实际上,我在问题的最后一句话中已经说过我使用 Glad loader。是的,我正在使用#define GLFW_INCLUDE_GLEXT #include <GLFW/glfw3.h>,它应该在包含 GLFW 库的情况下静默包含 glext 标头。我猜你说得对,我的一个系统上的 glext 标头可能比另一个系统上的更新。谢谢。 如果您使用glad,请先包含glad.h,最好不要尝试包含任何其他GL.h/glext.h 或其他任何内容,glad 会替换所有这些。

以上是关于如何使各向异性过滤扩展工作?的主要内容,如果未能解决你的问题,请参考以下文章

显卡特效中的各向异性过滤是啥

opengl 三线性和各项异性过滤

如何使magento过滤器像类别一样工作

Polymer 2.x - 如何使这个搜索过滤器工作?

CSS 特异性过滤器

Mipmap导致模型黑色接缝问题。