Обратные вызовы GLFW и OpenGL Round Robin - PullRequest
1 голос
/ 29 апреля 2020

В режиме Round Robin у вас обычно есть несколько буферов, и вы переключаетесь между этими буферами, как вы управляете обратными вызовами GLFW в этой ситуации?

Давайте предположим, что у вас есть 3 буфера, вы отправляете команды рисования с указанный видовой экран в первом, но когда процессор обрабатывает второй, он получает обратный вызов изменения размера окна, например, сервер может отображать все, что вы отправили с предыдущим размером окна просмотра, вызывая некоторые "артефакты", и это только пример, но это произойдет буквально все правильно? Простым решением будет обработка обратных вызовов (последних полученных) сразу после рендеринга последнего буфера и блокирование клиента до тех пор, пока сервер не обработает все команды, это правильно (что подразумевает задержку кадров на буфер)? Есть ли что-то еще, что можно сделать?

1 Ответ

1 голос
/ 29 апреля 2020

Внутренний конечный автомат OpenGL позаботится обо всем этом. Все команды OpenGL ставятся в очередь в очереди команд и выполняются по порядку. Вызов glViewport - и любая другая команда OpenGL в этом отношении - влияет только на результат команд, следующих за ним, и ничего, что предшествует.

Нет необходимости реализовывать пользовательскую циклическую буферизацию.

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

glDrawElements(…); // (1)
glTexSubImage2D(GL_TEXTURE_2D, …);
glDrawElements(…); // (2)

Модель рендеринга OpenGL обязывает , что glDrawElements (1) использует данные текстуры связанного объекта текстуры, как это было до позвоните glTexSubImage2D и , чтобы glDrawElements (2) использовал данные, которые были загружены между (1) и (2).

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

...