OpenGL ES iPhone - рисование сглаженных линий - PullRequest
37 голосов
/ 28 ноября 2009

Обычно вы используете что-то вроде:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);

glLineWidth(2.0f);

glVertexPointer(2, GL_FLOAT, 0, points);
glEnableClientState(GL_VERTEX_ARRAY);

glDrawArrays(GL_LINE_STRIP, 0, num_points);

glDisableClientState(GL_VERTEX_ARRAY);

Это выглядит хорошо в симуляторе iPhone, но на iPhone линии становятся очень тонкими и без сглаживания.

Как вы получаете АА на iPhone?

Ответы [ 7 ]

59 голосов
/ 31 декабря 2009

Эффект сглаживания можно добиться очень дешево, используя вершины с непрозрачностью 0 Вот пример изображения, чтобы объяснить:

alt text

Сравнение с АА:

alt text

Вы можете прочитать статью об этом здесь:

http://research.microsoft.com/en-us/um/people/hoppe/overdraw.pdf

Вы можете сделать что-нибудь по этому пути:

// Colors is a pointer to unsigned bytes (4 per color).
// Should alternate in opacity.
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors);
glEnableClientState(GL_COLOR_ARRAY);

// points is a pointer to floats (2 per vertex)
glVertexPointer(2, GL_FLOAT, 0, points);
glEnableClientState(GL_VERTEX_ARRAY);

glDrawArrays(GL_TRIANGLE_STRIP, 0, points_count);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
25 голосов
/ 27 сентября 2010

Начиная с iOS версии 4.0 у вас есть простое решение, теперь можно использовать сглаживание для всей сцены OpenGL ES, добавив всего несколько строк кода. (И почти без потери производительности, по крайней мере на графическом процессоре SGX).

Для кода, пожалуйста, прочитайте следующее Apple Тема на Dev-Forum . В моем блоге также есть несколько примеров того, как это выглядит для меня.

6 голосов
/ 26 сентября 2010

Используя http://answers.oreilly.com/topic/1669-how-to-render-anti-aliased-lines-with-textures-in-ios-4/ в качестве отправной точки, я смог получить сглаженные строки, подобные этим: alt text

Они не идеальны и не так хороши, как те, что я рисовал с Core Graphics, но они довольно хороши. Я на самом деле рисую одни и те же линии (вершины) дважды - один раз с большей текстурой и цветом, затем с меньшей текстурой и полупрозрачным белым.

Существуют артефакты, когда линии слишком сильно перекрываются и альфа начинает накапливаться.

4 голосов
/ 28 ноября 2009

Один из подходов к этому ограничению состоит в том, чтобы разбить линии на текстурированные треугольные полосы (как видно здесь ).

3 голосов
/ 28 ноября 2009

Проблема в том, что на iPhone OpenGl отображает объект буфера кадров, а не основной буфер кадров, и, насколько я понимаю, FBO не поддерживает мультисэмплинг.

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

2 голосов
/ 28 ноября 2009

Я очень четко помню, что я пробовал это, и не существует простого способа сделать это, используя OpenGL на iPhone. Вы можете рисовать, используя CGPaths и CGContextRef, но это будет значительно медленнее.

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

Поместите это в ваш метод рендеринга и в буфер setUpFrame ... Вы получите сглаженный вид.

/*added*/
//[_context presentRenderbuffer:GL_RENDERBUFFER];

//Bind both MSAA and View FrameBuffers.
glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, msaaFramebuffer); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, framebuffer );  
// Call a resolve to combine both buffers 
glResolveMultisampleFramebufferAPPLE();   
// Present final image to screen 
glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer);
[_context presentRenderbuffer:GL_RENDERBUFFER];
/*added*/
...