Mesa + Linux:gl.h文件不包含现代OpenGL

3
这是我目前使用的环境:Eclipse-Luna, C++11在Linux Mint-Rebecca上。
当我尝试使用现代OpenGL,如VAOs或VBOs时,我会遇到编译器错误,例如无法解析方法。
例如:
GLuint VaoID;                   //GLuint is working

glGenVertexArrays(1, &VaoID);

或者:

GLuint VboID;              
glGenBuffers(1, &VboID);
glBindBuffer(GL_ARRAY_BUFFER, VboID);
glBufferData(GL_ARRAY_BUFFER, vbo_size, data, usage);

我查看了GL/gl.h和GL/glext.h文件,发现只有OpenGL 1.x的方法。

然后我检查了我的OpenGL版本,使用命令glxinfo|grep "OpenGL"。看起来一切都正常:

glxinfo|grep "OpenGL" 
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) Haswell Mobile 
OpenGL core profile version string: 3.3 (Core Profile) Mesa 10.1.3
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 10.1.3
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:

尝试再次安装或更新软件包时,只会指出一切都是最新的。

  sudo apt-get install freeglut3 freeglut3-dev libglew1.5 libglew1.5-dev libglu1-mesa libglu1-mesa-dev libgl1-mesa-glx libgl1-mesa-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Note, selecting 'libglew1.5-dev' for regex 'libglew1.5'
Note, selecting 'libglew-dev' instead of 'libglew1.5-dev'
Note, selecting 'libglew-dev' instead of 'libglew1.5-dev'
freeglut3 is already the newest version.
freeglut3-dev is already the newest version.
libglew-dev is already the newest version.
libglu1-mesa is already the newest version.
libglu1-mesa-dev is already the newest version.
libgl1-mesa-dev is already the newest version.
libgl1-mesa-glx is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 150 not upgraded.

那么,有没有一种方法可以在不手动更改包含目录的情况下解决这个问题呢?

如果没有,我该如何获取适合我的OpenGL版本的最新标头文件呢?


在包含 #include <GL/glew.h> 并使用 -lGLEW 编译后,您是否仍然遇到此错误?我在这里尝试过,GLEW 具有所提到的方法。另外,请检查这些答案是否有帮助。 - wendelbsilva
我会尝试的。但可能需要一些时间。谢谢。 - user1997675
2个回答

3
我查看了GL/gl.h和GL/glex.h,发现只有OpenGL 1.x的方法。
对于GL/gl.h,实际上就是应该这样。如果您想以跨平台的方式使用OpenGL,则只能依赖于GL库导出的GL 1.1,并且在头文件中也不应假设任何其他内容。GL/glext.h实际上应该包含更多内容。但默认情况下,它不会为新功能提供函数声明。顺便说一句,可以从OpenGL网站上获取该文件的最新版本

对于所有超出GL 1.1的内容,您应该使用GL的扩展机制,这基本上意味着您必须在运行时查询每个GL函数的函数指针(包括GL 1.2及以上版本)。glext.h头文件提供了函数指针类型声明、枚举常量和其他数据类型。因此,对于每个扩展(以及在此上下文中被视为“扩展”的新核心功能),基本上是这样的:

#ifndef GL_ARB_vertex_buffer_object
#define GL_ARB_vertex_buffer_object 1
// new types
typedef ptrdiff_t GLsizeiptrARB; 
typedef ptrdiff_t GLintptrARB;
// constants for GLenum values
#define GL_BUFFER_SIZE_ARB                0x8764
#define GL_BUFFER_USAGE_ARB               0x8765
#define GL_ARRAY_BUFFER_ARB               0x8892
// ...
// function pointer tpes for every function
typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers);
// ...
#ifdef GL_GLEXT_PROTOTYPES
// function declatations
GLAPI void APIENTRY glBindBufferARB (GLenum target, GLuint buffer);
GLAPI void APIENTRY glDeleteBuffersARB (GLsizei n, const GLuint *buffers); 
// ...
#endif
#endif /* GL_ARB_vertex_buffer_object */

所以函数声明仅在定义了GL_GLEXT_PROTOTYPES时才有效。但你不应该这样做。它只有在GL库恰好导出这些符号时才起作用,在大多数平台上并不需要这样做。通常情况下,人们不想手动加载数百个GL函数指针。有几个OpenGL加载库可以在幕后为您处理所有这些内容。而GLEW - 您已经安装了某种原因 - 是其中之一,因此您可能想要使用它。请注意,GLEW本身存在一些问题,特别是在与现代核心配置文件OpenGL上下文一起使用时会有些问题,但仍然可以使用。

非常感谢你的回答。它帮助我找到了解决方案。结果发现包含文件的顺序引起了问题。请查看我的回答以获取详细信息。 - user1997675

1

我忘了提到我已经在我的头文件中包含了GL/glew.h。但是这并没有解决编译错误。我用eclipse检查了glew.h文件,它显示了几个错误消息。标记有错误的最顶部行看起来像这样:

#error glext.h included before glew.h

显然,这里包含的顺序很重要。经过一番摸索,问题归结为代码的一个非常简单的更改。这就是我所拥有的:
#include <GLFW/glfw3.h>
#include <GL/glew.h>

解决方案看起来像这样:

#include <GL/glew.h>
#include <GLFW/glfw3.h>

所以我只是交换了这两行代码,然后它就起作用了。再次感谢您的建议。
此外,我完全删除了GL/gl.h。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接