スポンサーリンク

wxGLCanvasでglewを使用する

wxGLCanvasでglewを使用するとき、glewInit()の呼び出しに失敗する場合がある。

例えば以下のようなコードを書くと、エラーメッセージを取得できる。

GLenum err = glewInit();
if (err != GLEW_OK) {
    std::string msg = (const char*)glewGetErrorString(err);
    std::cerr << "Error: " << msg << std::endl;
}
Missing GL version

これはOpenGLのコンテキストがまだ作成されていないのにglewInit()を呼んでしまったからである。

これを回避する確実な方法は、glewInit()の呼び出しをwxEVT_PAINTの処理時にすることらしい。

つまり描画の最初の一回目でglewInit()する。

Canvasのコンストラクタ

BindでwxEVT_PAINT時にRender関数が呼ばれるように設定する。

MyGLCanvas::MyGLCanvas(wxFrame* parent) :
    wxGLCanvas(parent, wxID_ANY), m_context(new wxGLContext(this))
{

    Bind(wxEVT_PAINT, &MyGLCanvas::Render, this);

    /* ... */

}

描画関数

描画関数。SetCurrentした後でglewInit()する。

void MyGLCanvas::Render(wxPaintEvent& evt) {
    if (!IsShown()) return;

    wxGLCanvas::SetCurrent(*m_context);

    if (glew_inistialized == false) {// 初期化は一回だけでいいのでフラグで制御
        GLenum err = glewInit();
        if (err != GLEW_OK) {
// エラーの場合はエラー内容を表示
std::string msg = (const char*)glewGetErrorString(err); std::cerr << "Error: " << msg << std::endl; } else { glew_inistialized = true;// 二回呼び出されないようにフラグを立てる } } wxPaintDC(this); int w, h; GetClientSize(&w, &h); glViewport(0, 0, w, h); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* 略 */ glFlush(); SwapBuffers(); }

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: