2013-12-20 2 views
1

У меня есть программа, в которой я использую шейдерную программу для визуализации текстуры, прикрепленной к FBO, затем изменяю параметры программы (изменяя значения униформы) и визуализируя вторую текстуру после прикрепляя его к FBO. Затем два визуализированных изображения используются для создания третьего.Последовательность выполнения для команд OpenGL

Я не уверен, что результаты, которые я получаю, верны. Я понимаю, что графический процессор будет свободен в выборе времени, в которое будет выполняться команда OpenGL. Но это не должно быть проблемой, если порядок выполнения соответствует последовательности, в которой команды отображаются в коде. Это на самом деле?

Дальнейший вопрос. Мне нужно сохранить сгенерированные кадры на диск. Я знаю, как это сделать. Но я должен убедиться, что GPU завершил рендеринг, прежде чем делать это. Как я могу обеспечить это?

+0

Это будет работать, если вы никогда не попробуете пробовать из той же текстуры, в которую вы рисуете (что создаст обратные петли). И вообще то, что вы описываете, не проблема, некоторые новые вещи, которые были введены в GL4, такие как загрузка/хранение изображений, бросают много всего этого на голову, но вы должны притворяться, что я никогда не упоминал об этом и не паниковал по падающему небу:) –

+0

@ AndonM.Coleman Спасибо Ando. Именно об этом я и не так уверен. Шаги, которые я следую, - это те, о которых я упоминаю в комментарии к пользователю user1781290. Я использую одну шейдерную программу при рисовании на первые две текстуры и вторую шейдерную программу для рисования третьей текстуры. Во все времена есть только один FBO. Я только изменяю прикрепленную текстуру на каждом этапе. Я также попытался добавить 'glFinish()', но у меня все еще есть эта проблема несоответствия, о которой я упоминаю в своем втором комментарии к ответу user1781290. – informer2000

ответ

1

OpenGL выполнит команды в том порядке, в котором они были выпущены (или, по крайней мере, имитирует это поведение). Это означает, что нет проблем с использованием двух разных FBO один за другим. Также это означает, что OpenGL удостоверится, что ваш рендеринг завершен в то время, когда вы получаете результат от FBO.

Вы можете позвонить glFinish(), чтобы ваша программа дождалась, пока все отложенные команды OpenGL будут обработаны конвейером, но это практически не требуется почти во всех случаях.

+0

Я не использую 2 FBOs. Но я прикрепляю одну текстуру к FBO, вызываю glDraw, чтобы визуализировать эту текстуру, прикрепить другую текстуру и снова вызвать glDraw для рендеринга второй текстуры. Затем я прикрепляю третью текстуру к FBO и делаю окончательный результат, используя образцы из двух предыдущих текстур. Будет ли эта последовательность работать? – informer2000

+0

Причина, по которой я считаю, что что-то не так, заключается в том, что кадры, которые я генерирую, являются входными видеокадрами. Я читаю кадры в буферах кадров, а затем обрабатываю по буферизованным кадрам один за другим. Но когда я смотрю на выходные кадры, которые я сохраняю, кажется, что существует несоответствие (т. Е. Кадр 300 на выходе не соответствует кадру 300 на входе, а несколько кадров после него). – informer2000

+0

Спасибо. Принимая ответ. Это оказалось ошибкой в ​​коде, который у меня есть для буферизации декодированных кадров. – informer2000

Смежные вопросы