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

Jon Valdés juanval en gmail.com
Mie Nov 10 20:34:15 CET 2010


Heeey,

OpenGL! Me apunto!

2010/11/10 Eneko chan <enekochan en gmail.com>:
> 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:

Quad viene de que es un cuadrilátero, y ponerle textura es fácil, tranquilo.

> 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.

Lo mas facil para esto es pillarte una libreria de carga de imágenes
(libpng, libjpg, libtga, la que te de la gana), que todas te pasan
luego los datos en rgb tal y como los quiere opengl.
Otra opción es lo que dice Sergio de usar el plugin de Gimp que te
saca una textura en el formato ese que es un array de C en texto, que
haces un #include directamente en el codigo. Eso sí, esa opcion es un
tanto menos flexible.

> 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.

Esto es sólo porque no estás especificando bien las coordenadas de
textura. Tienes que poner una esquina del quad con coordenadas de
textura (0,0), y la otra a (1,1). Con eso ya se te verá bien.

>   // build our texture MIP maps
>   gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width,
>     height, GL_RGB, GL_UNSIGNED_BYTE, data );

Hasta ahi todo bien, pero no necesitas crear mipmaps para esto. Con
usar glTexImage2D puedes hacerlo sin problemas. Si no quieres
complicarte puedes dejarlo asi, pero la carga será algo más lenta
(tiene que construir los mipmaps, y eso es por software).

>       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);

Aqui están tus glTexCoords, pon esos en el rango [0,1], y la textura
quedara bien.


>   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);

Si solo quieres ver una imagen no creo que necesites luces. Si eso,
quita todo lo relacionado con lights, y listo (y pon un
glDisable(GL_LIGHTING) por si acaso).

>   glMaterialfv(GL_FRONT, GL_SPECULAR, mat_flash);
>   glMaterialfv(GL_FRONT, GL_SHININESS, mat_flash_shiny);
>   glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);

Si tampoco necesitas materiales, quita esto.

Lo demás tiene buena pinta.

Como ayuda adicional, para estas cosas siempre puedes contar con NeHe
(que aunque desfasado, para los principiantes es perfecto):
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=06

Ya contarás ;)


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