Оставайся в OpenGL? - PullRequest
       31

Оставайся в OpenGL?

1 голос
/ 17 апреля 2010

Я использую win32 и opengl, и у меня есть окно с проекцией в glOrtho координат окна. У меня включена двойная буферизация, я тоже тестировал ее с glGet. Кажется, моя программа порвет все примитивы, которые я пытаюсь нарисовать, если она постоянно переводится.

Вот моя функция инициализации OpenGL:

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glViewport(0, 0, 640, 480);
glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 640, 0, 480, 0, 100);

glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glDrawBuffer(GL_BACK);

glLoadIdentity();

И это моя функция рендеринга, gMouseX и gMouseY - координаты мыши:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glTranslatef(gMouseX, gMouseY, 0.0f);
glColor3f(0.5f, 0.5f, 0.5f);
glBegin(GL_TRIANGLES);
    glVertex2f(0.0f, 128.0f);
    glVertex2f(128.0f, 0.0f);
    glVertex2f(0.0f, 0.0f);
glEnd();

SwapBuffers(hDC);

Одна и та же проблема разрыва возникает независимо от того, как часто выполняется функция рендеринга. Есть ли что-то, что я делаю неправильно или отсутствует здесь?

Ответы [ 5 ]

7 голосов
/ 17 апреля 2010

Если вы просто визуализируете один или два треугольника, у вас будет безумно высокая частота кадров (вероятно, в тысячах FPS), что означает, что это SwapBuffering как ад, что означает, что вы, вероятно, всегда меняете местами во время обновление экрана (даже при двойной буферизации). Как только ваша сцена начинает наполняться большим количеством контента, а частота кадров падает до более реалистичных значений, она должна перестать разрываться. Также можно включить V-Sync, например, с wglSwapIntervalEXT в Windows.

3 голосов
/ 11 мая 2014

Эта проблема не должна быть строго связана с VSync, как пытаются предложить все люди в Интернете. В моем случае проблема была вызвана тем, как окно было инициализировано. Я заметил, что избавление от dwStyle = WS_POPUP решило проблему, но только частично, потому что тогда окно не было в полноэкранном режиме. В конце концов у меня сработало SetWindowLong (hwnd, GWL_STYLE, 0); после создания окна. Это в основном очищает стиль окна. Итак, мой код для инициализации окна выглядит так:

dwStyle=WS_POPUP;           //Windows Style
ShowCursor(FALSE);          //Hide Mouse Pointer

//Create the Window
hwnd= CreateWindowEx(NULL,
    "GLClass",
    appName,
    dwStyle,
    0, 0,                               
    (long)windowWidth,
    (long)windowHeight, 
    NULL,                               
    NULL,                               
    hInstance,                          
    NULL);                              
SetWindowLong(hwnd, GWL_STYLE, 0);

После этой модификации все мои проблемы со слезами, а также невозможность печати на экране, были решены. Мне не нужно было никуда трогать VSync.

2 голосов
/ 21 мая 2013

При определении стилей окна приложения win32 не включайте WS_POPUP
После отладки проблемы, когда в полноэкранном режиме вводилось разрывание экрана, я обнаружил стили для полноэкранного режима, после удаления WS_POPUP, казалось, он прекратил разрывать файл в одиночку, без необходимости принудительно повторять цикл рендеринга. WS_POPUP известен тем, что проблематичен, я думаю. Это также заблокировало бы любые полноэкранные скриншоты, чтобы закончить белый.

0 голосов
/ 21 мая 2013

Попробуйте поставить ограничение / ограничение на частоту кадров или, вероятно, получить ее (если у вас нет vsync):

Вот псевдокод:

let tick equals new_tick
if tick is less than last_tick do
    yield
done

calculate last_tick

Попробуйте функцию сна и установите ее на единицу, чтобы получить:

Sleep(1);

Также помните, что ограничение или ограничение частоты кадров не рекомендуется, поскольку существуют определенные функции, которые действительно предназначены для сокращения вычислений кадров.

0 голосов
/ 17 апреля 2010

Разрыв вызван не синхронизацией ваших обновлений с интервалом вертикального гашения монитора. Это немного зависит от оборудования в OpenGL (я думаю, не эксперт), начнем с поиска glXWaitVideoSyncSGI. Гугл "opengl sync to vblank" тоже окупается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...