2014-12-13 7 views
5

Я работаю с объектами буфера OpenGL. Я создал объект буфера кадров с 2 цветными текстурами и текстурой глубины.Как проверить, какой объект буфера кадра привязан в OpenGL?

Я использую

glBindFramebuffer(GL_READ_FRAMEBUFFER, ID); 

Чтобы связать свой видеобуфер, а на консоли я получаю это предупреждение

Redundant State change in glBindFramebuffer call, FBO 1 already bound 

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

ответ

13

Держите лошадей ... Да, вы можете получить в настоящее время связанный дро и читать FBOs с:

GLint drawFboId = 0, readFboId = 0; 
glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &drawFboId); 
glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &readFboId); 

и для обратной совместимости, GL_FRAMEBUFFER_BINDING эквивалентно GL_DRAW_FRAMEBUFFER_BINDING:

glGetIntegerv(GL_FRAMEBUFFER_BINDING, &drawFboId); 

Но для описываемого вами сценария вы, скорее всего, не хотите использовать thi s. Диагностическое сообщение сообщает вам, что вы делаете избыточное изменение состояния. Но запрос текущего состояния сравнить его с вашим новым значением, скорее всего, намного хуже.

glGet*() звонки могут вызывать определенный уровень синхронизации и быть достаточно вредными для производительности. Как правило, их следует избегать в критических частях вашего кода.

У вас есть два варианта, которые, как, вероятно, будет лучше, чем то, что вы планировали сделать:

  1. Ignore диагностического сообщения. Вероятно, драйвер обнаружит избыточное изменение и в любом случае избежит ненужной работы. И он может сделать это намного эффективнее, чем решение, которое включает приложение, вызывающее вызовы glGet*().
  2. Следите за последним связанным FBO в своем собственном коде, чтобы вы могли отфильтровывать избыточные изменения без использования каких-либо звонков glGet*().

В любом случае то, что вы имели в виду, было бы похоже на пресловутую «тушение огня с бензином».

5

Это просто glGetIntegerv(GL_FRAMEBUFFER_BINDING, &result);

+0

функция glGet не работает – ammar26

+0

ой право вам нужен вариант glGetIntergerv –

+0

glGetIntergerv неопределен – ammar26