La cartographie des formes irrégulières ou d'autres polygones (dessins animés, sprites) à triangles dans OpenGL ES

StackOverflow https://stackoverflow.com/questions/2842339

Question

Je ne comprends pas le concept de montrer sprites cartographiées en OpenGL Triangles.

Si OpenGL ES ne tire que des triangles et des points, Comment afficher / carte formes non triangulaires?

Pourquoi une forme mis en correspondance avec un triangle ne soit pas faussée?

Pour expliquer:

Dans mon esprit, la cartographie, par exemple, un sprite de Mario, à un triangle produirait une distorsion ou recadrée Mario. Dans ce cas, la tête serait écrasée ou invisible.

Était-ce utile?

La solution

Si je comprends correctement le problème: vous suffit de diviser le carré en deux triangles, et les coordonnées de texture utiliser pour diviser la texture en conséquence. Si vous le faites correctement, vous obtenez la texture tirée à l'écran, 1: 1, comme si elle était un sprite. (Bien sûr, vous avez également la possibilité de rotation et d'étirement et ainsi de suite.)

0     1  <-- If your square is divided up like this, say, set texcoord
+-----+      for point 0 to be the top left of the sprite; for point 3, the
|\    |      bottom right of the sprite; and correspondingly, for points
| \   |      1 and 2.
|  \  |
|   \ |
|    \|
+-----+
2     3

Il se trouve, vous ne serez pas obtenir un sprite Squished tout à fait la façon dont vous vous attendez. Je suppose que vous vous imaginez dessiner le triangle 0-3-2 de mon image ci-dessus, par exemple, cartographiée de la façon évidente, et d'obtenir la ligne de balayage supérieur infiniment pressé en un point (point 0)? Mais en fait, cela ne se produira pas, car il n'y a qu'une seule coordonnée de texture pour le point 0, donc (si les points 2 et 3 sont mis en correspondance correctement), vous obtenez seulement jamais la partie découpée de l'image-objet.

(Cela dit, vous pouvez attribuer le même TexCoord à deux points, bien que, ou faire la croix de texture sur elle-même, et se tromper de cette façon - il y a encore beaucoup de possibilités pour faire un gâchis, ne vous inquiétez pas. )

Ceci est expliqué dans le guide de programmation OpenGL, mais il est des années et des années que j'ai appris ce genre de choses, donc je ne sais pas comment il sera utile si vous éprouvez des difficultés: http://glprogramming.com/red/chapter09.html

Autres conseils

Tout simplement, la texture ne sera pas faussée parce que vous ne serez ramassez trois coordonnées de texture - un par sommet. Vous devrez utiliser deux triangles comme indiqué ci-dessus, et « clip » différentes parties de la texture.

Pardon my utilisation horrible art ASCII ici et dans le reste de ce post:

  Polygon     Texture        ADB        ACD
  A-----C  |  x-----x  |  x        |  x-----x
  |\    |  |  | ___ |  |  |        |    ___ |
  | \   |  |  |<o.o>|  |  |<o      |     .o>|
  |  \  |  |  | ### |  |  | ##     |      # |
  |   \ |  |  | -|- |  |  | -|-    |        |
  |    \|  |  | / \ |  |  | / \    |        |
  B-----D  |  x-----x  |  x-----x  |        x

Tu ferais deux triangles - BAD et ACD. Le point A cartes vers le haut gauche de la texture, B en bas à gauche, C en haut à droite, et D en bas à droite. Si vous associez un seul triangle ou l'autre, vous obtenez seulement la moitié de l'image-objet (ou la texture, pour une forme plus complexe.) De même pour les polygones plus grands ou plus complexes. La texture peut être une seule pièce unique, mais les coordonnées de texture de chaque sommet doit trancher de la même manière que la géométrie lui-même.

exemple plus complexe, un hexagone:

   a   b
    ___
   /   \
f /  .  \ c
  \  g  /
   \___/
  e     d

Si vous ajoutez un point central de « G » et le trancher en six triangles (ABG, BCG, CDG, etc.), vous devez vous assurer que quelle que soit la texture que vous utilisez est découpée en tranches de coordonnées sage de rencontre. Cela n'a pas d'importance si vous utilisez juste GL_TRIANGLES, car il est plus facile de laisser simplement la texture dans sa forme hexagonale, mais une fois que vous commencez à dessiner des bandes ou des ventilateurs, vous pouvez retourner, en biais ou en double si vous ne gardez pas suivre de près de ce sommet est la cartographie à quelle partie de la texture, du fait de l'ordre de dessin.

En aparté, si vous êtes juste concerné par quadriceps alignés écran-2D - qui est ce que les sprites sont généralement - utilisez

La raison en est dans le pipeline de rendu au plus bas niveau, il est tous les triangles. Plus de formes compliquées comme des polygones et autres sont transformés en une collection de triangles par un processus appelé tessellation.

Donc, si vous voulez modeler votre personnage compliqué Mario l'astuce est en fait de le faire dans une collection de triangles, pas un seul.

Je vois dans une autre réponse que vous avez mentionné les pixels transparents. Je ne l'ai pas utilisé les nouvelles versions de openGL, mais la définition traditionnelle d'une collision est basée sur l'intersection de la surface et la texture, même un transparent, n'a pas été prise en compte.

EDIT:

Un rapide Google mis en place une solution en utilisant un GL_TRIANGLE_STRIP hors de iDevGames.com L'URL est http://www.idevgames.com/forum/showpost.php?p=143983&postcount=6

Voici la méthode de tirage pertinente:

- (void)drawView {

    // Replace the implementation of this method to do your own custom drawing

    const GLfloat squareVertices[] = {
        -0.5f, -0.5f,
        0.5f,  -0.5f,
        -0.5f,  0.5f,
        0.5f,   0.5f,
    };

    GLshort genericTexCoords[] = { 0, 1, 1, 1, 0, 0, 1, 0 };

    [EAGLContext setCurrentContext:context];

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glViewport(0, 0, backingWidth, backingHeight);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f);
    glMatrixMode(GL_MODELVIEW);
    glRotatef(3.0f, 0.0f, 0.0f, 1.0f);

    glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glVertexPointer(2, GL_FLOAT, 0, squareVertices);
    glTexCoordPointer(2, GL_SHORT, 0, genericTexCoords);

    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, sprite);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}

openGL peut effectivement dessiner des polygones, mais il est généralement plus sûr de ne pas les utiliser, spécialement dans des formes complexes. Polygones peuvent « twist » sur eux-mêmes et de faire une forme non valide qui ne peut pas être rendu correctement. Avec triangles, cela ne se produit. Voilà pourquoi les gens cassent habituellement des formes complexes triangles.

Voir http://www.glprogramming.com/red/chapter02.html# nom2 pour une meilleure explication plus complète.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top