Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何让各向异性过滤扩展正常工作?_C++_Opengl_Textures_Glfw_Opengl Extensions - Fatal编程技术网

C++ 如何让各向异性过滤扩展正常工作?

C++ 如何让各向异性过滤扩展正常工作?,c++,opengl,textures,glfw,opengl-extensions,C++,Opengl,Textures,Glfw,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_TEX

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

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


顺便说一句:我使用的是glfw3和GLADLoader。

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

glTexParameterf(GL_纹理_2D,GL_纹理_最大各向异性_EXT,值)

其中,
value
是浮点值。值得注意的是,尽管各向异性过滤在技术上不是德国劳埃德船级社标准的一部分,但它可以被视为是一个标准。也就是说,您可以依赖它在所有重要平台上的存在

如果要钳制到某个可用的最大各向异性,请尝试以下操作:

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);

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

glTexParameterf(GL_纹理_2D,GL_纹理_最大各向异性_EXT,值)

其中,
value
是浮点值。值得注意的是,尽管各向异性过滤在技术上不是德国劳埃德船级社标准的一部分,但它可以被视为是一个标准。也就是说,您可以依赖它在所有重要平台上的存在

如果要钳制到某个可用的最大各向异性,请尝试以下操作:

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);
这个
GLenum
值是在中定义的,这也是OpenGL 4.6的核心功能。目前还不清楚您正在使用什么机制来处理,以及您是否使用了特定的

但是,在您的另一个系统上,安装的系统
glext.h
或加载程序的某些头(如
glew.h
glad.h
或您使用的任何东西)可能不如您在另一个系统上使用的系统更新。因此,不会定义此值

在各向异性过滤的情况下,这不是一个大问题,因为提供了完全相同的功能,并且从2000年开始,所以您可以切换到常量
GL\u纹理\u MAX\u各向异性\u EXT
。该扩展之所以如此晚才被提升为
ARB
状态和核心GL功能,是因为一些专利,直到最近才最终过期

这个
GLenum
值是在中定义的,这也是OpenGL 4.6的核心功能。目前还不清楚您正在使用什么机制来处理,以及您是否使用了特定的

但是,在您的另一个系统上,安装的系统
glext.h
或加载程序的某些头(如
glew.h
glad.h
或您使用的任何东西)可能不如您在另一个系统上使用的系统更新。因此,不会定义此值


在各向异性过滤的情况下,这不是一个大问题,因为提供了完全相同的功能,并且从2000年开始,所以您可以切换到常量
GL\u纹理\u MAX\u各向异性\u EXT
。此扩展之所以如此晚才升级到
ARB
状态和核心GL功能,是因为一些专利最近才过期。

感谢您的链接,它帮助我更清楚地理解了这个问题。谢谢你的链接,它帮助我更清楚地理解这个问题。最后,你的建议解决了我所有的问题。我的问题是使用GlTexParameteri而不是glTexParameterf。我认为各向异性过滤的最大值是16.0f,所以我刚刚将value参数固定为16.0f。同样,在纹理加载的开始,我正在检查是否通过运行:glfwExtensionSupported(“GL_ARB_Texture_filter_各向异性”)来支持扩展。之后,条件标志决定是否使用各向异性过滤。非常感谢@BrettHale:“OP没有解决的过度设计的C++解决方案。问题中没有C++标签。”问题的第三个字表示他使用C++。所以C++及其标准库是很适用的。此外,你的回答没有提到标题。拉比的答案是肯定的。如果用户正在搜索这个问题,并且想知道如何检查扩展是否可见,那么他将找不到答案。这就是为什么我更改了标题以更好地匹配OP想要的内容。“OP的错误是调用
glTexParameteri
,而不是
glTexParameterf
”不,不是。实际上允许将此枚举与
i
变量一起使用。此外,C++编译器不会生成在这种情况下OP得到的错误消息。解决方案是,你实际上(悄悄地)从
GL\u TEXTURE\u MAX\u各向异性
(源自2017年的GL 4.6/
ARB\u TEXTURE\u filter\u各向异性
)切换到
\u EXT
变体(几十年来无处不在)。实际上,你的建议解决了我所有的问题。我的问题是使用GlTexParameteri而不是glTexParameterf。我认为各向异性过滤的最大值是16.0f,所以我刚刚将value参数固定为16.0f。同样,在纹理加载的开始,我正在检查是否通过运行:glfwExtensionSupported(“GL_ARB_Texture_filter_各向异性”)来支持扩展。在那之后,有条件的旗帜决定