Tengo que aplicar una textura de ladrillos a un cubo pero la verdad es que la explicacion que me dan de como se aplican las texturas en los vertex no es muy buena y me gustaria basicamente eso, que a ver si me lo podeis explicar mejor este punto:
glTexCoord2f(1.0f, 1.0f); glVertex3f(0,1,1);
Y de paso os dejo el codigo.
Código
#include <Windows.h> #include <GL\GL.h> #include <GL\GLU.h> #include <GL\glut.h> #include <iostream> #define _USE_MATH_DEFINES #include <math.h> using namespace std; #include <conio.h> #define BITMAP_ID 0x4D42 GLuint nombres_texturas; int angulo; void init(void); void redraw(void); void reshape(int, int); BITMAPINFOHEADER bitmapInfoHeader; unsigned char* bitmapData; unsigned char* LoadBitmapFile(char *filename, BITMAPINFOHEADER *bitmapInfoHeader) { FILE *filePtr; // Puntero a programa BITMAPFILEHEADER bitmapFileHeader; // Bitmap file header unsigned char *bitmapImage; // Bitmap image data int imageIdx = 0; // Index de la imagen unsigned char tempRGB; // Abrimos el archivo en binary mode filePtr = fopen(filename,"rb"); if(filePtr == NULL) return NULL; // Leemos el bitmap file header fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER),1,filePtr); // Verificamos que sea un BItmap if(bitmapFileHeader.bfType != BITMAP_ID) { fclose(filePtr); return NULL; } // Leemos la información del bitmap header fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER),1,filePtr); // Movemos el puntero al principio del bitmap fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET); // Guardamos suficiente memoria para el archivo bitmapImage=(unsigned char*) malloc(bitmapInfoHeader->biSizeImage); // Verificamos la memoria if(!bitmapImage) { free(bitmapImage); fclose(filePtr); return NULL; } fread(bitmapImage,1,bitmapInfoHeader->biSizeImage,filePtr); if(bitmapImage == NULL) { fclose(filePtr); return NULL; } // Cambiamos la imagen a RGB for(imageIdx = 0; imageIdx<(int)bitmapInfoHeader->biSizeImage; imageIdx+=3) { tempRGB = bitmapImage[imageIdx]; bitmapImage[imageIdx]=bitmapImage[imageIdx+2]; bitmapImage[imageIdx + 2] = tempRGB; } // Cerramos el archivo y devolvemos la imagen fclose(filePtr); return bitmapImage; } void init(void) { glClearColor(1.0,1.0,1.0,0.0); // Color fondo pantalla glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); // Test de profundidad !IMPORTANTE glShadeModel(GL_SMOOTH); // Modo sombreado de poligonos glMatrixMode(GL_MODELVIEW); gluLookAt(3,-3,3,0,0,0,0,1,0); glEnable(GL_TEXTURE_2D); glGenTextures(1,&nombres_texturas); // Genero el nombre de la textura glBindTexture(GL_TEXTURE_2D, nombres_texturas); // Activamos la textura glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); bitmapData = LoadBitmapFile("agua.bmp", &bitmapInfoHeader); gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, bitmapInfoHeader.biWidth, bitmapInfoHeader.biHeight, GL_RGB, GL_UNSIGNED_BYTE, bitmapData); } void animacion(void) { angulo = (angulo+1)%360; Sleep(50); glutPostRedisplay(); } void redraw() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); // Activo la textura glRotatef(angulo,0,1,0); glBindTexture(GL_TEXTURE_2D, nombres_texturas); // Primera cara glBegin(GL_POLYGON); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1,0,1); glTexCoord2f(1.0f, 0.0f); glVertex3f(1,0,1); glTexCoord2f(0.5f, 1.0f); glVertex3f(0,2,0); glEnd(); // Segunda cara glBegin(GL_POLYGON); glTexCoord2f(0.0f, 0.0f); glVertex3f(1,0,1); glTexCoord2f(1.0f, 0.0f); glVertex3f(1,0,-1); glTexCoord2f(0.5f, 1.0f); glVertex3f(0,2,0); glEnd(); // Tercera cara glBegin(GL_POLYGON); glTexCoord2f(0.0f, 0.0f); glVertex3f(1,0,-1); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1,0,-1); glTexCoord2f(0.5f, 1.0f); glVertex3f(0,2,0); glEnd(); // Cuarta cara glBegin(GL_POLYGON); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1,0,-1); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1,0,1); glTexCoord2f(0.5f, 1.0f); glVertex3f(0,2,0); glEnd(); // Quinta cara glBegin(GL_POLYGON); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1,0,1); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1,0,-1); glTexCoord2f(1.0f, 1.0f); glVertex3f(1,0,-1); glTexCoord2f(0.0f, 1.0f); glVertex3f(1,0,1); glEnd(); glPopMatrix(); glutSwapBuffers(); } void reshape( int anchura, int altura) { glViewport(0,0,(GLsizei) anchura, (GLsizei)altura); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(40.0, (GLfloat) anchura/(GLfloat) altura, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); } void keyboard(unsigned char tecla, int x, int y) { if(tecla==27) exit(0); if(tecla=='a') glutIdleFunc(animacion); if(tecla=='p') glutIdleFunc(NULL); } void main( int argc, char*argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(320, 240); glutCreateWindow("Mapa de Bits"); init(); glutDisplayFunc(redraw); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutIdleFunc(animacion); glutMainLoop(); }
Gracias!