一些OpenGL功能正常工作,一些不工作

时间:2013-08-17 18:29:41

标签: c++ opengl opengl-3

我一直在尝试在我的新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 个答案:

答案 0 :(得分:2)

根据您拥有的GPU,它可能是糟糕的链接或旧驱动程序。你在使用GLEW吗?您应该链接到那些以使用这些函数调用。

答案 1 :(得分:1)

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

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

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


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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

我不确定这是否是一个很好的解决方案,如果它适用于所有系统,但它似乎对我有用。