OpenGL Texturas

Iniciado por cazagavilan, 21 Mayo 2012, 21:06 PM

0 Miembros y 1 Visitante están viendo este tema.

cazagavilan

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 (cpp) [Seleccionar]
#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!

Caster

Aunque tenga que ver con graficos esto iria en la sección de programacion creo.

cazagavilan