// Prog3D (Licence/Master) // Fabrice Aubert #include #include #include #include #include "sgi.h" #include "trackball.h" #define MGL_JPEG 1 #define MGL_RGB 2 // VARIABLES GLOBALES GLuint id_tex1; GLuint id_tex2; GLuint id_tex3; GLuint id_tex4; float AVANCE=-8.0; bool ATTENDRE=false; //******************************************* // INITIALISATION DES TEXTURES (affecter une bitmap à un identifiant de texture) // affectation d'une image à un identifiant de texture void initTexture(char *nom,int format,int level, GLuint *tex_id) { GLubyte *image; GLint longueur,largeur,depthi; switch (format) { case MGL_JPEG:image=read_jpg(nom,&longueur,&largeur,&depthi);break; case MGL_RGB:image=read_sgi(nom,&longueur,&largeur,&depthi);break; default:exit(1); } printf("lecture image : %d x %d x %d\n",longueur,largeur,depthi); // affectation identifiant (attention : génération uniquement pour niveau 0) if (level==0) { // Permet de construire les mipmaps automatiquement *tex_id=(GLuint)gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,longueur,largeur,GL_RGB,GL_UNSIGNED_BYTE,image); // Désactivé car mipmap auto //glGenTextures(1,tex_id); // alloue 1 identifiant à tex_id. } glBindTexture(GL_TEXTURE_2D,*tex_id); // la texture courante 2D correspond à // l'identifiant tex_id. // alignement mémoire du bitmap (indique à OpenGL comment devra être interprété le tableau "image" pour // le mettre dans la mémoire de texture OpenGL (trop technique : cf docs OpenGL)). glPixelStorei(GL_UNPACK_ALIGNMENT,1); // affecter la GL_TEXTURE_2D (texture 2D courante) avec une texture (contenue ici dans le tableau "image") // on indique : // - le niveau de mipmap (level) // - le nombre d'éléments consécutifs du tableau "image" qui correspondent à un pixel (GL_RGB=3) // - la longueur et la largeur (en pixels) // - existence d'un bord (sert à d'éventuels recollement de texture bord à bord) : pour nous = 0 (pas de bords) // - quel est le format de stockage de la texture (ici GL_RGB) // - le type des éléments du tableau (unigned int) // - le pointeur du tableau constituant la texture (image) // Désactivé car mipmap auto //glTexImage2D(GL_TEXTURE_2D,level,GL_RGB,longueur,largeur,0,GL_RGB,GL_UNSIGNED_BYTE,image); // parametres de repetition en S et T (GL_CLAMP = pas de répétition; GL_REPEAT = répétition). glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); // mode (ou environement) de calcul de la couleur du fragment : // GL_REPLACE = la couleur du fragment devient la couleur de texture // GL_MODULATE = la couleur de texture est mixee avec la couleur // du fragment (qui contient la couleur donnée par éclairement). // Remarque : malgré le nom glTex*Env*, cela n'a aucun rapport avec "l'environment mapping" glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE); } //********************************************* // ACTIVATION-DESACTIVATION des textures // Active le mode "coordonnée de texture" (spécifier les coordonnées par glTexCoord) void activerTexture(GLint idtex) { // filtrage texture glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); glBindTexture(GL_TEXTURE_2D,idtex); glEnable(GL_TEXTURE_2D); } void desactiverTexture() { glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_2D); } //********************************************** // PRIMITIVES D'AFFICHAGE // afficher un plan en Y=0 void sol() { glColor3f(0,0,1); activerTexture(id_tex1); /* glMatrixMode(GL_TEXTURE); glPushMatrix(); // comme pour les transformations : evite les effets de bord glTranslatef(0.5,0.5,0); glRotatef(ax,0,0,1); glTranslatef(-0.5,-0.5,0); glMatrixMode(GL_MODELVIEW); */ glBegin(GL_POLYGON); { glTexCoord2f(0,1); glVertex3f(-5,0,-80); glTexCoord2f(1,1); glVertex3f(5,0,-80); glTexCoord2f(1,0); glVertex3f(5,0,0); glTexCoord2f(0,0); glVertex3f(-5,0,0); } glEnd(); desactiverTexture(); /* glMatrixMode(GL_TEXTURE); glPopMatrix(); glMatrixMode(GL_MODELVIEW); */ } // ************************************************** // CALLBACKS glut void myDraw(void) { glClearColor(1,1,1,0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(0,-3,AVANCE); tbMatrix(); sol(); glPopMatrix(); glutSwapBuffers(); } void myIdle(void) { glutPostRedisplay(); } void myReshape(GLint width,GLint height) { glViewport(0,0,width,height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45,width/height,1,100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); tbReshape(width,height); } void myKey(unsigned char c,int x,int y) { switch (c) { case 27: exit(1); break; // sortie violente si appui sur "Echap" // case ' ': case 'a':ATTENDRE=!ATTENDRE;break; case 'z':AVANCE+=0.3;glutPostRedisplay();break; case 's':AVANCE-=0.3;glutPostRedisplay();break; default: break; } } void myMouse(int button, int state, int x, int y) { tbMouse(button, state, x, y); } void myMotion(int x,int y) { tbMotion(x, y); } //******************************** // initialisation opengl void myInit() { glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE); glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL); tbInit(GLUT_LEFT_BUTTON); initTexture("msmichel.jpg",MGL_JPEG,0,&id_tex1); // initTexture("2tex1.rgb",MGL_RGB,1,&id_tex1); // initTexture("2tex2.rgb",MGL_RGB,2,&id_tex1); // initTexture("2tex3.rgb",MGL_RGB,3,&id_tex1); // initTexture("2tex4.rgb",MGL_RGB,4,&id_tex1); // initTexture("2tex5.rgb",MGL_RGB,5,&id_tex1); // initTexture("2tex6.rgb",MGL_RGB,6,&id_tex1); // initTexture("2tex7.rgb",MGL_RGB,7,&id_tex1); // initTexture("2tex8.rgb",MGL_RGB,8,&id_tex1); } main(int argv,char **argc) { glutInit(&argv,argc); glutInitWindowSize(512,512); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("MipMap"); glutReshapeFunc(myReshape); glutDisplayFunc(myDraw); glutIdleFunc(myIdle); glutMouseFunc(myMouse); glutMotionFunc(myMotion); glutKeyboardFunc(myKey); myInit(); glutMainLoop(); }