[eside-ghost] Mostrar imagen sobre un quad en OpenGL

Sergio Barajas sbarajas en gmail.com
Mie Nov 10 19:49:50 CET 2010


No me hagas mucho caso eh... pero yo juraría que si tu abres una imagen 
en GIMP te deja guardarla como archivo.c el cual se puede abrir 
directamente y utilizar como textura en OpenGL. Pero mejor que te lo 
confirme algún experto en OpenGL que en la lista creo a hay unos pocos.
Un saludo

El 10/11/10 19:43, Eneko chan escribió:
> 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 );
>
>
> _______________________________________________
> eside-ghost mailing list
> eside-ghost en listas.deusto.es
> https://listas.deusto.es/mailman/listinfo/eside-ghost

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: https://listas.deusto.es/mailman/private/eside-ghost/attachments/20101110/e32c11aa/attachment.htm 


Más información sobre la lista de distribución eside-ghost