Войти
ПрограммированиеФорумГрафика

OpenGL glBlitFramebuffer несколько color_buffer

#0
16:43, 13 июля 2018

Есть ли решение, конкретный алгоритм, для копирования из одного framebuffer в другой нескольких цветовых буферов (те, которые GL_COLOR_ATTACHMENTi)?
Вот, мне известно, что для того, чтобы выполнить копирование, необходимо связать тот, буфер откуда копируются данные как GL_READ_FRAMEBUFFER, а тот, куда копируются - GL_DRAW_FRAMEBUFFER.

    glBindFramebuffer ( GL_READ_FRAMEBUFFER, sourceFBO );
    glBindFramebuffer ( GL_DRAW_FRAMEBUFFER, destinationFBO );
    // после можно сделать передачу
    glBlitFramebuffer ( 0, 0, imageWidth, imageHeight, 0, 0, imageWidth, imageHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST );

Так вот, по-умолчанию копируется только из GL_COLOR_ATTACHMENT0 из sourceFBO.
Но мне требуется скопировать также и GL_COLOR_ATTACHMENT1 из sourceFBO в destinationFBO.
И если цветовой буфер из исходного framebuffer при копировании ещё можно задать через glReadBuffer (), то как управлять фреймбуфером назначения, чтобы записался конкретный цветовой буфер, я затрудняюсь ответить.
Пробовал менять назначение с помощью glDrawBuffers

    unsigned int buf0[1] = { GL_COLOR_ATTACHMENT0 };
    unsigned int buf1[1] = { GL_COLOR_ATTACHMENT0 };

    glReadBuffer ( GL_COLOR_ATTACHMENT0 );
    glDrawBuffers ( 1, buf0 );
    glBlitFramebuffer ( 0, 0, imageWidth, imageHeight, 0, 0, imageWidth, imageHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST );

    glReadBuffer ( GL_COLOR_ATTACHMENT1 );
    glDrawBuffers ( 1, buf1 );
    glBlitFramebuffer ( 0, 0, imageWidth, imageHeight, 0, 0, imageWidth, imageHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST );

и копировать по одному буферу, всё равно заменяются оба цветовых буфера в destinationFBO.
Есть ли способ это сделать?
Или же придётся отказаться от простого MSAA с буферами в пользу кастомных выборок в шейдере?

#1
19:18, 13 июля 2018

А слона то ты и не заметил glDrawBuffer:

glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFBO);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, destinationFBO);

glReadBuffer(GL_COLOR_ATTACHMENTi);
glDrawBuffer(GL_COLOR_ATTACHMENTi);

glBlitFramebuffer(0, 0, imageWidth, imageHeight, 0, 0, imageWidth, imageHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
#2
1:30, 14 июля 2018

Всего один вопрос: а как в шейдере выбирается, в какой буфер рисуется?

#3
3:19, 14 июля 2018

Daniil Petrov
> как в шейдере выбирается, в какой буфер рисуется?

layout ( location = 0 ) out vec4 FragColor;
layout ( location = 1 ) out vec4 BrightColor;
layout ( location = 2 ) out vec4 PackedNormal; 

и так далее

Asaq
> А слона то ты и не заметил
Спасибо. Я почему-то вычитал, что glDrawBuffer принимает только { GL_NONE, GL_FRONT_LEFT, GL_FRONT_RIGHT, GL_BACK_LEFT, GL_BACK_RIGHT }

#4
3:35, 14 июля 2018

PA3UJIb
Благодарю :)

#5
10:29, 16 июля 2018

Ещё раз благодарю Asaq, всё получилось.

    glBindFramebuffer ( GL_READ_FRAMEBUFFER, &sourceFBO );
    glBindFramebuffer ( GL_DRAW_FRAMEBUFFER, &destinationFBO );

    for ( unsigned i = 0; i < mColorAttachments.size (); i++ )
    {
        if ( mColorAttachments[i].name != 0 )
        {
            glReadBuffer ( mColorAttachmetns[i].attachment );
            glDrawBuffer ( mColorAttachments[i].attachment );
            glBlitFramebuffer ( 0, 0, mWidth, mHeight, 0, 0, mWidth, mHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST );
        }
    }

Как видите, пока без проверки на наличие в принимающем фреймбуфере этих самых буферов. Ну, и чтобы не дать OpenGL "забыть" о выводе в несколько буферов, надо после копирования вызывать опять glDrawBuffers ( num, bufs );, где num - это количество цветовых буферов для вывода, bufs - массив символьных констант, обозначающих эти самые буфера.

З.Ы.
// ( . ) ( . ) \\
"Бу-фе-ра-а..." © Неандерталец

ПрограммированиеФорумГрафика

Тема в архиве.