2010-08-31 2 views
1

Il y a trois façons principales de dessiner un cercle simple dans OpenGL ES, tel que fourni par l'iPhone. Ils sont tous basés sur un algorithme simple (la version VBO est ci-dessous).Comment dessiner un cercle anti-aliasé avec l'iPhone OpenGL ES

void circleBufferData(GLenum target, float radius, GLsizei count, GLenum usage) { 
    const int segments = count - 2; 

    const float coefficient = 2.0f * (float) M_PI/segments; 

    float *vertices = new float[2 * (segments + 2)]; 

    vertices[0] = 0; 
    vertices[1] = 0; 
    for (int i = 0; i <= segments; ++i) { 
    float radians = i * coefficient; 
    float j = radius * cosf(radians); 
    float k = radius * sinf(radians); 
    vertices[(i + 1) * 2] = j; 
    vertices[(i + 1) * 2 + 1] = k; 
    } 

    glBufferData(target, sizeof(float) * 2 * (segments + 2), vertices, usage); 
    glVertexPointer(2, GL_FLOAT, 0, 0); 

    delete[] vertices; 
} 

Les trois façons que je connais pour dessiner un simple cercle sont à l'aide glDrawArray d'un tableau de sommets tenus par l'application; utiliser glDrawArray à partir d'un tampon de vertex; et en dessinant une texture à l'initialisation et en dessinant la texture lorsque le rendu est demandé. Les deux premières méthodes que je connais assez bien (bien que je n'ai pas réussi à faire fonctionner l'anti-aliasing). Quel est le code impliqué pour la dernière option (je suis très nouveau pour OpenGL dans son ensemble, donc une explication détaillée serait très utile)? Lequel est le plus efficace?

+0

Dans le code de production, un scoped_array serait utilisé à la place de l'explicite supprimer [] – ScootyPuff

Répondre

1

L'anti-crénelage dans l'OS d'OpenGL ES est sévèrement limité. Vous ne serez pas en mesure de dessiner des cercles anti-aliasés en utilisant des méthodes traditionnelles. Toutefois, si les cercles que vous dessinez ne sont pas trop grands et sont remplis, vous pouvez utiliser GL_POINT_SMOOTH. C'est ce que j'ai utilisé pour mon jeu, Pizarro, qui implique beaucoup de cercles. Voici une writeup détaillée de mon expérience avec le dessin des cercles anticrénelage sur l'iOS:

http://sveinbjorn.org/drawing_antialiased_circles_opengl_iphone