[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