[eside-ghost] Mostrar imagen sobre un quad en OpenGL
Eneko chan
enekochan en gmail.com
Mie Nov 10 19:43:15 CET 2010
Hola,
Espero que esta duda tenga cabida en esta lista, sino pido disculpas por
adelantado.
Acabo de empezar con OpenGL y me han metido el envolado de hacer una especie
de presentación con transparencias usando OpenGL de forma que aparezcan en
un espacio tridimensional y se puedan ir pasando. No puedo usar otra
aplicación que haga lo mismo, tiene que ser con OpenGL en C por narices ya
que debe integrarse en algo que ya existe.
Yo había pensado poner un plano (parece que se llaman quad...) y ponerle
como textura la imagen que quieren que se vea. La cosa parecía algo trivial:
crear un quad y ponerle una imagen (ya fuese PNG o JPG o cualquier otro
formato soportado) como textura ocupando toda la superficie y listo. Pero me
he dado cuenta de que las texturas hay que pasarlas como un "churro" de
bytes y luego no es tan sencillo colocarlas en el quad. Lo de cargar la
imagen pues lo hago con una imagen en formato "crudo" (.raw pero no de
cámara de fotos, sino los bytes RGB tal cual sin cabeceras ni nada) con
cualquier programa de retoque y creo la estructura de datos que hace falta.
El problema es que probando y probando solo he conseguido un quad con la
imagen repetida miles de veces sobre ella si utilizo la opción GL_REPEAT o
solo una vez en una esquina en pequeñito si uso la opción GL_CLAMP. He
probado con una imagen de 256x256 y otra de 1024x1024 para la textura, pero
en los dos casos se ve igual.
¿Alguien sabría decirme como cargar una imagen en OpenGL (ya sea en un quad
o sea como sea)? La cosa es que se pueda distinguir lo que pone o al menos
que se vean las imágenes que aparecen.
Os pongo un resumencillo de como cargo la textura y como creo el quad a ver
si sabéis porque no me funciona o me podéis dar una pista.
// ---------------------------------Leer del fichero la
imagen----------------------------------------
int wrap = 1; // Repite o no la imagen en la textura
GLuint texture;
int width, height;
void * data;
FILE * file;
// open texture data
file = fopen( "Data/texture.raw", "rb" );
if ( file == NULL ) return 0;
// allocate buffer
width = 256;
height = 256;
data = malloc( width * height * 3 );
// read texture data
fread( data, width * height * 3, 1, file );
fclose( file );
//-------------------------------------Crear la
textura------------------------------------------------
// allocate a texture name
glGenTextures( 1, &texture );
// select our current texture
glBindTexture( GL_TEXTURE_2D, texture );
// select modulate to mix texture with color for shading
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
// when texture area is small, bilinear filter the closest MIP map
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_NEAREST );
// when texture area is large, bilinear filter the first MIP map
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
// if wrap is true, the texture wraps over at the edges (repeat)
// ... false, the texture ends at the edges (clamp)
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
wrap ? GL_REPEAT : GL_CLAMP );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
wrap ? GL_REPEAT : GL_CLAMP );
// build our texture MIP maps
gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width,
height, GL_RGB, GL_UNSIGNED_BYTE, data );
// free buffer
free( data );
//--------------------------------------Crear el quad y ponerle la
textura-----------------------------
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, texture );
glPushMatrix();
glBegin( GL_QUADS );
glTexCoord2d(0.0,0.0); glVertex2d(-50.0,-50.0);
glTexCoord2d(50.0,0.0); glVertex2d(+50.0,-50.0);
glTexCoord2d(50.0,50.0); glVertex2d(+50.0,+50.0);
glTexCoord2d(0.0,50.0); glVertex2d(-50.0,+50.0);
glEnd();
glFlush();
glPopMatrix();
glDisable (GL_TEXTURE_2D);
glClearDepth( 1.0 );
glClear(GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
/* load the camera transformation matrix */
// Aquí va un código que carga el valor a gl_para
glMatrixMode(GL_MODELVIEW);
glLoadMatrixd( gl_para );
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambi);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_flash);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_flash_shiny);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMatrixMode(GL_MODELVIEW);
glTranslatef( 0.0, 0.0, 25 );
glDisable( GL_LIGHTING );
glDisable( GL_DEPTH_TEST );
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: https://listas.deusto.es/mailman/private/eside-ghost/attachments/20101110/76b54a5f/attachment-0001.htm
Más información sobre la lista de distribución eside-ghost