Crear imagen con 4 canales (RGBA) en SDL

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

Crear imagen con 4 canales (RGBA) en SDL

Notapor venerdhi » Jue Oct 18, 2007 7:12 am

Hola, soy nuevo en SDL. He empezado a mirar alguna cosa, y he visto que se puede establecer el alpha en una imagen completa o un sprite, pero lo que quiero es tener una imagen con 4 canales, o sea, que tenga un canal alpha, y poder ajustar el alpha en cualquier parte de la imagen, no en la imagen concreta, colocándole la máscara que vea oportuna, pero no se como hacerlo, no encuentto la manera. si alguien supiese como hacerlo y me diese alguna idea lo agradecería mucho.

Muchas gracias,
Venerdhi.
Omnia vincit amor!
venerdhi
 
Mensajes: 3
Registrado: Mié Oct 17, 2007 9:02 pm

Notapor hugoruscitti » Jue Oct 18, 2007 6:17 pm

Hola, buenas tardes.

Como bien has indicado, SDL tiene funciones para alterar la
transparencia de superficies completas, y en principio no cuenta
con funciones para alterar cada pixel.

Aún así, hay dos formas de alterar la transparencia de cada pixel
en una superficie:

1 - Puedes utilizar la bibilioteca adicional "SDL_image" para incorporar
a tu programa superficies a partir de archivo PNG. Los archivos
PNG almacenan internamente un canal alpha, así que puedes
elegir los diferentes grados de transparencia directamente desde
un programa de dibujo, guardarlos a un archivo y luego cargarlos
en el juego.

Puedes utilizar un programa como Gimp[1] para esto.

2 - SDL te permite acceder a la composición interna de una
superficie, por lo tanto puedes crear funciones para "obtener"
o "definir" pixeles con mucha precisión. Esto es un poco mas
difícil, pero hay varios ejemplos de programas que hacen esto.

Por ejemplo, hace un tiempo armé un ejemplo que mostraba
en pantalla una superficie y te permitía alterar las componentes
de color de la misma mediante barras horizontales:

Imagen

este ejemplo lo puedes encontrar en la sección ejemplos de la
web Losersjuegos:

http://www.losersjuegos.com.ar/referencia/ejemplos/ejemplos.php

si bien este ejemplo modifica todos los pixeles a la vez, en
realidad no utilizo la función "SDL_SetAlpha", sino que modifico
el contenido de la superficie con las funciones "get_pixel_color"
y "set_pixel_color". Puedes descargar el código y jugar con él,
si tu programa será libre también puedes re-utilizar el código.

Creo que el ejemplo "fundido de superficies" que hizo Pablo, y
también está en la sección "ejemplos" de la web, utiliza acceso
interno a las superficies para realizar efectos de transparencia.

Saludos, y mucha suerte.

[1] - http://es.wikipedia.org/wiki/GIMP
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Muchas gracias por responder tan rapido

Notapor venerdhi » Jue Oct 18, 2007 8:30 pm

Hola hugoruscitti,

Se me olvido decir que quería aplicar la transparencia dinámicamente. Mi objetivo es el siguiente. Quería hacer que hubiese una imagen oscura en pantalla, y al pasar con el cursor sobre la imagen se iluminase (o mostras la imagen que hay debajo con un blending). Para eso tengo que acceder al alpha directamente para dibujar un círculo allí donde este el cursor y hacer transparente la imagen de arriba permitiendo ver la de abajo.

Otra forma de poder dar este efecto sería poder pegar un trozo circular de una imagen sobre otra, pero no se si eso se puede hacer con máscaras. Igual eso podía ser más sencillo, la verdad es que no lo tengo muy claro.

Otra pregunta, si cargo una imagen png con sdl_image, se supone qeu tiene un canal alpha al cargarse? En ese caso, podría acceder al canal alpha? Alguién lo ha hecho alguna vez?

Echare un vistazo a los códigos que me dices. Algo así ya habia hecho yo anteriormente en OpenCV (no es una librería para gráficos, pero bueno, entonces no tenía otra cosa a mano) y me hice un efecto blending a mano pixel a pixel, pero eso es lento y costoso computacionalmente con imagenes grandes, por eso esperaba que sdl tuviese alguna forma de hacerlo sin tener qeu hacerlo a mano, en cualquier caso, echare un vistazo a los códigos para prepararme para lo peor, jajaja

Muchas gracias de nuevo!!!!
Venerdhi
Omnia vincit amor!
venerdhi
 
Mensajes: 3
Registrado: Mié Oct 17, 2007 9:02 pm

Notapor hugoruscitti » Vie Oct 19, 2007 2:12 pm

venerdhi escribió:Otra pregunta, si cargo una imagen png con sdl_image, se supone qeu tiene un canal alpha al cargarse? En ese caso, podría acceder al canal alpha? Alguién lo ha hecho alguna vez?


Sí, tendrá el canal alpha del archivo PNG original, y luego de crear
una superficie a partir de ese archivo podrás acceder a la tonalidad y
transparencia de cada pixel. Observa el código del programa que te comenté
anteriormente, ahí encontrarás funciones para acceder a cada componente
de color (incluido el canal alfa) y modificarlo. Las funciones
se llaman "get_pixel_color" y "set_pixel_color".

A grandes rasgos, los pixeles de una superficie están compuestos de 4
valores numéricos: "red", "green", "blue" y "alpha". Alterar estos
valores es un poco difícil porque, en principio, no están separados. Por
ello es aconsejable utilizar funciones, hace mas sencilla la tarea.

venerdhi escribió:... y me hice un efecto blending a mano pixel a pixel, pero eso es lento y costoso computacionalmente con imagenes grandes, por eso esperaba que sdl tuviese alguna forma de hacerlo sin tener qeu hacerlo a mano, en cualquier caso, echare un vistazo a los códigos para prepararme para lo peor, jajaja


Es cierto, manipular pixel a pixel una imagen grande puede ser
algo lento... pero en muchos casos esta velocidad es imperceptible.
Sería prudente no "optimizar" o "evaluar" antes de tiempo, en su lugar
uno puede escribir el programa, ejecutarlo y preguntarse: ¿realmente
funciona tan lento?, ¿que tan grandes son esas superficies?, o ¿que
puedo mejorar para hacerlo mas rápido?. Generalmente no nos hacemos
esta última pregunta porque funciona rápido la primera vez (de verdad).

Al menos en el ejemplo de superficies que construí para la web, el
rendimiento del programa me pareció muy bueno, incluso sin tener una
tarjeta aceleradora de gráficos. Ten en cuenta que los lenguajes como
C o C++ son bastante rápidos para hacer esta clase de cosas.

Otra forma de hacer tu programa mas rápido, es agilizar impresiones en
pantalla que realiza "blit", para esto necesitas convertir todas las
superficies al formato de color que utiliza la pantalla principal; la
función que realizar esta tarea es "SDL_DisplayFormat", o bien la
función "SDL_DisplayFormatAlpha" si tus superficies tienen canal "alpha":

http://www.libsdl.org/cgi/docwiki.cgi/S ... ormatAlpha


Ten en cuenta que muchas otras bibliotecas como OpenGL te permiten
realizar todas estas tareas de blending de manera mucho mas rápida debido
a que utilizan el Hardware de una tarjeta aceleradora de gráficos. SDL
intenta ser independiente de esa clase de Hardware, ese es uno de los
motivos por el que no existe esa funcionalidad en la biblioteca base.

igual... ojo, a mí me gustaría que tuviera efectos de blending, pero
bueno, no los tiene. El punto es que vos conoces mejor a tu juego que
los desarrolladores de SDL, por lo tanto, vos podes construir funciones
de 'blending' mas cercanas a tus necesidades, y por lo tanto mas
directas, breves y eficientes.

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Muchas gracias

Notapor venerdhi » Sab Oct 20, 2007 3:14 pm

Muchas gracias, eso era lo que quería saber, que tenía acceso al canal alpha.

Mirare los ejemplos, y si tengo alguna duda o problema ya os lo comentaré.

Cuando acabe mi ejemplo, a ver si puedo subiroslo para que lo tengais para si alguien más tiene alguna duda.

Muchas gracias,
Venerdhi.
Omnia vincit amor!
venerdhi
 
Mensajes: 3
Registrado: Mié Oct 17, 2007 9:02 pm


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado