Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Soviet on November 29, 2013, 05:07:16 AM

Title: color transaparente en bennu
Post by: Soviet on November 29, 2013, 05:07:16 AM
Hola a todos!!
quiza este tema ha sido mas que hablado, pero no he logrado encontrar un tema que satisfaga mi duda...
de un tiempo a esta parte me he estado pasando paulatinamente de fenix a bennu, sin embargo mientras he hecho algun que otro programejo, a la hora de probarlos con imagenes png, resulta que los cuadrados negros (rgb(0,0,0)) se siguen viendo como si no fuesen transparente, llegue a pensar que quizas fuese algun problema del editor de imagenes-paint tool sai- que uso, pero tome algunos viejos png(de 32 bits) que se veian con negro transparente en fenix, y sorpreasa!! en bennu siguen viendose los infames cuadrados negros de la imagen, alguien me podria dar una pista de en que estoy fallando??
Saludos!!
Title: Re:color transaparente en bennu
Post by: Yawin on November 29, 2013, 11:09:49 AM
¿A cuanta profundidad de color seteas el juego? Recuerda que si trabajas a 32 bits, para hacer un color transparente tienes que asignarle el canal Alpha. O sea, En put_pixel deberías de usar la función RGBA y no RGB.
Title: Re:color transaparente en bennu
Post by: panreyes on November 29, 2013, 11:12:13 AM
RGBA(0,0,0,0) es transparente :)


En 8 bits el color 0 es el transparente.


Y en 16 bits... no te sabría decir :?
Title: Re:color transaparente en bennu
Post by: laghengar on November 29, 2013, 12:51:10 PM
Me parece que en 16 bits es el rgb(0,0,0).

La diferencia con 32 bits es que puedes usar el rgb(0,0,0,255) como oscuridad total detectable en colisiones. Necesito confirmación de esto.


Title: Re:color transaparente en bennu
Post by: Soviet on November 29, 2013, 04:00:57 PM
bueno, al final probe con la funcion map_get_pixel y me devuelve que el valor que deberia ser negro sale como -16777216, alguien sabria que significa aquello, o la falla sera de los editores de imagenes que estoy usando(paint tool sai, mspaint)?
ah! y gracias por responder, chicos!
Title: Re:color transaparente en bennu
Post by: laghengar on November 29, 2013, 04:29:57 PM
Es posible que sea correcto, tengo entendido que cada tarjeta tiene un valor diferente para cada color. La mejor manera de conocer el color es mirando sus valores rgb, eso esto es: cantidad de rojo, verde y azul, como imaginas. Si quieres conocer qué color tienes lo mejor es que uses rgb_get(), y en sus parámetros señalas el offset de las variables dónde quieres guardar el valor. Esto sería:

rgb_get(map_get_pixel(libreria,grafico,x,y), &rojo, &verde, &azul);

Por supuesto que si lo único que quieres es copiar un color para otra parte, no te hace falta conocer estos valores.

También tienes rgba_get(), donde se añade un último parámetro para guardar el alpha.

Por otro lado, te recomiendo manejar un editor gráfico que maneje con canales alpha, ya que estos son la base para las transparencias. Como comprenderás, mspaint no lo hace y te coloca un negro no transparente.

Un saludo.

http://wiki.bennugd.org/index.php?title=Get_rgb (http://wiki.bennugd.org/index.php?title=Get_rgb)
http://wiki.bennugd.org/index.php?title=Rgba_get
Title: Re:color transaparente en bennu
Post by: Soviet on November 29, 2013, 05:05:32 PM
Quote from: laghengar on November 29, 2013, 04:29:57 PM
Es posible que sea correcto, tengo entendido que cada tarjeta tiene un valor diferente para cada color. La mejor manera de conocer el color es mirando sus valores rgb, eso esto es: cantidad de rojo, verde y azul, como imaginas. Si quieres conocer qué color tienes lo mejor es que uses rgb_get(), y en sus parámetros señalas el offset de las variables dónde quieres guardar el valor. Esto sería:

rgb_get(map_get_pixel(libreria,grafico,x,y), &rojo, &verde, &azul);

Por supuesto que si lo único que quieres es copiar un color para otra parte, no te hace falta conocer estos valores.

También tienes rgba_get(), donde se añade un último parámetro para guardar el alpha.

Por otro lado, te recomiendo manejar un editor gráfico que maneje con canales alpha, ya que estos son la base para las transparencias. Como comprenderás, mspaint no lo hace y te coloca un negro no transparente.

Un saludo.

http://wiki.bennugd.org/index.php?title=Get_rgb (http://wiki.bennugd.org/index.php?title=Get_rgb)
http://wiki.bennugd.org/index.php?title=Rgba_get
en efecto, use la funcion rgba_get y el alpha me da como valor 255
gracias langhengar, estaba sospechando que esto ultimo podia ser la falla, cambiare a otro editor de imagenes o complementare con gimp...
saludos!!
Title: Re:color transaparente en bennu
Post by: laghengar on November 29, 2013, 06:22:08 PM
De todos modos, en 16 bits tienes el negro de paint como transparente. No podrás usar gráficos con diferentes grados de transparencias, aunque hay otras funciones que te hacen cálculos para hacer una imitación, eso sí, tengo entendido que estas funciones son muy lentas.
Title: Re:color transaparente en bennu
Post by: Soviet on November 29, 2013, 07:33:28 PM
Quote from: laghengar on November 29, 2013, 06:22:08 PM
De todos modos, en 16 bits tienes el negro de paint como transparente. No podrás usar gráficos con diferentes grados de transparencias, aunque hay otras funciones que te hacen cálculos para hacer una imitación, eso sí, tengo entendido que estas funciones son muy lentas.
en todo caso no tengo intenciones de usar 16 bits de profundidad, al final logre solucionarlo, modificando el canal alpha en un editor de imagenes llamado gimp, gracias por la ayuda!!
Title: Re:color transaparente en bennu
Post by: SplinterGU on December 01, 2013, 09:57:36 PM
no es rgb sino 0.
Title: Re:color transaparente en bennu
Post by: Lord Sprit on December 01, 2013, 11:37:50 PM
Soviet creo que has solucionado el problema pero te voy a decir la causa. Son los perfiles de color o espacios de color, para que 0,0,0 sea transparente y te lo detecte bennu como tal el perfil de color con el que trabajes tiene que ser AdobeRGB (1998). Lo que pasa es que suelen traer todos los programas por defecto el perfil sRGB IEC 61966-2.1 y este por lo que he comprobado hace que el 0,0,0 bennu o el fpg edit lo considere negro.

Y si, los perfiles se incrustan en la imagen y no dependen del tipo de extension de esta por si alguien se lo pregunta
Title: Re:color transaparente en bennu
Post by: laghengar on December 02, 2013, 12:07:20 AM
Quote from: SplinterGU on December 01, 2013, 09:57:36 PM
no es rgb sino 0.

No lo he entendido o_O
Title: Re:color transaparente en bennu
Post by: laghengar on December 02, 2013, 12:08:02 AM
Quote from: Lord Sprit on December 01, 2013, 11:37:50 PM
Soviet creo que has solucionado el problema pero te voy a decir la causa. Son los perfiles de color o espacios de color, para que 0,0,0 sea transparente y te lo detecte bennu como tal el perfil de color con el que trabajes tiene que ser AdobeRGB (1998). Lo que pasa es que suelen traer todos los programas por defecto el perfil sRGB IEC 61966-2.1 y este por lo que he comprobado hace que el 0,0,0 bennu o el fpg edit lo considere negro.

Y si, los perfiles se incrustan en la imagen y no dependen del tipo de extension de esta por si alguien se lo pregunta
Tampoco lo he entendido o_O, pero esto me huele mucho más complicado, mejor déjamelo para mis clases intermedias o_O
Title: Re:color transaparente en bennu
Post by: Soviet on December 02, 2013, 03:51:04 AM
Quote from: Lord Sprit on December 01, 2013, 11:37:50 PM
Soviet creo que has solucionado el problema pero te voy a decir la causa. Son los perfiles de color o espacios de color, para que 0,0,0 sea transparente y te lo detecte bennu como tal el perfil de color con el que trabajes tiene que ser AdobeRGB (1998). Lo que pasa es que suelen traer todos los programas por defecto el perfil sRGB IEC 61966-2.1 y este por lo que he comprobado hace que el 0,0,0 bennu o el fpg edit lo considere negro.

Y si, los perfiles se incrustan en la imagen y no dependen del tipo de extension de esta por si alguien se lo pregunta
bueno, la verdad es que no habria considerado aquello, en cualquier caso no tengo problemas a la hora de editar el canal alpha de las imagenes para que estas no queden con el perfil de color por defecto, pero si tu no me lo dices no sabria ni por asomo que aquella era la causa...
Gracias a todos por la ayuda!!
Title: Re:color transaparente en bennu
Post by: Drumpi on December 02, 2013, 03:01:06 PM
Quote from: laghengar on December 02, 2013, 12:07:20 AM
Quote from: SplinterGU on December 01, 2013, 09:57:36 PM
no es rgb sino 0.

No lo he entendido o_O

Creo que quiere decir que da igual que sea un color RGB(0,0,0), BRG(0,0,0), YCMK(0,0,0,0) o patatalimónpera(0,0,0), Bennu (y Fénix) interpretan como transparente un pixel con el valor cero, independientemente de cómo se interprete la cadena de bytes o de que el pixel ocupe 1, 2, 3 ó 4 Bytes.
Title: Re:color transaparente en bennu
Post by: laghengar on December 03, 2013, 09:13:08 AM
Quote from: Drumpi on December 02, 2013, 03:01:06 PM
Quote from: laghengar on December 02, 2013, 12:07:20 AM
Quote from: SplinterGU on December 01, 2013, 09:57:36 PM
no es rgb sino 0.

No lo he entendido o_O

Creo que quiere decir que da igual que sea un color RGB(0,0,0), BRG(0,0,0), YCMK(0,0,0,0) o patatalimónpera(0,0,0), Bennu (y Fénix) interpretan como transparente un pixel con el valor cero, independientemente de cómo se interprete la cadena de bytes o de que el pixel ocupe 1, 2, 3 ó 4 Bytes.

Osea, color 0 en 8bits = 0

color rgb(0,0,0) en 16 bits = 0

color rgb(0,0,0,0) en 32 bits = 0

Para todos los pcs, es eso?
Title: Re:color transaparente en bennu
Post by: Drumpi on December 04, 2013, 12:14:53 AM
Sí, pero no has entendido bien lo que quería decir: cuando usas rgb (o rgba), bennu llama a la tarjeta gráfica para que transforme las componentes en un color, y esta devuelve un valor que vale entre 0 y 2¹⁶ (o 0 y 2³² si es de 32 bits). Si usas el valor 0 directamente, no se realiza esta operación.
Obviamente, en un gráfico fuera de Bennu no puedes poner un 0 de forma directa, sin usar un editor hexadecimal: tienes que usar una herramienta que, dado unos valores concretos, escriba cero en esa posición.

Puedes usar map_put_pixel(0) para poner un pixel transparente, independientemente del modo gráfico, no hace falta hacer map_put_pixel(rgb(0,0,0)).
Title: Re:color transaparente en bennu
Post by: Soviet on December 04, 2013, 01:17:03 AM
Quote from: Drumpi on December 04, 2013, 12:14:53 AM
Sí, pero no has entendido bien lo que quería decir: cuando usas rgb (o rgba), bennu llama a la tarjeta gráfica para que transforme las componentes en un color, y esta devuelve un valor que vale entre 0 y 2¹⁶ (o 0 y 2³² si es de 32 bits). Si usas el valor 0 directamente, no se realiza esta operación.
Obviamente, en un gráfico fuera de Bennu no puedes poner un 0 de forma directa, sin usar un editor hexadecimal: tienes que usar una herramienta que, dado unos valores concretos, escriba cero en esa posición.

Puedes usar map_put_pixel(0) para poner un pixel transparente, independientemente del modo gráfico, no hace falta hacer map_put_pixel(rgb(0,0,0)).
entonces puedes tomar aquel color con map_get_pixel y luego hacerlo transparente con map_put_pixel(0), cierto?
Title: Re:color transaparente en bennu
Post by: SplinterGU on December 04, 2013, 03:02:41 AM
Quote from: Drumpi on December 04, 2013, 12:14:53 AM
Sí, pero no has entendido bien lo que quería decir: cuando usas rgb (o rgba), bennu llama a la tarjeta gráfica para que transforme las componentes en un color, y esta devuelve un valor que vale entre 0 y 2¹⁶ (o 0 y 2³² si es de 32 bits). Si usas el valor 0 directamente, no se realiza esta operación.
Obviamente, en un gráfico fuera de Bennu no puedes poner un 0 de forma directa, sin usar un editor hexadecimal: tienes que usar una herramienta que, dado unos valores concretos, escriba cero en esa posición.

Puedes usar map_put_pixel(0) para poner un pixel transparente, independientemente del modo gráfico, no hace falta hacer map_put_pixel(rgb(0,0,0)).

bennu no llama a la tarjeta grafica para esto.

en 16 bits, rgb0,0,0 es rgb0,0,1 nunca es transparente, en cambio, si usamos el valor directamente en lugar de rgb (que rgb no es mas que una funcion que devuelve un entero), o sea, ponemos directamente 0, hacemos el color transparente.

en 32bits rgb(0,0,0) es rgba(0,0,0,255), rgba(0,0,0,0) es 0... pero es mejor poner directamente 0.

ahora si hacemos desde un programa grafico y creamos un png, lo que tenemos que hacer es poner el canal alpha al png y usar las transparencias segun el editor (usando el canal alpha para eso)
Title: Re:color transaparente en bennu
Post by: SplinterGU on December 04, 2013, 03:03:26 AM
Quote from: Soviet on December 04, 2013, 01:17:03 AM
Quote from: Drumpi on December 04, 2013, 12:14:53 AM
Sí, pero no has entendido bien lo que quería decir: cuando usas rgb (o rgba), bennu llama a la tarjeta gráfica para que transforme las componentes en un color, y esta devuelve un valor que vale entre 0 y 2¹⁶ (o 0 y 2³² si es de 32 bits). Si usas el valor 0 directamente, no se realiza esta operación.
Obviamente, en un gráfico fuera de Bennu no puedes poner un 0 de forma directa, sin usar un editor hexadecimal: tienes que usar una herramienta que, dado unos valores concretos, escriba cero en esa posición.

Puedes usar map_put_pixel(0) para poner un pixel transparente, independientemente del modo gráfico, no hace falta hacer map_put_pixel(rgb(0,0,0)).
entonces puedes tomar aquel color con map_get_pixel y luego hacerlo transparente con map_put_pixel(0), cierto?

si quieres ponerlo a 0, para que quieres tomarlo? (no lei todo el hilo, asi que quizas estoy preguntando alguna tonteria)
Title: Re:color transaparente en bennu
Post by: Soviet on December 04, 2013, 03:38:11 AM
Quote from: SplinterGU on December 04, 2013, 03:03:26 AM
Quote from: Soviet on December 04, 2013, 01:17:03 AM
Quote from: Drumpi on December 04, 2013, 12:14:53 AM
Sí, pero no has entendido bien lo que quería decir: cuando usas rgb (o rgba), bennu llama a la tarjeta gráfica para que transforme las componentes en un color, y esta devuelve un valor que vale entre 0 y 2¹⁶ (o 0 y 2³² si es de 32 bits). Si usas el valor 0 directamente, no se realiza esta operación.
Obviamente, en un gráfico fuera de Bennu no puedes poner un 0 de forma directa, sin usar un editor hexadecimal: tienes que usar una herramienta que, dado unos valores concretos, escriba cero en esa posición.

Puedes usar map_put_pixel(0) para poner un pixel transparente, independientemente del modo gráfico, no hace falta hacer map_put_pixel(rgb(0,0,0)).
entonces puedes tomar aquel color con map_get_pixel y luego hacerlo transparente con map_put_pixel(0), cierto?

si quieres ponerlo a 0, para que quieres tomarlo? (no lei todo el hilo, asi que quizas estoy preguntando alguna tonteria)
me refiero a que si el color no es transaprente, puedes hacerlo transparente por medio de esa funcion, es lo que queria saber
Title: Re:color transaparente en bennu
Post by: laghengar on December 04, 2013, 01:10:35 PM
Como trabajas a 32 bits, con que le pongas su alfa a cero es suficiente. Ahora, el único color que no es detectable en colisiones es el 0 absoluto, que para 32 bits es el (0,0,0,0). Lo que comentan Drumpi y Splinter es que (0,0,0,0) = 0.

Ahora, cualquier color (32,231,43,0) (23,56,32,0) (34,78,23,0).... que tenga el alfa a cero es invisible. Imagino que sabes que para diferentes niveles de transparencia tienes 256, ya que alfa puede tener un valor de 0 a 255. Y que todo eso lo puedes poner en el gráfico en un editor.
Title: Re:color transaparente en bennu
Post by: Drumpi on December 06, 2013, 12:14:21 PM
Quote from: SplinterGU on December 04, 2013, 03:02:41 AM
Quote from: Drumpi on December 04, 2013, 12:14:53 AM
Sí, pero no has entendido bien lo que quería decir: cuando usas rgb (o rgba), bennu llama a la tarjeta gráfica para que transforme las componentes en un color, y esta devuelve un valor que vale entre 0 y 2¹⁶ (o 0 y 2³² si es de 32 bits). Si usas el valor 0 directamente, no se realiza esta operación.
Obviamente, en un gráfico fuera de Bennu no puedes poner un 0 de forma directa, sin usar un editor hexadecimal: tienes que usar una herramienta que, dado unos valores concretos, escriba cero en esa posición.

Puedes usar map_put_pixel(0) para poner un pixel transparente, independientemente del modo gráfico, no hace falta hacer map_put_pixel(rgb(0,0,0)).

bennu no llama a la tarjeta grafica para esto.

¿Seguro? ¿Entonces por qué en 16 bits no todas las tarjetas de video devuelven el mismo color? ¿No lo hace Bennu a través de SDL, que es la responsable de este comportamiento?

Pero bueno, es más que nada para ilustrar la diferencia entre usar la función RGB y poner un valor directamente ;)
Title: Re:color transaparente en bennu
Post by: SplinterGU on December 06, 2013, 12:59:17 PM
quien te dijo que no devuelven el mismo color???!!! de donde sacaste eso???!!!

incluso si usaran SDL, tampoco llaman a la tarjeta.
Title: Re:color transaparente en bennu
Post by: laghengar on December 06, 2013, 01:12:34 PM
Entonces, por lo que estoy entendiendo, el entero que representa el color es el mismo en cualquier pc. La ventaja de usar rgb es que con el entero -1532345 uno no sabe que color puede ser, pero si ve rgb(0,10,0,5) es más fácil de imaginar.
Title: Re:color transaparente en bennu
Post by: Drumpi on December 06, 2013, 07:04:13 PM
Quote from: SplinterGU on December 06, 2013, 12:59:17 PM
quien te dijo que no devuelven el mismo color???!!! de donde sacaste eso???!!!

incluso si usaran SDL, tampoco llaman a la tarjeta.

En toda la documentación existente en Fenix. No me hagas buscarte la referencia concreta, porque ahora no la encuentro y voy con prisas urgentes, pero es la principal razón por el que se desaconsejaba la creación de mapas de durezas de 16 bits.
A menos que al reescribir código en Bennu hayas modificado este comportamiento, eso se seguiría dando hoy día.
Title: Re:color transaparente en bennu
Post by: SplinterGU on December 06, 2013, 08:02:39 PM
pues no es asi... creo que te confundes en que un valor A->B->C (siendo A rgb16, B int16, C rgb16) no siempre es A = C, y eso es simplemente por una cuestion logica, no puedes meter 24 bits en 16 sin perdida... de cada componente RGB16 solo se toman 565 bits (R5G6B5).

lo que dices no es correcto... los rgb16 no varian dependiendo de la placa de video o el hardware... varian dependiendo si se pierden o no bits en la conversion.
Title: Re:color transaparente en bennu
Post by: Drumpi on December 07, 2013, 05:07:03 PM
Bueno, Splinter, si no me crees, quizás creas a la wiki de divsite:
http://fenix.divsite.net/docs/xml/pal/rgb.xml (http://fenix.divsite.net/docs/xml/pal/rgb.xml)
QuoteLa codificación de un color depende completamente de la tarjeta
       gráfica
. Es posible que algunas tarjetas gráficas no dispongan
       de un modo de 16 bits y Fenix se ejecute en uno de 15 bits en
       su lugar, por ejemplo.

A tu favor diré que ignoraba la razón, pues teniendo ayuda offline, rara vez acudo a las fuentes en red, por lo que la razón, que quedó de manifiesto en algna de las actualizaciones, no la conocía.
Otra cosa es que ahora hagas la conversión por software con bennu.
Title: Re:color transaparente en bennu
Post by: SplinterGU on December 07, 2013, 05:26:02 PM
la wiki es una descripcion muy generica... no es correcto lo que dice...

aca se usan mapas 16 bits rgb 565, y se dibujan sobre un mapa similar... si luego sdl lo renderea a una pantalla 32bits o una de 16bits rgba 5551 o lo que sea, no nos interesa... nuestros pixels siguen siendo 565.