OpenGL разрывает с полноэкранным родным разрешением

У меня есть приложение OpenGL с Win32 API без перенасыщенности и т. Д., И я столкнулся с проблемой с разрывом экрана в полноэкранном режиме.
В основном я поставил WS_POPUP как стиль окна и разрешение моего монитора как размер окна.
Я работаю на AMD Radeon HD 7770 и вижу ужасные слезы!
Когда я положил WS_POPUPWINDOW стиль вместо WS_POPUPслеза ушла, однако у меня есть нежелательная граница вокруг моей сцены.
Еще одна вещь, которую я заметил, это то, что слезы исчезают, когда разрешение НЕ является родным.
Поэтому, когда я прохожу my_screen_resolution + 1 в качестве параметра размера разрыв отсутствует.

RESx = 1920;
RESy = 1080;
hwnd = CreateWindowEx(NULL, NAME, NAME, WS_POPUP, 0, 0, RESx, RESy, NULL, NULL, hInstance, NULL);
SetWindowPos(hwnd, 0, -1, -1, RESx + 1, RESy + 1, 0); // With this function call, the tearing disappears!

Что я могу сделать, чтобы избавиться от разрывов без необходимости запуска на нативном разрешении?

РЕДАКТИРОВАТЬ: (Подсказка: это не V-синхронизация)

1

Решение

Что я могу сделать, чтобы избавиться от разрывов без необходимости запуска на нативном разрешении?

РЕДАКТИРОВАТЬ: (Подсказка: это не V-синхронизация)

Да, это V-Sync.

Когда вы создаете полноэкранное окно, оно будет обходить композитор DWM.

Если окно не покрывает весь экран, его содержимое проходит через композитор DWM. Композитор DWM сам делает себе копию содержимого окна всякий раз, когда что-то указывает, что он завершил рисование (возврат из обработчика WM_PAINT, вызванный EndPaint или SwapBuffers). Сама композиция бывает V-синхронизированной.

Спасибо за ваш совет, но я хочу избежать разрывов без vsync. С vsync у меня ужасная задержка ввода.

Тогда вы делаете что-то не так в своей обработке ввода. Скорее всего, ваш цикл обработки событий обрабатывает только одно входное событие за раз, а затем перерисовывает. Если это так, и сложность вашей сцены возрастает, то вы получаете отставание, пропорциональное сложности прорисовки вашей сцены. Вы не хотите, чтобы это случилось.

Что вам нужно сделать, это накопить все входные события, которые накапливались между перерисовками, и объединить их в одно новое состояние рисования. В идеале входные события собираются до тех пор, пока сцена не будет настроена для рисования, чтобы отразить самое последнее состояние. Если вы хотите получить фантазию, вы можете добавить фильтр Калмана, чтобы предсказать состояние ввода в тот момент, когда кадр будет показан пользователю, и использовать его для рисования сцены.

2

Другие решения

Чтобы удалить разрыв OpenGL, вы должны включить vsync. Перейдите по этой ссылке для деталей: Как включить вертикальную синхронизацию в OpenGL?

0

По вопросам рекламы [email protected]