1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
#include <windows.h>
#include <GL/GlAux.h>
#include<GL/glut.h> // fonctions AUX Library
#include <windows.h> // En-tete pour Windows
#include <stdio.h> // En-tete pour les entrees/sorties standards (NOUVEAU)
#include <GL/gl.h> // En-tete pour la bibliotheque OpenGL32
#include <GL/glu.h> // En-tete pour la biblioteque GLu32
#include <iostream>
using namespace std;
GLuint texture[1]; // Stockage d'une texture (NOUVEAU)
/************************* TEXTURES *************************************************************/
AUX_RGBImageRec *LoadBMP(char *Filename) // Charge une image bitmap
{
FILE *File=NULL; // Descripteur de fichier
if (!Filename) // Verifie qu'un nom de fichier a ete donne
{
cout<<"nom de fichier non donné!!! \n";
return NULL; // Si non, retourne NULL
}
File=fopen(Filename,"r"); // Controle si le fichier existe
if (File) // Est-ce que le fichier existe ?
{
fclose(File); // Ferme le descripteur
cout<<"ouverture du bitmap... \n";
return auxDIBImageLoad((LPCWSTR)Filename); // Ouvre le bitmap et renvoie un pointeur
}
cout<<"le fichier n'existe pas!\n";
return NULL; // Retourne NULL si le chargement a echoue
}
int LoadGLTextures() // Ouvre un bitmap et le convertit en texture
{
int Status=FALSE; // Indicateur du statut
AUX_RGBImageRec *TextureImage[1]; // Cree une structure d'image
memset(TextureImage,0,sizeof(void *)*1); // Initialise le pointeur à NULL
// Charge le bitmpap, controle les erreurs et quitte si le bitmap n'a pas ete trouve
if (TextureImage[0]=LoadBMP("NeHe.bmp"))
{
Status=TRUE; // Met la veriable Status à TRUE
glGenTextures(1, &texture[0]); // Cree la texture
// Génération typique de texture utilisant les donnees du bitmap
glBindTexture(GL_TEXTURE_2D, texture[0]);
// Genere la texture
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX,
TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
// Filtrage lineaire
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
// Filtrage lineaire
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}
if (TextureImage[0]) // Si la texture existe
{
if (TextureImage[0]->data) // Si l'image de la texture existe
{
free(TextureImage[0]->data); // Libere l'image de la texture
}
free(TextureImage[0]); // Libere la structure de l'image
}
return Status; // Renvoie le statut
}
/************************************* Initialisation *******************************************************************************/
int init(void)
{
glClearColor(0.0,0.0,0.0,0.0);// définit la couleur de vidage à utiliser
if (!LoadGLTextures()) // Va dans notre routine de chargement de texture
{
// Si la la texture n'a pas ete chargee, retourne FALSE (nouveau)
return FALSE;
}
glEnable(GL_TEXTURE_2D);// activation de la texture
glShadeModel(GL_SMOOTH); // Active les ombres douces
glShadeModel(GL_FLAT);
}
/*********************************** Dessin du carré ******************************************************************************/
void carre(void)
{
glColor3f(1.0,1.0,1.0);// définition de la couleur du carre
glBegin(GL_POLYGON);// début de l'objet
glTexCoord2f(0.0f, 1.0f); glVertex2f(100-40,100+40); // partie sup gauche
glTexCoord2f(1.0f, 1.0f); glVertex2f(100+40,100+40); // partie sup droite
glTexCoord2f(1.0f, 0.0f); glVertex2f(100+40,100-40); // partie inf droite
glTexCoord2f(0.0f, 0.0f); glVertex2f(100-40,100-40); // partie inf gauche
glEnd();// fin de l'objet
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);// vidage de la fenêtre avec la couleur en cours, c'est à dire le noir
glBindTexture(GL_TEXTURE_2D, texture[0]); // Selectionne notre texture
glPushMatrix();
carre();
glPopMatrix();
glutSwapBuffers();//échange de tampons pour une meilleure visualisation.
}
void reshape(int w, int h)
{
glViewport(0,0,(GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0,200,0.0,200,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
/*************************************** main ***********************************************************************/
int main(int argc, char ** argv)
{
glutInit(&argc,argv);// initialise le glut et traite les éventuels arguments de ligne de commande. doit être appelée avant toute autre routine GLUT
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);// spécifie l'emploi de modèle chromatique RVBA ou en index des couleurs
glutInitWindowSize(200,200);//spécifie la taille de la fenêtre
glutInitWindowPosition(100,100);//spécifie l'emplacement de l'écran pour l'angle supérieur gauche de la fenêtre
glutCreateWindow("Carré et Textures");
init();
glutDisplayFunc(display);// fonction d'actualisation événementielle: elle éxécute la fonction display
glutReshapeFunc(reshape);// indique l'action à entreprendre lorsque la fenêtre est redimensionnée
glutMainLoop();// la fenêtre ne s'affiche pas tant qu'on appelle pas glutMainLoop
return 0;
} |
Partager