37 votes

OpenGL ES iPhone - dessiner des lignes anti-aliasées

Normalement, vous utiliseriez quelque chose comme:

 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);
 

Cela a l'air bien dans le simulateur iPhone, mais sur l'iPhone, les lignes deviennent extrêmement fines et sans anti-crénelage.

Comment obtenez-vous AA sur iPhone?

59voto

quano Points 5084

On peut obtenir l'effet de l'anti aliasing très bon marché, à l'aide de sommets avec une opacité de 0. Voici un exemple d'image pour expliquer:

alt text

La comparaison avec les AA:

alt text

Vous pouvez lire un article sur ce sujet ici:

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

Vous pourriez faire quelque chose le long de ce chemin:

// 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);

25voto

Bersaelor Points 1154

À partir de la version 4.0 d'iOS, vous disposez d'une solution simple: il est désormais possible d'utiliser Antialiasing pour l'ensemble de la scène OpenGL ES avec seulement quelques lignes de code ajouté. (Et presque aucune perte de performance, du moins sur le GPU SGX).

Pour le code, veuillez lire le fil de discussion Apple Dev-Forum suivant . Il y a aussi quelques exemples d'images à quoi ça ressemble pour moi sur mon blog.

6voto

westsider Points 3593

À l'aide de http://answers.oreilly.com/topic/1669-how-to-render-anti-aliased-lines-with-textures-in-ios-4/ comme un point de départ, j'ai été en mesure d'obtenir d'anti-aliasing lignes comme celles-ci: alt text

Ils ne sont pas parfaits, ni sont-ils aussi beau que ceux que j'avais été le dessin avec des Graphiques de Base, mais ils sont assez bonnes. Je suis en fait un dessin de lignes (les sommets) deux fois, une fois avec une plus grande texture et la couleur, puis avec de plus petits texture et de couleur blanche et translucide.

Il y a des artefacts quand les lignes se chevauchent trop serré et alphas commencent à s'accumuler.

4voto

prideout Points 1480

Une approche autour de cette limitation consiste à sceller vos lignes en bandes triangulaires texturées (comme on le voit ici ).

3voto

Paul Points 91

Le problème est que sur l’iPhone, OpenGl restitue un objet tampon de trame plutôt que le tampon de trame principal et, si je comprends bien, les FBO ne prennent pas en charge le multi-échantillonnage.

Différentes astuces peuvent être réalisées, telles que le rendu à un autre FBO avec une taille d'affichage deux fois plus grande, puis le filtrage de la texture pour lisser les choses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X