OpenGL ES iPhone - рисование линий со сглаживанием

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

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 линии становятся очень тонкими и без сглаживания.

Как получить AA на iPhone?


person quano    schedule 28.11.2009    source источник
comment
Вы можете отобразить их как строки с псевдонимом, а затем применить фильтр цветения   -  person bobobobo    schedule 22.12.2012
comment
@bobobobo ссылка мертвая.   -  person TomSawyer    schedule 20.10.2016


Ответы (7)


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

alt text

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

альтернативный текст

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

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);
person quano    schedule 31.12.2009
comment
Есть ли что-нибудь сопоставимое (но более простое) для рисования линий со сглаживанием - вроде того, что можно было бы использовать для построения графиков уравнений и т. Д. ?? Другими словами, для рисования, использующего GL_LINE_STRIP вместо GL_TRIANGLE_STRIP. Все, что я рисую, кажется таким пиксельным. Я изучаю использование GL_POINT_SPRITE_OES (согласно образцу кода Apple GLPaint), но это означает создание точек для каждого местоположения пикселя ... или так кажется. И я хотел бы, чтобы OpenGL-ES делал за меня анимацию. - person westsider; 03.08.2010
comment
Не могу понять, что такое цвета, точки ... Можете ли вы прямо показать пример в круге рисования? - person TomSawyer; 20.10.2016

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

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

person Bersaelor    schedule 27.09.2010
comment
Спасибо за публикацию: я почти начал писать довольно загадочный код, основанный на старых ответах на этот вопрос на SO. - person benzado; 05.11.2010
comment
Ссылка на ваше сообщение на форуме разработчиков Apple больше не работает: я получаю страницу с ошибкой. - person Kyle Fox; 12.07.2012
comment
Работает для меня, помните, что вы должны войти в свою учетную запись разработчика, чтобы просматривать форумы. - person Bersaelor; 12.07.2012
comment
У меня это тоже не работает ... У меня есть платная учетная запись разработчика iPhone, но я не могу войти на форумы разработчиков Apple (ни на один из них). - person mm24; 10.08.2012
comment
Возможно, вам придется зарегистрироваться для участия в форумах в другой раз, после того, как вы получите учетную запись разработчика iOS. Это было очень давно, поэтому я не помню точных деталей. Я просто вошел в систему в другой раз, и сама ветка в порядке, а форумы доступны для меня. - person Bersaelor; 10.08.2012

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

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

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

person westsider    schedule 26.09.2010
comment
Может быть, альфа-канал можно исправить, установив пользовательскую функцию смешивания? - person jv42; 24.08.2011

Один из способов обойти это ограничение - преобразовать ваши линии в текстурированные треугольные полосы (как показано здесь).

person prideout    schedule 28.11.2009

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

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

person Paul    schedule 28.11.2009
comment
Я действительно новичок в OpenGL. Вы знаете, где я могу узнать больше об этом методе? - person quano; 29.11.2009

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

person Ed Marty    schedule 28.11.2009
comment
Я слышал, что Quartz в значительной степени является оболочкой для OpenGL. Если Quartz может это сделать, вы сможете сделать это и в OpenGL. Как CGPaths выполняет AA? Я использую игровой движок на основе OpenGL под названием Cocos2D. Afaik, вы не можете рисовать с помощью Quartz в слое Cocos2d. - person quano; 29.11.2009
comment
Я знаком с Cocos2D. Вы всегда можете нарисовать CGImage и создать текстуру из этого изображения для рисования в TextureNode. Я не знаю точно, но не думаю, что методы CGContext полагаются на OpenGL при рисовании. После того, как что-то нарисовано, это изображение вполне может управляться Quartz и отображаться с помощью OpenGL. - person Ed Marty; 29.11.2009
comment
Спасибо, Эд, попробовал этот метод. Это действительно медленно по сравнению с OpenGL. Может сработать, если вы рисуете только раз в секунду или около того, но если вам нужно рисовать чаще, вы облажались. У нас есть ветка по этому поводу на форуме cocos2d: cocos2d-iphone.org/forum/ topic / 2241 - person quano; 29.11.2009

Поместите это в свой метод рендеринга и установите буфер 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*/
person Abhishek Bedi    schedule 24.08.2011
comment
... и как именно вы объявили msaaFramebuffer? - person BlueVoodoo; 04.09.2013