如何让各向异性过滤扩展起作用?
How do I get anisotropic filtering extensions to work?
在我的(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
中启用了各向异性过滤,但老实说,我不知道如何检查我的 GPU 供应商是否支持该扩展,如果支持,我该如何实现可以使用 ANISOTROPIC 过滤吗?
顺便说一句:我正在使用 glfw3 和 GLAD 加载程序。
各向异性值是一个浮点值,使用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);
error: ‘GL_TEXTURE_MAX_ANISOTROPY’ was not declared in this scope
此 GLenum
值是在 GL_ARB_texture_filter_anisotropic
, which is also a core feature of OpenGL 4.6. It is not clear what mechanisms for OpenGL extension handling you are using, and if you use a particular GL loader library 中定义的。
然而,在您的其他系统上,system-installed glext.h
或您的加载程序的某些 header 可能是 glew.h
或 glad.h
或其他你使用的,不像你在其他系统上使用的那样新。因此,将不会定义此值。
在各向异性过滤的情况下,这不是一个大问题,因为 GL_EXT_texture_filter_anisotropic
提供完全相同的功能并且从 2000 年开始就存在,所以您可以切换到常量 GL_TEXTURE_MAX_ANISOTROPY_EXT
.此扩展这么晚才提升到 ARB
状态和核心 GL 功能的原因是一些专利,这些专利最近才到期。
在我的(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
中启用了各向异性过滤,但老实说,我不知道如何检查我的 GPU 供应商是否支持该扩展,如果支持,我该如何实现可以使用 ANISOTROPIC 过滤吗?
顺便说一句:我正在使用 glfw3 和 GLAD 加载程序。
各向异性值是一个浮点值,使用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);
error: ‘GL_TEXTURE_MAX_ANISOTROPY’ was not declared in this scope
此 GLenum
值是在 GL_ARB_texture_filter_anisotropic
, which is also a core feature of OpenGL 4.6. It is not clear what mechanisms for OpenGL extension handling you are using, and if you use a particular GL loader library 中定义的。
然而,在您的其他系统上,system-installed glext.h
或您的加载程序的某些 header 可能是 glew.h
或 glad.h
或其他你使用的,不像你在其他系统上使用的那样新。因此,将不会定义此值。
在各向异性过滤的情况下,这不是一个大问题,因为 GL_EXT_texture_filter_anisotropic
提供完全相同的功能并且从 2000 年开始就存在,所以您可以切换到常量 GL_TEXTURE_MAX_ANISOTROPY_EXT
.此扩展这么晚才提升到 ARB
状态和核心 GL 功能的原因是一些专利,这些专利最近才到期。