2016-05-24 28 views
0

* .objローダーを作成しようとしています。すべてが解決されたと思ったら、GLEWをローダーで動かすことができません。glGetString(GL_VERSION)は、OpenGLの初期化中にNULLを返します。

事は私のアプリケーションの初期化がこのようになっていることである。

case WM_CREATE: 
     { 
      SetTimer(hWnd, 1, 1000, (TIMERPROC)NULL); 
      if (oGL == NULL) 
       oGL = new OpenGL(hWnd); 

      hDC = GetDC(hWnd); 
     } break; 

そしてOGL:CreateWindowEx関数は、それがすべてのようになりますのWndProc関数でメッセージをWM_CREATEに行くに呼び出された後

int WINAPI WinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance, 
        LPSTR lpCmdLine, 
        int nCmdShow) 
{ 
    WNDCLASSEX wc; 
    MSG msg; 
    HWND hWnd; 

    ZeroMemory(&wc, sizeof(WNDCLASSEX)); 

    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = (WNDPROC)WndProc; 
    wc.hInstance = hInstance; 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.lpszClassName = L"Projekt"; 

    RegisterClassEx(&wc); 

    hWnd = CreateWindowEx( NULL, 
          L"Projekt", 
          L"Symulator lodzi", 
          WS_OVERLAPPEDWINDOW, 
          100, 50, 
          SCREEN_WIDTH, SCREEN_HEIGHT, 
          NULL, NULL, hInstance, NULL); 

    if (!hWnd) 
     return 0; 

    ShowWindow(hWnd, nCmdShow); //wyswietlanie okna 

    glewExperimental = GL_TRUE; 
    GLenum err = glewInit(); 
    if (err != GLEW_OK) 
    { 
     const GLubyte* error = glGetString(GL_VERSION); 
     const GLubyte* error2 = glewGetErrorString(err); 
     exit(1); 
    } 

    while (TRUE) 
    { 
     while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
     { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 

     if (msg.message == WM_QUIT) 
      break; 
    } 

    return msg.wParam; 
} 

コンストラクタコードは次のとおりです:

OpenGL::OpenGL(HWND hWnd) 
{ 
    static PIXELFORMATDESCRIPTOR pfd = { 
             sizeof(PIXELFORMATDESCRIPTOR), 
             1, 
             PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, 
             PFD_TYPE_RGBA,    
             32,       
             0, 0, 0, 
             0, 0, 0,      
             0, 0,       
             0, 0, 0, 0, 0,     
             32,       
             0,        
             0,        
             PFD_MAIN_PLANE,     
             0,        
             0,        
             0,        
             0        
             }; 

    int pixelFormatID; 
    HDC hDC; 

    hDC = GetDC(hWnd); 

    pixelFormatID = ChoosePixelFormat(hDC, &pfd); 
    SetPixelFormat(hDC, pixelFormatID, &pfd); 

    hRC = wglCreateContext(hDC); 
    wglMakeCurrent(hDC, hRC); 
    ReleaseDC(hWnd, hDC); 
} 

だから、OpenGL正しく初期化されますが、その後、私はそれらのerrosを受けています:それがあったとき

errors message screenshot

アプリケーションはOpenGLがまだ初期化されていなかったと思う理由を私は理解していない、(私はそれをデバッグのしてきました最初にウィンドウが作成され、次にoGLオブジェクトが作成されたことを確認してください)。

+0

コードがメッセージポンプに到達する前に、メッセージハンドラが呼び出されたと思われる理由は何ですか? – derhass

+0

私はデバッグモードでコードを追跡していました。そして、CreateWindowsExに到達した後、WM_CREATEメッセージに次の行がありました。私がブレークポイントをWM_CREATEに入れて、エラーラインを取得しても、そのコードが停止した最初のコードはWM_CREATEでした。 –

答えて

1

GLEWの初期化時にOpenGLコンテキストがありません。 WM_CREATEメッセージは、DispatchMessageを介してメッセージループに入った後にのみ処理されます。 WM_CREATEを処理する前に、プログラムにはコンテキストがありません。

WM_CREATEではなく、ウィンドウの作成後にOpenGLコンテキストを作成するだけです。はるかに簡単で、注文の問題を避けることができます。

+0

これを確認します。 VS studioがこの方法を示したので、WM_CREATEがCreateWindowsExの後に呼び出されたことを100%確信していました。 –

+0

WM_CREATEからコンテキストを作成する際に、いくつかの変数が初期化されていない(CreateWindowsEx呼び出しの後にWndProc関数から来ている)というエラーが発生します。ですから、私はOpenGLコンテキストをWM_CREATEで作成しなければなりません。そして、私はglewInit()の直前にそれを作成しようとしています。 –

+0

@ KamilPrzybyo:初期化されていない変数は、読み込みを試みない限りエラーではありません。いずれにしても、WM_CREATEでOpenGLコンテキストを作成するプレーンなWin32 APIプログラムは、珍しいことです。ただし、MFCベースのプログラムでは一般的です。いずれにしても、GLEWの初期化とコンテキストの作成を行う必要があります。あるいはむしろ、実際には 'wglMakeCurrent'呼び出しのたびに' glewInit'を作成する必要があります。 Windowsの拡張機能では、エントリポイントは実際にはコンテキストによって異なる場合があります。あなたはクラスでGLをラッピングしようとしているようです(難しい!);関数ポインタをラップすることができます。 – datenwolf

関連する問題