Я хочу написать кроссплатформенное 3D-приложение (может быть, игру, кто знает) с SFML и OpenGL 3.3 с основной целью изучения C ++.
SFML предоставляет классную модель событий, обрабатывает текстуры, тексты, вводные данные и т. Д. Я сделал простую демонстрацию с кубом (все еще в старом способе glBegin / glEnd, но я исправлю это, когда найду способ присоединить расширения OpenGL).
Первая проблема, которую я получил, — это двойная буферизация. Как вы должны знать, обычный (и логический) способ выполнения рендеринга использует два буфера: буфер отображения и буфер рендеринга. Цикл рендеринга выполняется в буфере рендеринга, и когда он заканчивается, результат копируется в буфер отображения (или, может быть, есть два одинаковых буфера, просто меняющих роли за цикл, не знаю). Это предотвращает мерцание и артефакты.
Беда в том, что в любом примере OpenGL, который я вижу, авторы используют GLUT и такие функции, как glutSwapBuffers
, Если я правильно понимаю, двойная буферизация зависит от платформы (и это странно для меня, потому что я думаю, что это должно быть сделано в части OpenGL), а такие вещи, как GLUT, просто скрывают точки, специфичные для платформы. Но я уже использую SFML для контекста и инициализации OpenGL.
Есть ли кроссплатформенный способ борьбы с двойной буферизацией OpenGL в паре с SFML? Я не использую графику SFML в этом проекте, но цель — RenderWindow.
SFML может обрабатывать двойную буферизацию, но если вы не используете библиотеку SFML Graphics, вы должен использовать sf::Window
пример.
Двойная буферизация обрабатывается путем вызова sf::Window::setActive
установить окно в качестве цели рендеринга OpenGL, нарисовать содержимое с помощью функций OpenGL, а затем вызвать sf::Window::display
поменять задний буфер. Более подробную информацию можно найти в SFML API (связанная версия v2.3.2).
Других решений пока нет …