En OpenGL, comment pouvez-vous obtenir des éléments pour revenir au premier plan?
Par défaut, il semble que les objets sont dessinés d'avant en arrière. Je suis de dessin 2-D de l'INTERFACE utilisateur de l'objet et voudrais créer l'arrière vers l'avant. Par exemple, j'ai pu créer un carré blanc d'abord, puis créer un légèrement plus petit carré noir sur le dessus de cela donc la création d'un carreau noir avec une bordure blanche. Ce post a eu quelques discussions sur elle et l'a décrit cet ordre que l'Algorithme du Peintre "" mais, en définitive, l'exemple qu'ils ont donné tout simplement rendu les objets dans l'ordre inverse pour obtenir l'effet désiré. Je me figure l'arrière vers l'avant (première objets dans le dos, à la suite des objets de tirage sur le dessus) le rendu peut être réalisé par l'intermédiaire d'une transformation (gOrtho?) ?
Je vais aussi mentionner que je ne suis pas intéressé par une solution à l'aide d'une bibliothèque d'encapsulation tels que GLUT.
J'ai aussi constaté que le comportement par défaut sur les Mac à l'aide du Cacao NSOpenGLView semble puiser de l'arrière vers l'avant, où, comme dans windows, je ne peut pas obtenir ce comportement. Le code d'installation de windows j'utilise est: est-ce
glViewport (0, 0, wd, ht);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho (0.0f, wd, ht, 0.0f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
L'appel suivant sera de désactiver le test de profondeur provoque des objets à dessiner dans l'ordre créé. Ce sera en effet la cause des objets à dessiner l'arrière vers l'avant.
Assurez-vous de ne pas appeler ce:
Spécifiques à votre question, non il n'y a pas de méthode normalisée pour spécifier l'ordre de profondeur dans OpenGL. Certaines implémentations peuvent faire l'avant à l'arrière de la profondeur de la commande par défaut, car il est généralement plus rapide, mais qui n'est pas garanti (comme vous l'avez découvert).
Mais je ne vois vraiment pas comment il va vous aider dans votre scénario. Si vous dessinez un carré noir en face d'un carré blanc le carré noir devrait être établi en face de la place blanche importe quel ordre ils sont attirés par, aussi longtemps que vous avez la profondeur de mise en mémoire tampon est activée. Si en fait ils sont coplanaires, alors que ni l'un est vraiment en face de l'autre et toute la profondeur de l'algorithme de tri serait imprévisible.
Le tutoriel que vous avez posté un lien vers seulement parlé parce que la profondeur de tri EST pertinente lorsque vous utilisez la transparence. Mais le son n'est pas moi, c'est ce que vous êtes après.
Mais si vous avez vraiment à faire de cette façon, alors vous devez le faire vous-même. Tout d'abord envoyer votre carré blanc pour le pipeline de rendu, de la force de la lui rendre, et ensuite envoyer votre carré noir. Si vous le faites de cette façon, et de désactiver la mise en tampon de profondeur, puis les carrés peuvent être coplanaires et vous aurez toujours la garantie que le carré noir est attirée sur le carré blanc.
Ordre de dessin est dur. Il n'y a pas de solution facile. Le peintre alogorithm (trier des objets selon leur distance par rapport à votre appareil photo vue) est le plus simple, mais comme vous l'avez découvert, il ne résout pas tous les cas.
Je suggère une combinaison de peintre algroithm et des couches. Vous de construire des couches pour des éléments spécifiques de votre programme. Si vous avez un calque d'arrière-plan, les objets des calques, effets spéciaux couches, et de l'interface de la couche.
Utiliser l'algorithme du peintre sur chaque couche d'éléments. Dans certaines couches spéciales (comme votre interface de la couche), ne trie pas avec l'algorithme du peintre, mais par votre ordre d'appel. Vous appelez ça de la place blanche d'abord si elle obtient attiré en premier.
De dessiner des éléments que vous voulez être dans dos légèrement derrière les éléments que vous voulez être à l'avant. C'est, en fait, changer la valeur de z (en supposant que z est perpendiculaire au plan de l'écran). Vous n'avez pas à changer beaucoup de choses pour obtenir les éléments à attirer en face de l'autre. Et si vous modifiez uniquement la valeur de z légèrement, vous ne devriez pas remarquer un décalage à partir de leur position souhaitée. On pourrait même aller vraiment de fantaisie, et de calculer la bonne position x,y basée sur le changement de position z, de sorte que l'élément s'affiche où il est censé être.
Vos trucs va être tirées dans l'ordre exact d'appeler la glBegin/glEnd fonctions. Vous pouvez obtenir la profondeur de mise en mémoire tampon en utilisant le z-buffer, et si vos objets en 2d ont différentes valeurs z, vous pouvez obtenir l'effet que vous voulez de cette façon. La seule façon pour vous de voir le comportement que vous décrivez sur le Mac est si le programme est de tirer les choses dans l'arrière vers l'avant afin manuellement ou en utilisant le z-buffer pour accomplir cette tâche. OpenGL ne les a pas toutes les fonctionnalités automatiquement comme vous le décrivez.
Comme AlanKley souligné, la façon de le faire est de désactiver le tampon de profondeur. L'algorithme du peintre est vraiment un 2D analyse-technique de conversion utilisé pour le rendu des polygones dans le bon ordre lorsque vous n'avez pas quelque chose comme un z-buffer. Mais vous ne l'applique pas pour les polygones 3D. Vous devez généralement de les transformer et de les projeter (traitement des intersections avec d'autres polygones) et ensuite trier la liste des polygones 2D projetées par les prévisions de leurs coordonnées z, puis les dessiner dans le sens inverse de l'ordre z.
J'ai toujours pensé de l'algorithme du peintre comme une technique alternative pour la suppression de surface cachée lorsque vous ne pouvez pas (ou ne voulez pas) utiliser un z-buffer.