1

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

在此处输入图像描述

我知道 ANISOTROPIC FILTERING 已在 中启用ARB_texture_filter_anisotropic,但老实说,我不知道如何检查我的 GPU 供应商是否支持扩展,如果他支持,我如何才能使用 ANISOTROPIC 过滤?

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

4

2 回答 2

2
error: ‘GL_TEXTURE_MAX_ANISOTROPY’ was not declared in this scope

这个GLenum值是在 中定义的GL_ARB_texture_filter_anisotropic,这也是 OpenGL 4.6 的核心特性。目前尚不清楚您正在使用哪种OpenGL 扩展处理机制,以及您是否使用特定的GL 加载程序库

但是,很可能在您的其他系统上,系统安装glext.h或加载程序的某些标头(如您使用的glew.hglad.h其他任何内容)不如您在其他系统上使用的最新。因此,不会定义此值。

在各向异性过滤的情况下,这不是一个大问题,因为GL_EXT_texture_filter_anisotropic提供完全相同的功能并且自 2000 年以来就已经存在,因此您可以切换到常量GL_TEXTURE_MAX_ANISOTROPY_EXT。这个扩展之所以这么晚才被提升为ARB状态和核心 GL 功能是一些专利,这些专利最终直到最近才到期。

于 2019-05-02T18:36:04.120 回答
2

各向异性值是一个浮点值,使用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);
于 2019-05-02T10:42:24.733 回答