在qopenglfunctions.h中找不到glGenBuffers、glBindBuffer等函数。

4

我正在尝试使用qt 5.1.1和opengl渲染器以及着色器编写地图应用程序。我已经能够使用Glew显示顶点。但是我想使用qopenglfunctions.h中提供的函数。奇怪的是,即使我包含了这个文件,我仍然会得到“在此范围内未声明glGenBuffers”的错误。当我打开qopenglfunctions.h时,它就在那个文件里!有人遇到过这种奇怪的问题吗?代码相当长,但我添加了一些抛出链接器错误的内容。

initializeGLFunctions();
this->program=program;

glGenVertexArrays(1,&mapVAO); //This is where the linker throws an error
glBindVertexArray(mapVAO);

// Generate 2 VBOs
glGenBuffers(2, mapBuffer);
initMapBoundary();


void GeometryEngine::initMapBoundary()
{
     GLfloat mapSize=5.0f;
  VertexData boundary[] = {
    // Vertex data for face 0
    {QVector3D(-mapSize, -mapSize,  1.0), QVector2D(0, 0)},  // v0
    {QVector3D( mapSize, -mapSize,  1.0), QVector2D(20.0,0/*0.33, 0.0*/)}, // v1
    {QVector3D(-mapSize,  mapSize,  1.0), QVector2D(0,20/*0.0, 0.5*/)},  // v2
    {QVector3D( mapSize,  mapSize,  1.0), QVector2D(20.0,20.0/*0.33, 0.5*/)}, // v3
};


GLushort indices[] = {
    0,  1,  2,  3,
};


// Transfer vertex data to VBO 0
glBindBuffer(GL_ARRAY_BUFFER, mapBuffer[0]);
glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(VertexData), boundary, GL_STATIC_DRAW);

// Transfer index data to VBO 1
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mapBuffer[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 4 * sizeof(GLushort), indices, GL_STATIC_DRAW);

// Offset for position
quintptr offset = 0;

// Tell OpenGL programmable pipeline how to locate vertex position data
int vertexLocation = program->attributeLocation("a_position");
program->enableAttributeArray(vertexLocation);
// program->setAttributeBuffer(vertexLocation,GL_FLOAT,offset,3);
glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (const void *)offset);

// Offset for texture coordinate
offset += sizeof(QVector3D);

// Tell OpenGL programmable pipeline how to locate vertex texture coordinate data
int texcoordLocation = program->attributeLocation("a_texcoord");
program->enableAttributeArray(texcoordLocation);
glVertexAttribPointer(texcoordLocation, 2, GL_FLOAT, GL_FALSE, sizeof(VertexData), (const void *)offset);
//program->setAttributeBuffer(texcoordLocation,GL_FLOAT,offset,2);
}

就像我说的一样,我的Linux系统上所有这些工作都很正常,所以我相信代码没有太大问题。我只需要知道如何告诉Qt构建系统在Windows 7机器上选择正确的OpenGL驱动程序。显卡是Nvidia GT325m。


1
你可能需要在包含它的文件中添加 #define GL_GLEXT_PROTOTYPES - Jesus Ramos
你能贴出一个最小的代码片段来展示问题吗? - peppe
@JesusRamos,我已经做了这个。似乎没有用。顺便提一下,问题是OpenGL版本(正如Michael IV在其中一个答案中提到的)。我使用的是archlinux的qt5构建和mesa驱动程序。最终我使用glew得到了我所需要的。我的笔记本电脑太弱了,无法处理从源代码构建qt。 - Richard Macwan
从源代码构建qt只需要一段时间,我认为不应该崩溃。 - Jesus Ramos
它不会崩溃。就像我说的,我的笔记本太旧了,在编译过程中会发热并自动关机。 - Richard Macwan
1个回答

5

如果你使用Qt 5,那么常规方法将不起作用。问题在于预编译的Qt SDK(可能来自他们的网站)默认启用了GLES 2.0后端进行GL渲染。这意味着,您的glew头文件将会得到各种与qopenglfunction头文件中类似的声明错误。对于你来说,不幸的是,你将不得不使用opengl-desktop命令重新构建Qt源代码,这将为你删除ES2.0依赖项。另一种方法是使用Qt 4.8版本。


非常抱歉我没有表达清楚,我非常了解在Linux上使用Qt的GLES 2.0后端。(而且我已经在我的Linux机器上使用OpenGL -desktop选项构建了Qt)。然而,问题出现在我朋友的笔记本电脑上,他的电脑是Windows系统。他从Qt网站下载了预编译二进制文件,其中包含OpenGL。因此,问题出在Windows驱动程序上。 - Richard Macwan
至少在Windows上,Qt二进制安装程序提供两个版本,一个带有桌面OpenGL,另一个带有ANGLE。 - Ela782

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