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

Mesa + Linux : gl.h does not contain modern OpenGL

这是我目前使用的环境:Eclipse-Luna,C++11 on Linux Mint -Rebecca。

当我尝试像使用 VAO 或 VBO 一样使用现代 OpenGL 时,出现编译器错误,导致方法无法解析。

例如:

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:

再次尝试安装或更新软件包时,只会显示一切正常 up-to-date。

  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.

那么有没有一种方法可以解决这个问题而不用手动弄乱 include 目录?

如果没有,我如何获得最新的 header 适合我的 OpenGL 版本?

I checked the GL/gl.h, GL/glex.h and noticed that I have only got OpenGL 1.x methods in there.

对于GL/gl.h,这实际上是应该的样子。如果你想以 platform-independent 方式使用 OpenGL,你只能依赖 GL 1.1 由 GL lib 导出,并且也不应该在 header秒。 GL/glext.h 实际上应该包含更多内容。但默认情况下,它将 为较新的函数提供函数声明。 recent version of that file 总是可以从 OpenGL 网站获得,顺便说一句。

对于 GL 1.1 之后的所有内容,您应该使用 GL 的扩展机制,这基本上意味着您必须查询 每个 GL 函数 >= GL 1.2 的函数指针运行 时间。 glext.h header 提供函数指针类型声明、枚举常量和其他数据类型。所以这对于每个扩展来说基本上都是这样的(在这种情况下,新的核心功能被认为是 "extensions"):

#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 loading libraries which hanlde all this for you under the hood. And GLEW - 由于某种原因你已经安装了 - 就是其中之一,所以你可能想使用它。请注意,GLEW 本身存在一些问题,特别是在与现代核心配置文件 OpenGL 上下文结合使用时有些损坏,但它仍然可以使用。

我忘了说我已经在我的 headers 中包含了 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。