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

时间:2019-05-02 09:47:11

标签: opengl textures opengl-extensions

在我的(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 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支持的以下详细信息: enter image description here

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

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

2 个答案:

答案 0 :(得分: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功能是一些专利,这些专利直到最近才到期。

答案 1 :(得分:0)

各向异性值是浮点值,使用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);