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

xpszyzbs  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(136)

在我的(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 GT 2)。特别是,尝试使用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供应商是否支持该扩展,如果他支持,我如何才能使用各向异性过滤?
顺便说一句:我正在使用glfw 3和GLAD加载程序。

7xzttuei

7xzttuei1#

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

vof42yt12#

error: ‘GL_TEXTURE_MAX_ANISOTROPY’ was not declared in this scope

GLenum值是在GL_ARB_texture_filter_anisotropic中定义的,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功能的原因是一些专利,这些专利最近才到期。

相关问题