Сглаживание линий в OpenGL ES на iPhone - PullRequest
3 голосов
/ 24 августа 2011

Я экспериментирую с простой прорисовкой линий в OpenGL ES на iPhone 4. Я создал stick-man из массива GLfloats и сначала протестировал рисование stick-man в обычном UIView (переопределяя метод draw).Вывод, показанный здесь, довольно хороший ...

Example of drawing into UIView

Проблема в том, что мне нужно сделать этот рисунок под OpenGL для максимальной скорости (среди прочих причин), так что если яесть сотни объектов, рисование все равно будет быстрым.Когда я тестировал простую версию рисования линий под OpenGL ES 1.1, я получил следующее (игнорируем отсутствующую голову!) ...

enter image description here

Я использую GL_LINES с одним массивомчтобы нарисовать фигуру и включить GL_LINE_SMOOTH (вместе с GL_NICEST), но фигура выглядит не очень гладко.Есть ли способ добиться более гладких линий сглаживания в OpenGL с помощью простых строк?

Ответы [ 2 ]

4 голосов
/ 24 августа 2011

Линии, нарисованные с использованием 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, потому что вам просто нужно изменить несколько функций и постоянных суффиксов.

1 голос
/ 25 августа 2011

http://chimera.labs.oreilly.com/books/1234000001814/ch06.html#ch06_id36002707, Раздел «Сглаживание трюков с закадровыми FBO»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...