Foro de elhacker.net

Media => Diseño Gráfico => Mensaje iniciado por: cazagavilan en 21 Mayo 2012, 21:06



Título: OpenGL Texturas
Publicado por: cazagavilan en 21 Mayo 2012, 21:06
Buenas!

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
  1. #include <Windows.h>
  2. #include <GL\GL.h>
  3. #include <GL\GLU.h>
  4. #include <GL\glut.h>
  5. #include <iostream>
  6. #define _USE_MATH_DEFINES
  7. #include <math.h>
  8. using namespace std;
  9. #include <conio.h>
  10. #define BITMAP_ID 0x4D42
  11. GLuint nombres_texturas;
  12. int angulo;
  13.  
  14. void init(void);
  15. void redraw(void);
  16. void reshape(int, int);
  17.  
  18. BITMAPINFOHEADER bitmapInfoHeader;
  19. unsigned char* bitmapData;
  20.  
  21. unsigned char* LoadBitmapFile(char *filename, BITMAPINFOHEADER *bitmapInfoHeader)
  22. {
  23.   FILE *filePtr;                       // Puntero a programa
  24.   BITMAPFILEHEADER bitmapFileHeader;   // Bitmap file header
  25.   unsigned char *bitmapImage;          // Bitmap image data
  26.   int imageIdx = 0;             // Index de la imagen
  27.   unsigned char tempRGB;
  28.  
  29.   // Abrimos el archivo en binary mode
  30.   filePtr = fopen(filename,"rb");
  31.   if(filePtr == NULL)
  32.      return NULL;
  33.  
  34.   // Leemos el bitmap file header
  35.   fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER),1,filePtr);
  36.  
  37.   // Verificamos que sea un BItmap
  38.   if(bitmapFileHeader.bfType != BITMAP_ID)
  39.   {
  40.      fclose(filePtr);
  41.      return NULL;
  42.   }
  43.  
  44.   // Leemos la información del bitmap header
  45.   fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER),1,filePtr);
  46.  
  47.   // Movemos el puntero al principio del bitmap
  48.   fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);
  49.  
  50.   // Guardamos suficiente memoria para el archivo
  51.   bitmapImage=(unsigned char*) malloc(bitmapInfoHeader->biSizeImage);
  52.  
  53.   // Verificamos la memoria
  54.   if(!bitmapImage)
  55.   {
  56.      free(bitmapImage);
  57.      fclose(filePtr);
  58.      return NULL;
  59.   }
  60.   fread(bitmapImage,1,bitmapInfoHeader->biSizeImage,filePtr);
  61.   if(bitmapImage == NULL)
  62.   {
  63.      fclose(filePtr);
  64.      return NULL;
  65.   }
  66.  
  67.   // Cambiamos la imagen a RGB
  68.   for(imageIdx = 0; imageIdx<(int)bitmapInfoHeader->biSizeImage; imageIdx+=3)
  69.   {
  70.      tempRGB = bitmapImage[imageIdx];
  71.      bitmapImage[imageIdx]=bitmapImage[imageIdx+2];
  72.      bitmapImage[imageIdx + 2] = tempRGB;
  73.   }
  74.  
  75.   // Cerramos el archivo y devolvemos la imagen
  76.   fclose(filePtr);
  77.   return bitmapImage;
  78. }
  79.  
  80. void init(void)
  81. {
  82.   glClearColor(1.0,1.0,1.0,0.0); // Color fondo pantalla
  83.   glEnable(GL_CULL_FACE);
  84.   glEnable(GL_DEPTH_TEST); // Test de profundidad !IMPORTANTE
  85.   glShadeModel(GL_SMOOTH); // Modo sombreado de poligonos
  86.   glMatrixMode(GL_MODELVIEW);
  87.   gluLookAt(3,-3,3,0,0,0,0,1,0);
  88.  
  89.   glEnable(GL_TEXTURE_2D);
  90.   glGenTextures(1,&nombres_texturas); // Genero el nombre de la textura
  91.  
  92.   glBindTexture(GL_TEXTURE_2D, nombres_texturas); // Activamos la textura
  93.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  94.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  95.   bitmapData = LoadBitmapFile("agua.bmp", &bitmapInfoHeader);
  96.   gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, bitmapInfoHeader.biWidth,
  97.      bitmapInfoHeader.biHeight, GL_RGB, GL_UNSIGNED_BYTE, bitmapData);
  98.  
  99. }
  100.  
  101. void animacion(void)
  102. {
  103.   angulo = (angulo+1)%360;
  104.   Sleep(50);
  105.   glutPostRedisplay();
  106. }
  107.  
  108. void redraw()
  109. {
  110.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  111.   glPushMatrix();
  112.   // Activo la textura
  113.  
  114.   glRotatef(angulo,0,1,0);
  115.   glBindTexture(GL_TEXTURE_2D, nombres_texturas);
  116.  
  117.   // Primera cara
  118.   glBegin(GL_POLYGON);
  119.   glTexCoord2f(0.0f, 0.0f); glVertex3f(-1,0,1);
  120.   glTexCoord2f(1.0f, 0.0f); glVertex3f(1,0,1);
  121.   glTexCoord2f(0.5f, 1.0f); glVertex3f(0,2,0);
  122.   glEnd();
  123.  
  124.    // Segunda cara
  125.   glBegin(GL_POLYGON);
  126.   glTexCoord2f(0.0f, 0.0f); glVertex3f(1,0,1);
  127.   glTexCoord2f(1.0f, 0.0f); glVertex3f(1,0,-1);
  128.   glTexCoord2f(0.5f, 1.0f); glVertex3f(0,2,0);
  129.   glEnd();
  130.  
  131.   // Tercera cara
  132.   glBegin(GL_POLYGON);
  133.   glTexCoord2f(0.0f, 0.0f); glVertex3f(1,0,-1);
  134.   glTexCoord2f(1.0f, 0.0f); glVertex3f(-1,0,-1);
  135.   glTexCoord2f(0.5f, 1.0f); glVertex3f(0,2,0);
  136.   glEnd();
  137.  
  138.   // Cuarta cara
  139.   glBegin(GL_POLYGON);
  140.   glTexCoord2f(0.0f, 0.0f); glVertex3f(-1,0,-1);
  141.   glTexCoord2f(1.0f, 0.0f); glVertex3f(-1,0,1);
  142.   glTexCoord2f(0.5f, 1.0f); glVertex3f(0,2,0);
  143.   glEnd();
  144.  
  145.   // Quinta cara
  146.   glBegin(GL_POLYGON);
  147.   glTexCoord2f(0.0f, 0.0f); glVertex3f(-1,0,1);
  148.   glTexCoord2f(1.0f, 0.0f); glVertex3f(-1,0,-1);
  149.   glTexCoord2f(1.0f, 1.0f); glVertex3f(1,0,-1);
  150.   glTexCoord2f(0.0f, 1.0f); glVertex3f(1,0,1);
  151.   glEnd();
  152.   glPopMatrix();
  153.   glutSwapBuffers();
  154. }
  155.  
  156. void reshape( int anchura, int altura)
  157. {
  158.   glViewport(0,0,(GLsizei) anchura, (GLsizei)altura);
  159.   glMatrixMode(GL_PROJECTION);
  160.   glLoadIdentity();
  161.   gluPerspective(40.0, (GLfloat) anchura/(GLfloat) altura, 1.0, 20.0);
  162.   glMatrixMode(GL_MODELVIEW);
  163. }
  164.  
  165.   void keyboard(unsigned char tecla, int x, int y)
  166.   {
  167.      if(tecla==27) exit(0);
  168.      if(tecla=='a') glutIdleFunc(animacion);
  169.      if(tecla=='p') glutIdleFunc(NULL);
  170.   }
  171.  
  172.   void main( int argc, char*argv[])
  173.   {
  174.      glutInit(&argc, argv);
  175.      glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  176.      glutInitWindowSize(320, 240);
  177.      glutCreateWindow("Mapa de Bits");
  178.      init();
  179.      glutDisplayFunc(redraw);
  180.      glutReshapeFunc(reshape);
  181.      glutKeyboardFunc(keyboard);
  182.      glutIdleFunc(animacion);
  183.      glutMainLoop();
  184.   }

Gracias!


Título: Re: OpenGL Texturas
Publicado por: Caster en 21 Mayo 2012, 21:07
Aunque tenga que ver con graficos esto iria en la sección de programacion creo.


Título: Re: OpenGL Texturas
Publicado por: cazagavilan en 21 Mayo 2012, 21:08
Ups perdon XD