wxGLCanvasでglewを使用するとき、glewInit()の呼び出しに失敗する場合がある。
例えば以下のようなコードを書くと、エラーメッセージを取得できる。
GLenum err = glewInit(); if (err != GLEW_OK) { std::string msg = (const char*)glewGetErrorString(err); std::cerr << "Error: " << msg << std::endl; }
これはOpenGLのコンテキストがまだ作成されていないのにglewInit()を呼んでしまったからである。
これを回避する確実な方法は、glewInit()の呼び出しをwxEVT_PAINTの処理時にすることらしい。
つまり描画の最初の一回目でglewInit()する。
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(); }