Я все еще новичок в opengl3 и пытаюсь создать многопроходный рендеринг.
Для этого я создал FBO, сгенерировал несколько текстур и прикрепил их к нему с помощью
unsigned index_col = 0;
for (index_col = 0; index_col < nbr_textures; ++index_col)
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index_col, texture_colors[index_col], 0);
Это хорошо работает (я пытаюсь поверить, что у меня все хорошо!).
Моя проблема с пониманием возникает после того, как я пытаюсь выполнить рендеринг в первой текстуре вне экрана, затем во второй текстуре, а затем рендеринг на экране.
Для рендеринга на конкретную текстуру я использую:
FBO.bind();
glDrawBuffer(GL_COLOR_ATTACHMENT0);
glBindTexture(GL_TEXTURE_2D, FBO.getColorTextures(0)); //getColorTextures(0) is texture_colors[0]
Затем я рисую, используя мой шейдер, и после того, как я хотел бы сделать:
glDrawBuffer(GL_COLOR_ATTACHMENT1);
glBindTexture(GL_TEXTURE_2D, FBO.getColorTextures(1));
и в конце концов
glBindFramebuffer(GL_FRAMEBUFFER, 0);
RenderToScreen(); // assuming this function render to screen with a quad
Мой вопрос:
В чем разница между glDrawBuffer
а также glBindTexture
? Нужно ли называть оба? Разве текстуры не прикреплены к буферу? (Я не могу проверить это на самом деле, потому что я пытаюсь сделать это работает …)
Спасибо!
glBindTexture
соединяет текстуру с блоком сэмплера текстуры для чтения. glDrawBuffer
выбирает место назначения для рисования пишет. Если вы хотите выбрать текстуру в качестве цели рендеринга, используйте glDrawBuffer
на цветном приложении, к которому прикреплена текстура; и убедитесь, что ни один из блоков сэмплера текстуры, с которым он связан в данный момент, не используется в качестве входных данных шейдера! Результат создания обратной связи не определен.
glDrawBuffer
выбирает буфер цвета (в данном случае объект framebuffer), в который вы будете записывать:
Когда цвета записываются в буфер кадров, они записываются в цветовые буферы, указанные в glDrawBuffer
Если бы вы хотели рисовать в нескольких цветовых буферах, вы бы написали
GLuint attachments[2] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glDrawBuffers(2, attachments);
в то время как glBindTexture
привязывает текстуру к текстурному блоку.
Они служат различным целям — помните, что OpenGL и его текущий контекст рендеринга ведут себя как конечный автомат.