2015-02-26 2 views
0

Я хочу визуализировать в фреймбуфер с DSA. Тем не менее, я работал только при ручной привязке фреймбуфера. Есть ли способ без привязки?визуализировать цветное приложение с DSA

Это, как я думал, что это будет работать:

glNamedFramebufferDrawBuffer(m_fbo, GL_COLOR_ATTACHMENT0); 
drawCall(); 

Это работает только если я использую glBindFramebuffer(GL_FRAMEBUFFER, m_fbo); раньше. Как мне это сделать правильно?

Кроме того, что эквивалентно glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); для фреймбум с DSA? Опять же, я могу только очистить, если я ранее связал фреймбуфер.

+0

IIRC DSA предназначен для изменения объектов, не связывая их, но для их фактического использования вам все равно придется связывать их. –

+0

@Colonel Тридцать два: Буферы и Текстуры могут использоваться без привязки. Наверное, они не реализовали его полностью. – gartenriese

ответ

2

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

Если вы звоните в glNamedFramebufferDrawBuffer (m_fbo, ...), вы изменяете состояние массива m_fbo, не связывая сначала m_fbo. Вы на самом деле не говорите OpenGL, чтобы источник его цветового буфера от m_fboGL_COLOR_ATTACHMENT0 - это происходит только при связывании m_fbo.

На самом деле, если вы думаете об этом критически, это единственный логичный способ, которым он может работать. Если бы вы могли произвольно отправлять буферы из разных объектов фреймбуфера, это нарушало бы проверку (полноту). Например, FBO0 может иметь привязку с несколькими выборками с 4 образцами, а FBO1 может иметь однодисковое вложение глубины. Это два несовместимых буфера, но единственный проверенный момент - это когда вы пытаетесь прикрепить эти два изображения к одному и тому же FBO.

+0

Это хорошее объяснение, спасибо! – gartenriese

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