SDL_GL_SwapBuffers () в цикле = заморозить? - PullRequest
0 голосов
/ 26 февраля 2011

Я прочитал несколько уроков по OpenGL, и теперь я пытаюсь использовать его с SDL.Дело в том, что когда я использую SDL_GL_SwapBuffers () в цикле while, окно просто зависает.Вот некоторый код:

#include "SDL.h"
#include "system.h"
#include "SDL_opengl.h"
System Sys(800, 600, 32);
SDL_Event kpress;
int main( int argc, char* args[] )
{
    Sys.init();
    bool quit = false;
    while (!quit)
    {
         while (SDL_PollEvent(&kpress)) if(kpress.type == SDL_QUIT) quit = true;
         glClear(GL_COLOR_BUFFER_BIT);
         SDL_GL_SwapBuffers();
    }
    SDL_Quit();
    return 0;
}

------------------------------These are in system.h, class System----------------
    bool System::init()
    {
        if (SDL_Init(SDL_INIT_EVERYTHING) < 0) 
        {
            errorCode = 1;
            return false;
        }
        if (SDL_SetVideoMode(screen_h, screen_w, bpp, SDL_OPENGL) == 0)
        {
            errorCode = 2;
            return false;
        }
        SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
        if (!init_GL())
        {
            errorCode = 3;
            return false;
        }
        SDL_WM_SetCaption("Engine", 0);
        return true;
    }
    bool System::init_GL()
    {
        glClearColor(1, 0, 0, 0);
        glClear(GL_COLOR_BUFFER_BIT);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, screen_h, screen_w, 0, -1, 1);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        if (glGetError() != GL_NO_ERROR) return false;
        return true;
    }

Если я нарисую несколько фигур или использую таймер для ограничения FPS - ничего не изменится.У вас есть идеи?

Ответы [ 4 ]

3 голосов
/ 26 февраля 2011

Мой первый совет: избавьтесь от этого фальшивого класса System: пока все задачи, которые он выполняет, являются чисто последовательными / процедурными, и это должно быть отражено в набросках программ. Люди склонны помещать все в классы только потому, что их учат видеть все с точки зрения объектных моделей. Но этот класс System должен следовать шаблону синглтона, который, на мой взгляд, является анти-шаблоном.

Все вещи, которые вы поместили в init_GL, входят в цикл рендеринга. Инициализация OpenGL заканчивается после создания контекста рендеринга. Состояние OpenGL не инициализировано установлено по требованию . OpenGL объекты инициализируются, но также по требованию.

Также вы не правильно используете glGetError. Это должно быть вызвано в цикле, пока больше не сообщается об ошибках. Таким образом, также не имеет смысла спасаться, если сообщается об ошибке GL. Ошибки OpenGL следует считать диагностическими.

SDL_GL_SetAttribute должен быть установлен перед вызовом SDL_SetVideoMode, поэтому вы, вероятно, не используете двойную буферизацию.

0 голосов
/ 27 февраля 2011

SDL #defines main() должно быть SDL_main(), чтобы позволить ему выполнить дополнительную инициализацию перед запуском программы.Который вы, кажется, обходите через статически инициализированный класс.

Попробуйте создать свой System объект в main().

0 голосов
/ 26 февраля 2011

вы не проверяете результат из system :: init - возможно, где-то в этой функции произошел сбой и неправильно настроено исходное состояние

0 голосов
/ 26 февраля 2011

Эй, вы не вызываете функцию, которая инициализирует OpenGL: init_GL ()

...