1

我在 Ubuntu 上,使用 OpenGL、GLEW 和 GLFW 编写应用程序。我使用 Eclipse 作为我的 IDE,但在尝试使用glGenRenderbuffer等函数时遇到问题。我在 Windows 下设置了一个非常相似的结构,但无法让它在 Linux 上运行。

我正在链接到库glfwGLEW。我能够编译和运行我的应用程序的一部分,并且可以初始化 GLFW 和 GLEW。从这些测试运行中,我了解到以下内容:

OpenGL version: 4.2.0 NVIDIA 304.64
Using GLEW 1.6.0

但是,我无法编译函数glGenRenderbuffer(或其他帧缓冲区函数)。我曾尝试将 EXT 和 ARB 添加到名称中,以及在没有任何运气的情况下使用 glex.h。据我所知,GLEW 的目的是处理所有的扩展问题,对吧?

包含的源文件 ( VolumeRenderer.cpp ) 是这样完成的:

#include <glm/gtc/matrix_transform.hpp>
#include <VolumeRenderer.h>
#include <GL/glew.h>
#include <GL/glfw.h>

再往下,我正在尝试使用这样的功能(当然只是部分完整的功能):

bool VolumeRenderer::InitFramebuffers()
{
  glGenRenderbuffers(1, &renderBufferObject_);
  return true;
}

我得到的只是“无法解析函数'glGenRenderBuffers'”。

查看我包含的 GL/glew.h 标头,我发现了以下几行:

#define glGenRenderbuffers GLEW_GET_FUN(__glewGenRenderbuffers)
#define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT)

但是编译器仍然找不到该函数。有什么我忘记的吗,或者我可以运行一些测试和检查来看看发生了什么?

4

1 回答 1

2

好的,所以我通过基本上将我的 Eclipse 项目文件逐个文件复制到一个新的空项目中来让它工作。不过,在那之前我还做了一些其他的事情。首先,我按照有用的评论中的建议移动了包含。我还删除了 glm 之类的东西。没有成功!然后我用一个 .cpp 文件在 Eclipse 中创建了一个简单的项目,并链接到 glfw 和 GLEW:

#include <GL/glew.h>
#include <GL/glfw.h>
#include <iostream>
#include <cstdlib>

int main()
{
  if (glfwInit() != GL_TRUE) {
    std::cout << "glfwInit() failed\n";
    exit(1);
  }
  if (!glfwOpenWindow(800, 600, 8 , 8, 8, 8, 8, 8, GLFW_WINDOW)) {
    std::cout << "glfwOpenWindow() failed\n";
    exit(1);
  }
  char *glVersion = (char*)glGetString(GL_VERSION);
  if (glVersion) {
    std::cout << "OpenGL version: " << glVersion << "\n";
  }
  GLenum err = glewInit();
  if (err != GLEW_OK) {
    std::cout << "GLEW init failed: " << glewGetErrorString(err) << "\n";
    exit(1);
  } else {
    std::cout << "Using GLEW " << glewGetString(GLEW_VERSION) << "\n";
  }
  GLuint buf;
  glGenRenderbuffers(1, &buf);
  exit(0);
}

这就像一个魅力。然后我尝试通过使用类似文件和包含结构制作另一个项目来重新创建我的旧问题,它似乎也可以正常工作。然后我开始了第三个空项目,我只是简单地复制了最初给我带来麻烦的文件。现在我有一个原始项目的精确副本(现在包含顺序已更改)与完全相同的库链接到它,并且它可以工作。我仍然不知道发生了什么,但我怀疑我在 Eclipse 中的项目不知何故搞砸了,即使我做了一些更改,也从未恢复过。

于 2013-03-28T16:03:08.030 回答