1

私は Ubuntu を使用しており、OpenGL、GLEW、および GLFW を使用してアプリケーションを作成しています。IDE として Eclipse を使用していますが、glGenRenderbufferなどの関数を使用しようとすると問題が発生します。Windows で非常によく似た構造をセットアップしましたが、Linux で動作させることができません。

ライブラリglfwおよびGLEWにリンクしています。アプリケーションの一部をコンパイルして実行でき、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 なども削除しました。失敗!次に、1 つの .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);
}

それは魅力のように機能しました。次に、同様のファイルとインクルード構造を持つ別のプロジェクトを作成して、古い問題を再現しようとしましたが、それもうまくいくようでした。次に、最初に問題を引き起こしたファイルの正確なコピーを作成するだけの、3 つ目の空のプロジェクトを開始しました。これで、元のプロジェクト (インクルード順序が変更された) の正確なコピーがあり、まったく同じライブラリがリンクされており、機能します。何が起こったのかはまだわかりませんが、Eclipse での私のプロジェクトが何らかの形で台無しになり、いくつかの変更を加えたにもかかわらず回復しなかったと思われます。

于 2013-03-28T16:03:08.030 に答える