初始化OpenGL时,glGetString(GL_VERSION)返回NULL

时间:2016-05-24 18:21:40

标签: opengl windows-applications

我正在尝试制作* .obj加载程序。当我认为一切都解决了,我不能初始化GLEW与我的装载机一起工作。

问题是我的应用程序初始化看起来像这样:

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;
}

调用CreateWindowEx之后,它全部转到WndProc函数中的WM_CREATE消息,如下所示:

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

            hDC = GetDC(hWnd);
        } break;

oGL构造函数代码在这里:

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已正确初始化,但后来我收到了这些错误:

errors message screenshot

我不明白为什么应用程序认为OpenGL尚未初始化,当它是(我一直在逐步调试它,并且肯定首先是创建窗口然后是oGL对象)。

1 个答案:

答案 0 :(得分:1)

在尝试初始化GLEW时,您没有OpenGL上下文。只有在通过DispatchMessage进入消息循环后才会处理WM_CREATE消息。在处理WM_CREATE之前,您的程序没有上下文。

只需在创建窗口后创建OpenGL上下文,而不是在WM_CREATE中创建。更简单,避免订购问题。