OpenGL / GLFW: зависание glfwOpenWindow (приложение barebones) - PullRequest
0 голосов
/ 11 февраля 2012

Хорошо, поэтому я просто пытаюсь открыть основное окно с помощью GLFW, и пока оно открывается и очищается от черного, оно зависает и появляется курсор ожидания круга. GUI непригоден для использования, и вся программа просто зависает.

Любая помощь?

РЕДАКТИРОВАТЬ есть ли способ вручную создать окно и прикрепить к нему glfw?

Код:

// Attempt to start up GLFW
        f1("Attempting to start up GLFW");
        if(!glfwInit())
        {
            e("Could not start up GLFW!");
            SetVError(V_ERR_OGL_GLFWINIT);
            return false;
        }

        // Create window hints
        f1("Setting window hints");
        glfwOpenWindowHint(GLFW_FSAA_SAMPLES, V_OGL_ANTIALIAS);
        glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); // We want 4.0!
        glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
        glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

        // Create the window
        f1("Creating main window");
        if(!glfwOpenWindow(V_OGL_WINDOW_W, V_OGL_WINDOW_H, 0, 0, 0, 0, 0, 0, GLFW_WINDOW))
        {
            e("Could not create main window!");
            SetVError(V_ERR_OGL_WINDOW);
            return false;
        }

        // Attempt to start up Glew
        f1("Attempting to startup Glew");
        if(glewInit() != GLEW_OK)
        {
            // Error and return
            e("Could not instantiate Glew!");
            SetVError(V_ERR_OGL_GLEWINIT);
            return false;
        }

        // Set the window's title
        f1("Setting window title");
        glfwSetWindowTitle(V_WINDOW_TITLE);

        // Clear the screen / set BG color
        f1("Clearing background");
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

        // Lastly, setup basic sticky keys
        f1("Enabling sticky keys");
        glfwEnable(GLFW_STICKY_KEYS);

Основной код:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevious, LPSTR lpComString, int nShowCmd)
{
    // Generate logger instance (instantiate logging)
    VLogInit();

    // Log Title + Version
    i("VOGL Test "V_FULLVERSION);

    // Init OpenGL/Graphics
    if(!OGLStartup())
        return GetLastVError();
    else // Log that we succeeded
        f1("OGLStartup succeeded!");

    // Fork thread for window events
    hMainWindow = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&tcbMainWindow, NULL, 0, thMainWindow);

    // Alloc statuc
    DWORD status;

    // Wait for all threads to return
    while(true)
    {
        // Main Window
        GetExitCodeThread(hMainWindow, &status);
        if(status != STILL_ACTIVE)
            break;

        // Sleep for a little bit
        Sleep(10);
    }

    // All okay!
    f1("Terminating Program");
    return V_SUCCESS;
}

DWORD tcbMainWindow(LPVOID lpdwThreadParam)
{
    // Begin window loop
    do
    {

    } // Escape key or window closed
    while(glfwGetKey(GLFW_KEY_ESC) != GLFW_PRESS && glfwGetWindowParam(GLFW_OPENED));

    // Success!
    return V_SUCCESS;
}

И да, все регистрируется правильно. http://pastebin.com/sQ2pw2wN

1 Ответ

2 голосов
/ 11 февраля 2012

Вы должны поменять местами задний и передний кадровые буферы в основном цикле, например:

// Begin window loop
do
{
  glfwSwapBuffers(); // <<<
} // Escape key or window closed
while(glfwGetKey(GLFW_KEY_ESC) != GLFW_PRESS 
      && glfwGetWindowParam(GLFW_OPENED));

Почему он завис?

glfw управлять событиями операционной системы как обновление окна, нажатие клавиши, ... ) при вызове glfwSwapBuffers (обычно).

...