Обзор: исходит из 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");