2012-03-12 1 views
3

MFCプログラム用のOpenGL(3.3)レンダラで作業を開始しました。いくつかのOpenGLデバッグツールを実行して静かなエラーがあるかどうかを確認するまではすべて正常でした。 私はすぐに次のタイプのエラーを取得開始gDEBugger .Running gDebugプログラム解析ツール:Windows APIでOpenGL拡張ポインタをリセットする

デバッグ文字列:検出されたエラー:デバッグプロセスコンテキストをレンダリングする1から拡張関数ポインタ(glGenBuffers)を求めたが、この関数ポインタと呼ばれます別のレンダーコンテキスト(コンテキスト#2)で

実際にはすべてのGLEWメソッドがこのエラーを取得しました。私はフォーラムやMSDNの問題を探し始めました。Windows環境でいくつかのGLEWメソッドポインタを再定義する必要があると言われました。また、私はつまずいたthis tutorialどのGLEWメソッドこれらのようなWindowsのOpenGLの方法を使用して再定義されています

void CGLRenderer::InitAPI() 
{ 
    // Program 
    glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram"); 
    glDeleteProgram = (PFNGLDELETEPROGRAMPROC)wglGetProcAddress("glDeleteProgram"); 
    glUseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram"); 
    ... 
    .... 

私のOpenGLコンテキストのセットアップは、次のようになります。実際にはプログラムが細かい内部のVisualStudioを実行するため

bool OpenGLMain::create30Context(HDC device_context){ 
//this->hwnd=hwnd; 


hdc=device_context;//GetDC(hwnd); 

hdcGlobal=&hdc; 


    PIXELFORMATDESCRIPTOR kPFD; 
    memset(&kPFD,0,sizeof(PIXELFORMATDESCRIPTOR)); 
    kPFD.nSize=sizeof(PIXELFORMATDESCRIPTOR); 
    kPFD.nVersion=1; 
    kPFD.dwFlags= 
    PFD_DRAW_TO_WINDOW| 
    PFD_SUPPORT_OPENGL| 
    PFD_GENERIC_ACCELERATED| 
    PFD_DOUBLEBUFFER; 
    kPFD.iPixelType=PFD_TYPE_RGBA; 
    kPFD.cColorBits=32; 
    kPFD.cDepthBits=32; 
    kPFD.cStencilBits=8; 
    kPFD.iLayerType=PFD_MAIN_PLANE; 

    int iPixelFormat=ChoosePixelFormat(hdc,&kPFD); 
    if(iPixelFormat==0){ 
// ReleaseDC(window,gs_hWindowDC); 
    return false; 
    } 
    BOOL bSuccess=SetPixelFormat(hdc,iPixelFormat,&kPFD); 
    if(!bSuccess){ 
    // ReleaseDC(window,gs_hWindowDC); 
    return false; 
    } 

    /////////init opengl context 

    HGLRC tempOpenGLContext=wglCreateContext(hdc);/////Openggl 2.1 
    wglMakeCurrent(hdc,tempOpenGLContext);////male openGL 2.1 context current and active 
    GLenum error =glewInit(); 

    if(error!=GLEW_OK){ 
    return false; 
    } 
    /////////context setup/////// 
    int attributes[]={ 
    WGL_CONTEXT_MAJOR_VERSION_ARB,3, 
    WGL_CONTEXT_MINOR_VERSION_ARB,2, 
    WGL_CONTEXT_FLAGS_ARB,WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,0 


        }; 


    if(wglewIsSupported("WGL_ARB_create_context")==1){ 

    hrc=wglCreateContextAttribsARB(hdc,NULL,attributes);///create OpenGL 3x context based on the supplied attributes 
    wglMakeCurrent(NULL,NULL);//remove temp context 
    wglDeleteContext(tempOpenGLContext); 
    wglMakeCurrent(hdc,hrc); 


    }else{ 
    hrc=tempOpenGLContext;////if no support for OGL 3x detected roll back to 2.0 
    } 
    /////////version check/////////////// 
    int glVersion[2]={-1,-1}; 
    glGetIntegerv(GL_MAJOR_VERSION,&glVersion[0]); 
    glGetIntegerv(GL_MINOR_VERSION,&glVersion[1]); 

    std::cout<<"Using openGL"<<glVersion[0]<<"."<<glVersion[1]<< 
    std::endl;  
OutputDebugString(L"Using OPENGL version:"+glVersion[0]); 

return true; 
    } 

今私は、この時点では本当に混乱していますこれらのGLEWメソッドをすべて再定義する必要はありません。しかし、空のスクリーン(ジオメトリなし)私は実行可能ファイルを直接実行します。他のすべての例とチュートリアルでは、これまで読んだことのないGLEW APIメソッドのポインタをリセットする必要があります。私の質問は、誰かがOpenGLを統合する正しい方法を指摘できるかどうかです3.3をWindows APIで使用する方法はたくさんあるようだからです。

+0

2番目のコンテキストを作成して現在の状態にしてから、もう一度glewInitを呼び出してみてください。 –

+0

これは素晴らしいヒントでしたが、エラーはかなり少なくなっています。実際は2つです:glGenVertexArraysとglBindVertexArra –

+0

何らかの理由で、 'glewInit'を呼び出す前に' glewExperimental'をtrueに設定すると、gDEBuggerは関数ポインタは異なるコンテキストからのものです。私は新しいコンテキストのために 'glewInit'をもう一度呼び出す必要はありません。私はこれが異なるシステム間で一貫して動作するかどうかは分かりませんが、確かに試してみる価値があります! – fintelia

答えて

4

入手する関数ポインタは、現在のコンテキストに基づいています。つまり、異なるOpenGLコンテキストに対して異なる関数ポインタを得ることは、まったく可能です。 gDEBuggerは、関数ポインタを取得するために使用したコンテキストとは異なるコンテキストで関数ポインタを使用していることを検出したことを伝えています。これは動作保証されていません。

これは一般的にはうまくいくと言われています。 2つのコンテキストが同じベンダーのものではない場合(おそらく同じGPUまたはSLI/CrossFire GPU設定の場合)は動作しません。しかし、そうであれば、それはうまくいくはずです。

GLEWは、私が理解するように、を持たない2つの異なるコンテキストに対応する方法はありませんは同じ関数ポインタを使用します。コンテキストを変更するたびにglewInitに電話する必要があります。

+0

あなたは正しいと思いますが、私は2番目の(3.3)コンテキストを開始した後にglewInit()呼び出しを追加しました。しかし、上記のglGenVertexArraysとglBindVertexArrayのために書いた型からエラーを受け取りました。 –

+0

Nicol BolasはAlfonse Reinheartとも言えるあなたの署名から正しく理解していますか? :)また、gDEBuggerで空のビューポートが表示されている間に、VSで自分のものを表示する理由を説明できますか? –

+0

@MichaelIV:gDEBuggerは使用しません。私が言うことができるのは、文脈と機能がどのように相互作用するかだけです。 –

関連する問題