OpenGL mauvaise odre d'affichage des texture

Résolu
Utilisateur anonyme - 16 mars 2006 à 17:05
 Utilisateur anonyme - 16 mars 2006 à 18:51
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

vincemail Messages postés 79 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 8 décembre 2006
16 mars 2006 à 17:16
T'as activer le test de profondeur ? sinon essaie d'ajouter ca :
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
16 mars 2006 à 17:30
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.
3
Utilisateur anonyme
16 mars 2006 à 18:13
#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
3
vincemail Messages postés 79 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 8 décembre 2006
16 mars 2006 à 18:22
Ben ouais, sans test de profondeur ca ne marchera pas... rajoute glClearDepth(1.0); glEnable(GL_DEPTH_TEST); dans init()
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
16 mars 2006 à 18:38
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.
3
Utilisateur anonyme
16 mars 2006 à 17:20
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
0
Utilisateur anonyme
16 mars 2006 à 17:23
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
0
vincemail Messages postés 79 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 8 décembre 2006
16 mars 2006 à 17:33
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...
0
Utilisateur anonyme
16 mars 2006 à 18:09
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
0
Utilisateur anonyme
16 mars 2006 à 18:32
Je vien de le fair et j'abtient un ecran noir !


MaLaDeDeDe
0
Utilisateur anonyme
16 mars 2006 à 18:33
Je vien de le fair et j'obtient un ecran noir !


MaLaDeDeDe
0
Utilisateur anonyme
16 mars 2006 à 18:51
Magnifique ca marche !! Merci a tous les 2!! Pendant un moment je perdais tous espoir !
Merci encore!


MaLaDeDeDe
0
Rejoignez-nous