OpenGL glDrawBuffer и glBindTexture

Я все еще новичок в 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? Нужно ли называть оба? Разве текстуры не прикреплены к буферу? (Я не могу проверить это на самом деле, потому что я пытаюсь сделать это работает …)

Спасибо!

1

Решение

glBindTexture соединяет текстуру с блоком сэмплера текстуры для чтения. glDrawBuffer выбирает место назначения для рисования пишет. Если вы хотите выбрать текстуру в качестве цели рендеринга, используйте glDrawBuffer на цветном приложении, к которому прикреплена текстура; и убедитесь, что ни один из блоков сэмплера текстуры, с которым он связан в данный момент, не используется в качестве входных данных шейдера! Результат создания обратной связи не определен.

2

Другие решения

glDrawBuffer выбирает буфер цвета (в данном случае объект framebuffer), в который вы будете записывать:

Когда цвета записываются в буфер кадров, они записываются в цветовые буферы, указанные в glDrawBuffer

Если бы вы хотели рисовать в нескольких цветовых буферах, вы бы написали

GLuint attachments[2] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glDrawBuffers(2, attachments);

в то время как glBindTexture привязывает текстуру к текстурному блоку.

Они служат различным целям — помните, что OpenGL и его текущий контекст рендеринга ведут себя как конечный автомат.

1

По вопросам рекламы [email protected]