2010-11-07 20 views
1

Je suis nouveau sur OpenGL et je lis le redbook. Maintenant, comme un exercice, je veux dessiner manuellement une sphère. Pour cela je divise la sphère en tranches et en piles, et ainsi j'ai plusieurs rectangles, mais près des pôles de la sphère je reçois des triangles. (J'espère que c'était clair ce que je fais). Maintenant, je sais que si vous dessinez un polygone avec GL_POLYGON et qu'il arrive à se croiser, le comportement n'est pas défini. Ma question est la suivante: étant donné trois points v1, v2, v3 qui ne sont pas sur une seule ligne, est-il un comportement non défini à faire:Les sommets peuvent-ils coïncider dans des polygones convexes?

glBegin(GL_POLYGON) 
vertex v1 
vertex v1 
vertex v2 
vertex v3 
glEnd(); 

Cela peut être la combinaison de deux questions sans rapport en un seul, mais je me demande aussi ceci: si je choisis de diviser les rectangles dans ma routine de sphère en triangles, est-ce important de savoir comment je le fais, c'est-à-dire, par quelle diagonale je divise le rect en deux triangles? Je suppose que pour le dessin d'une sphère unicolore cela n'a pas d'importance, mais je ne connais pas les textures, les shaders, l'éclairage, etc.

+0

vous pouvez au moins utiliser des triangles près de pôles – Andrey

+0

@Andrey: Oui, je sais, je me demandais juste si je pouvais éviter de considérer le cas particulier. –

Répondre

2

Cela ne pose aucun problème. OpenGL doit toujours être capable de traiter la possibilité de rasteriser la géométrie où plusieurs sommets tombent au même endroit car même des points d'entrée différents peuvent aboutir au même point de sortie en fonction de votre matrice de modèle et de projection (ou de votre géométrie et/ou sommet shader si vous êtes sur le pipeline programmable). Il est conçu pour traiter de manière mathématiquement correcte sous une grande variété de cas marginaux.

Le test principal d'OpenGL pour déterminer s'il faut peindre un pixel avec une géométrie est de savoir si son centre se situe dans les limites mathématiques de la primitive tracée *. OpenGL peut donc rendre des polygones qui peignent des ensembles de pixels non continus (ce qui arrive généralement quand ils deviennent presque minces) ou qui ne peignent aucun pixel (ce qui tend à être quand ils finissent vraiment petits, mais ils peuvent techniquement être arbitrairement grands taille tant qu'ils se pressent entre les centres de pixels).Les tests exacts utilisés au niveau du matériel peuvent varier d'un fournisseur à l'autre et ne sont corrects que pour une géométrie convexe à l'écran. C'est pourquoi la plupart des gens disent que les triangles sont inévitablement convexes.

(*) un test orienté écran séparé étant appliqué aux pixels exactement sur une limite pour vous assurer qu'ils sont attribués seulement exactement un polygone où les polygones se rencontrent le long d'un bord commun

4

Quand je faisais des choses en openGL, je me contentais de n'utiliser que des triangles. Ils sont spéciaux en ce sens qu'un triangle n'est nullement ambigu.

Par exemple, j'imagine que cela fonctionnera, mais probablement avec des artefacts. La façon dont vous scindez un rectangle ne devrait pas avoir d'importance, tant que vous faites attention à la manière dont vos triangles sont enroulés, de quelle manière vous définissez les points car c'est ce qui dicte leur recto et leur verso.

Mais certainement coller à des triangles, des images de ces quatre points d'un carré

(0,0,0) (1,0,0) (1,0,1) (0,0,1)

Assez facile à voir est un carré plat, mais si je les changer pour

(0,1,0) (1,0,0) (1,1,1) (0,0, 1)

Qu'avez-vous maintenant? il pourrait être dessiné comme une vallée ou comme une colline. si j'ai défini cette forme avec des triangles, vous savez exactement ce que je décris

(0,1,0) (1,0,0) (1,0,0) (1,1,1) (1,1,1) (1 , 0,1) (0,1,0)

une colline comme forme

côté ok ... donc je suivis un peu ici ... mon point est, je ne sais pas ce que votre code ferait dans la pratique, mais je ne pense pas que vous devriez l'utiliser d'une manière quelconque. et comment vous divisez les rectangles ne devrait pas avoir d'importance tant que vos triangles sont décrits dans le bon sens.