OpenGL mauvaise odre d'affichage des texture [Résolu]

Signaler
-
 Utilisateur anonyme -
Bonjour
Je programme un jeu en OpenGL et j'ai déja placé tous les murs de l'environement( ce sont des surface plane a couleur uniforme).
Le problemen c'est selon l'endroit ou se situ la "camera" je vois le mur de lautre piece appareitre sur le mur de la piece ou se situ la camera.
en d'autre terme : les textures qui devrait etre caché une texture qui est plus proche de la camera apparaisse decu !
comment fair pour que Opengl comprenne que c'est texture sont caché par une autre dans l'espace 3d.


MaLaDeDeDe

12 réponses

Messages postés
79
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
8 décembre 2006

T'as activer le test de profondeur ? sinon essaie d'ajouter ca :
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Bas continue a lire des tutoriels sur l'opengl, ca fait partie des tout premiers cours.

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Pourtant avec cette ligne, tu l'utilises, donc si tu comprends pas GL_DEPTH_BUFFER_BIT revois un peu les tutos de glut.



Pour résoudre ton problème, tu as une erreur lors de l'initialisation
d'opengl. Post ici la facon dont tu initialises glut et opengl.

#include <stdlib.h>
#include <gl/glut.h> /* En-tête de fichier pour la GLUT (incluant les headers window.h, glu.h et gl.h)*/
#pragma comment(lib, "glut32.lib") /* Demande au précompilateur de lier la librairie glut32.lib*/



void affichage () /* Fonction de notre affichage*/
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* Efface le tampon chromatique*/
glLoadIdentity(); /* Initialise la matrice (matrice identité)*/



glTranslatef(0.0f, 0.0f, -5.0f); /* Eloigne notre dessin de 5 unités*/

glColor3f(0.0, 1.0, 0.0); /* couleur: vert*/
glBegin(GL_TRIANGLES);
glVertex3f(-1.0, .0, -3.0); /*Dessin de notre premier triangle*/
glVertex3f(1.0, 0.0, -3.0);
glVertex3f(0.0, -1.0, -3.0);
glEnd();


glColor3f(1.0, 0.0, 0.0); /*couleur: rouge*/
glBegin(GL_TRIANGLES);
glVertex3f(-1.0, 0.0, -5.0); /*Dessin de notre deuxième triangle*/
glVertex3f(1.0, 0.0, -5.0);
glVertex3f(0.0, -1.0, -5.0);
glEnd();
glFinish ();
glutSwapBuffers (); /*Echange des tampons image (celui sur lequel on a dessiné s'affiche pendant que nous dessinerons sur l'autre)*/


}


void redimension (int w, int h) /* Notre fonction de redimension de la fenêtre*/
{
glViewport (0, 0, w, h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
if (h==0)
gluPerspective (80, (float) w, 0.0, 10.0);
else
gluPerspective (80, (float) w / (float) h, 0.0, 10.0);


glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
}


void clavier (unsigned char key, int x, int y) /* Fonction de gestion du clavier*/
{
switch (key) {
case 27:
glutDestroyWindow(glutGetWindow());
exit (0);
break;

}
}


void init()
{
glShadeModel(GL_SMOOTH); /* Modèle de polygones dégradés*/
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); /* Fond noir*/
}


int main (int argc, char** argv) /* Fonction principale*/
{
glutInit (&argc, argv); /* Initialisation de la GLUT*/
glutInitDisplayMode (GLUT_DEPTH|GLUT_RGBA|GLUT_DOUBLE); /* Affichage en mode RGB et double tampon image*/
glutInitWindowPosition (200, 200); /* Détermine la position initiales de la fenêtre*/
glutInitWindowSize (300, 300); /* Taille de la fenêtre*/
glutCreateWindow ("TeSt"); /* Titre de la fenêtre*/
init();
glutDisplayFunc (affichage); /* Spécifie la fonction avec laquelle on veut afficher*/
glutReshapeFunc (redimension); /* Spécifie la fonction avec laquelle on veut redimensionner la fenêtre*/
glutKeyboardFunc (clavier); /* Spécifie la fonction avec laquelle on veut gérer les entrés au clavier*/
glutIdleFunc (affichage); /* Spécifie la fonction qui s'exécute lorsque la GLUT n'a aucun autres évènements à traiter*/
glutMainLoop (); /* Démarre la GLUT en entrant dans une boucle infinie*/
}


MaLaDeDeDe
Messages postés
79
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
8 décembre 2006

Ben ouais, sans test de profondeur ca ne marchera pas... rajoute glClearDepth(1.0); glEnable(GL_DEPTH_TEST); dans init()
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Evidemment, faut surtout pas mettre ca:

if (h==0)

gluPerspective (80, (float) w, 0.0, 10.0);

else

gluPerspective (80, (float) w / (float) h, 0.0, 10.0);



mais remplace le 0.0 par 1.0, la tu créés une division par zero, donc ca plait pas. Ou en tout cas un truc du genre.

Le 0.0 est la distance minimale de vue, et ne peut en aucun cas etre
égale à 0. Mais faut pas mettre trop faible pour pas que le Zbuffer
perdre de précision.

J'utilise glut et j'aimerais que dans la fonction d'affichage que le triangle vert masque le rouge.
"Ce qui ce ferait dans la réalité..."

void affichage () /* Fonction de notre affichage*/
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* Efface le tampon chromatique*/
glLoadIdentity(); /* Initialise la matrice (matrice identité)*/


glTranslatef(0.0f, 0.0f, -5.0f); /* Eloigne notre dessin de 5 unités*/

glColor3f(0.0, 1.0, 0.0); /* couleur: vert*/
glBegin(GL_TRIANGLES);
glVertex3f(-1.0, .0, -3.0); /*Dessin de notre premier triangle*/
glVertex3f(1.0, 0.0, -3.0);
glVertex3f(0.0, -1.0, -3.0);
glEnd();

glColor3f(1.0, 0.0, 0.0); /*couleur: rouge*/
glBegin(GL_TRIANGLES);
glVertex3f(-1.0, 0.0, -5.0); /*Dessin de notre deuxième triangle*/
glVertex3f(1.0, 0.0, -5.0);
glVertex3f(0.0, -1.0, -5.0);
glEnd();

glutSwapBuffers (); /*Echange des tampons image (celui sur lequel on a dessiné s'affiche pendant que nous dessinerons sur l'autre)*/


}


MaLaDeDeDe

vincemail j'ai rajouté ce ke tu ma dit mais j'obtient un écran noir...

sinon quesque le test de profondeur ? est-ceque c'est une technique ou fonction lourde ?


MaLaDeDeDe
Messages postés
79
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
8 décembre 2006

Je suppose que ta fonction affichage est dans une boucle, il faut mettre glClearDepth(1.0); glEnable(GL_DEPTH_TEST); avant cette boucle (car ca efface le depth-buffer). Le test de profondeur permet d'éliminer les partie cachée, c'est un mode d'affichage qui est la seule manière de faire ce que tu veux à mon avis...

Dès que je met glEnable(GL_DEPTH_TEST); dans la boucle plus rien ne s'affichiche
Mais je pense que ce que vous me donné est la bonne voie !
Je vais persévérer j'ai aussi ce site : http://www.irit.fr/~Loic.Barthe/Enseignements/TPs_OpenGL/M1_IO5/TP2/tp2.html
mais je n'y arrive pas je vais vous envoyer mon code entier et vous remerci de m'aider


MaLaDeDeDe

Je vien de le fair et j'abtient un ecran noir !


MaLaDeDeDe

Je vien de le fair et j'obtient un ecran noir !


MaLaDeDeDe

Magnifique ca marche !! Merci a tous les 2!! Pendant un moment je perdais tous espoir !
Merci encore!


MaLaDeDeDe