1

wxGLCanvas は、Qt のような初期化コールバック関数を提供しないため、OpenGL シェーダーを嫌うようです。次のように、コンストラクターで自分でコンテキストを作成した後でも、シェーダーを作成できなくなります。

m_context = new wxGLContext(this);

また試しました:

SetCurrent(*m_current);

それでも運が悪く、GLEW はコンテキストが (Google から) 作成されていないことを示す "Missing GL Version" をスローし続けます。

私が試してみました:

  1. show および activate イベントに WX_EVT() を使用しても、うまくいきません。
  2. サイズ変更イベントでシェーダーを初期化していますが、まだ運がありません。

wxGLCanvas に私の初期化関数を他の何よりも先に呼び出させる方法はありますか?

4

2 に答える 2

0

http://wiki.wxwidgets.org/WxGLCanvasの例では、上記のコメントで Kristian Duske が述べているように、ペイント イベント (EVT_PAINT(BasicGLPane::render)) で初期化を行うことをお勧めします。

代わりに、他の場所で OpenGL を初期化できます。最初に wxwidget ウィンドウまたはフレームを表示する必要があります (例: frame->Show() )。

私はこれをします:

  • wxGLCanvas を初期化します (私の場合は wxFrame フレームを親として)

    canvas = new Canvas( (wxFrame*) frame, args);

  • ショーウィンドウ

    frame->Show()

次に、キャンバス クラスでカスタム OpenGL 初期化メソッドを呼び出します (1 回だけ)。

  • コンテキストを設定

    wxGLCanvas::SetCurrent(*m_context);

  • glew を初期化します。

    glewExperimental = GL_TRUE;

    GLenum err = glewInit();

この後、シェーダーなどをコンパイルします。ペイント イベントでは、描画のみを行いますglDrawArrays()SwapBuffers()

于 2014-10-29T09:07:22.020 に答える