如何使各向异性过滤扩展工作?
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.h
或 glad.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 会替换所有这些。以上是关于如何使各向异性过滤扩展工作?的主要内容,如果未能解决你的问题,请参考以下文章