Мультисэмплинг с glBlitFramebuffer не работает opengl es 3.0

Обзор: исходит из this, я перешел на ES 3.0, и после прочтения и попыток в течение дня я снова застрял в достижении сглаживания. Я тестирую это на симуляторе iOS.

Проблема: мои рисунки видны, но они такие же, как и нет сглаживания. Я пробовал использовать ObjC [self.glkView setDrawableMultisample:GLKViewDrawableMultisample4X];, и разница заметна. Это означает, что мой мультисэмплинг вообще не работает. Есть что-то, что я упускаю?

Используемые ресурсы: я прочитал Руководство Apple (с использованием обновления es3) в качестве основного руководства. вики Kronos в качестве дополнительного руководства (хотя он использует glEnable(GL_MULTISAMPLE), которого нет в ES3. .. что-то похожее, которое я нашел, это sample coverage, и я также пытался включить его, но все равно не повезло).

Код:

/*
setting up shader program code...
*/

// initializing frame buffers
glGenFramebuffers(1, &sampleFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, sampleFramebuffer);

glGenRenderbuffers(1, &sampleColorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, sampleColorRenderbuffer);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, sampleColorRenderbuffer);

glGenRenderbuffers(1, &sampleDepthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, sampleDepthRenderbuffer);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, sampleDepthRenderbuffer);


if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
    printf("Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));


// Making Draw FrameBuffer
glGenFramebuffers(1, &resolveFrameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, resolveFrameBuffer);


glGenRenderbuffers(1, &resolveColorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, resolveColorRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, resolveColorRenderbuffer);

if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
    printf("Failed to make complete framebuffer2 object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));



// Cleaning buffer steps
glBindFramebuffer(GL_FRAMEBUFFER, sampleFramebuffer);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Когда это будет сделано, в моем коде рисования после завершения рисования я делаю следующее:

*use gl program*
*drawarrays*

glBindFramebuffer(GL_READ_FRAMEBUFFER, sampleFramebuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFrameBuffer);
glBlitFramebuffer(0, 0, _Width, _Height, 0, 0, _Width, _Height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
checkGLError("glBlitFramebuffer");

person Taimoor Abdullah Khan    schedule 27.02.2018    source источник


Ответы (1)


Я понял это из-за того, как я тестировал свои рисунки. Я настроил фрагментный шейдер так, чтобы он всегда давал чистый красный цвет (r:1,g:0,b:0,a:1). Я делал это, потому что мой проект Android был настроен кем-то другим и не был полностью завершен, когда я взял копию. Чтобы не работать над этим, я импровизировал и установил красный цвет, чтобы я мог видеть, что рисуется на черном фоне (глупая идея).

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

person Taimoor Abdullah Khan    schedule 27.02.2018