-1

我一直在尝试在我的新 Arch linux 机器上开始使用 OpenGL 和 C++,但我只能使用 OpenGL 3.0 之前的函数。

例如,以下代码有效:

glBegin(GL_TRIANGLES);  
{  
glColor3f(0.0f,0.0f,1.0f);  
glVertex3f( 0.0f, 1.0f, 0.0f);  
glColor3f(0.0f,1.0f,0.0f);  
glVertex3f(-1.0f,-1.0f, 0.0f);  
glColor3f(1.0f,0.0f,0.0f);  
glVertex3f( 1.0f,-1.0f, 0.0f);  
}  
glEnd();

但以下没有:

GLuint vertexArrayID;
glGenVertexArrays(1, &vertexArrayID);
glBindVertexArray(vertexArrayID);

它找不到函数glGenVertexArraysglBindVertexArray,如 Eclipse 的输出所示:function glGenVertexArrays cannot be resolved.

那么是什么原因造成的呢?错误的图书馆链接?老司机?

我的glxinfo:
OpenGL renderer string: AMD Radeon HD 6450
OpenGL core profile version string: 4.3.12414 Core Profile Context 13.15.100.1 OpenGL core profile shading language version string: 4.30

4

4 回答 4

2

可能是链接错误或驱动程序旧,具体取决于您拥有的 GPU。你在使用GLEW吗?您应该链接到它以使用这些函数调用。

于 2013-08-17T18:34:52.217 回答
1

这是一个链接时间问题。在 OpenGL 中,GLX/EGL/WGL/... 用于在运行时加载扩展(更准确地说,是分配过程地址)。这意味着您没有包含正确的扩展头和/或没有链接到适当的库,因此链接器无法确定函数指针的位置。

此外,预处理器定义可能会阻止您的扩展库(例如 GLEW)为 GL API 的整个子集提供函数原型和/或符号;你应该参考你图书馆的文档。

这些函数仍然很有可能在运行时不可用(例如扩展未实现),但这将以 NULL 指针而不是链接器错误的形式出现。


另请注意,像 GLEW 这样的库需要随着每个新版本的 OpenGL 进行更新。它们为基于扩展规范的扩展提供函数原型、枚举等。这意味着在扩展规范发布之前编译的 GLEW 版本将不知道关于该扩展的任何信息 :)

如果您没有自己编译,或者您没有使用最近的代码库,那么您很可能正在使用早于 OpenGL 3.0 的 GLEW 版本。

于 2013-08-17T19:15:01.723 回答
0

添加第三方库(如 GL、GLU 或 GLUT)时会出现链接问题。编译器可能找不到 .lib 文件或 .dll 文件。某些函数(例如 glbegin() )之所以有效,是因为它们可能是在头文件中声明和定义的。glGenVertexArrays 不起作用,因为它仅在头文件中声明并在 .c 或 .cpp 文件上实现或定义。现在,如果链接未完成,您将收到错误消息: func 无法解析。

于 2013-08-17T21:26:33.797 回答
0

我想我找到了解决办法。我正在使用带有 AMD GPU 的 Arch Linux,所以有两个驱动程序:Mesa(开源)和 Catalyst(专有)。我正在使用催化剂,因为 mesa 不支持 opengl 3.0+。但我包括了 GL/gl.h,这是 mesa 的头文件。我通过包含 GL/glATI.h 解决了这个问题。

我不确定这是否是一个好的修复程序以及它是否适用于所有系统,但它似乎对我有用。

于 2013-08-20T02:03:01.840 回答