如何让各向异性过滤扩展发挥作用?

Nuw*_*nda 1 c++ opengl textures glfw opengl-extensions

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

\n\n
//TEXTURES\nglGenTextures(1, &texture1);\nglBindTexture(GL_TEXTURE_2D, texture1);\n// set the texture wrapping parameters\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n// set texture filtering parameters\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, 16);\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
error: \xe2\x80\x98GL_TEXTURE_MAX_ANISOTROPY\xe2\x80\x99 was not declared in this scope\n glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, 16);\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
glxinfo | grep -i opengl\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

在此输入图像描述

\n\n

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

\n\n

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

\n

Bre*_*ale 5

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

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, value);

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

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

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);
Run Code Online (Sandbox Code Playgroud)

  • “OP 的错误是调用 `glTexParameteri` 而不是 `glTexParameterf`” 不,不是。实际上允许将此枚举与“i”变体一起使用[根据规范](https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_texture_filter_anisotropic.txt)。此外,_C++ 编译器_ 不会生成 OP 在这种情况下收到的错误消息。解决方案是,您实际上(默默地)从“GL_TEXTURE_MAX_ANISOTROPY”(源自 2017 年的 GL 4.6 /“ARB_texture_filter_anisotropic”)切换到“_EXT”变体(数十年来无处不在)。 (2认同)