Линии, нарисованные с использованием Quartz, обычно сглаживаются, но по умолчанию это не так в OpenGL ES.Начиная с iOS 4.0, Apple добавила мультисэмпловое сглаживание (MSAA) в свою реализацию OpenGL ES, поэтому вы должны иметь возможность включить это, чтобы сгладить ваши линии (а также другие края в вашей сцене).
Apple описывает, как это настроить, в Руководстве по программированию OpenGL ES для iOS в разделе « Использование мультисэмплинга для улучшения качества изображения ».Вы устанавливаете кадровый буфер с несколькими выборками, буфер рендеринга и буфер глубины (при необходимости), используя следующий код:
glGenFramebuffers(1, &msaaFramebuffer);
glGenRenderbuffers(1, &msaaRenderbuffer);
glBindFramebuffer(GL_FRAMEBUFFER, msaaFramebuffer);
glBindRenderbuffer(GL_RENDERBUFFER, msaaRenderbuffer);
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA8_OES, backingWidth, backingHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, msaaRenderbuffer);
glGenRenderbuffers(1, &msaaDepthbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, msaaDepthbuffer);
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, backingWidth, backingHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, msaaDepthbuffer);
Обратите внимание, что этот код взят из приложения OpenGL ES 2.0, поэтому вам может потребоватьсяизмените вышеприведенное, чтобы добавить соответствующие OES
суффиксы для 1.1.
После того, как вы представите свой кадр, вы сделаете что-то вроде следующего:
glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, msaaFramebuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, viewFramebuffer);
glResolveMultisampleFramebufferAPPLE();
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);
success = [context presentRenderbuffer:GL_RENDERBUFFER];
glBindFramebuffer(GL_FRAMEBUFFER, msaaFramebuffer);
Возможно, вы захотитеоткажитесь от буферов цвета и глубины непосредственно перед или сразу после представления вашего контента на экране в качестве оптимизации, для которой вы можете использовать следующий код:
const GLenum discards[] = {GL_COLOR_ATTACHMENT0,GL_DEPTH_ATTACHMENT};
glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE,2,discards);
Я создал пример для класса, который показывает этот MSAAработая в приложении OpenGL ES 2.0 здесь .Посмотрите на класс ES2Renderer и включите определение MSAA
, чтобы увидеть это в действии.Опять же, довольно просто поместить это в приложение OpenGL ES 1.1, потому что вам просто нужно изменить несколько функций и постоянных суффиксов.