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

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

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

Используемые ресурсы: Я прочел Руководство Apple(используя обновление es3) в качестве базового руководства. Кронос вики в качестве дополнительного руководства (хотя оно использует 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");

0

Решение

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

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

0

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

Других решений пока нет …

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