Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: romon_28 en Junio 10, 2013, 06:13:02 PM

Título: Colores iguales
Publicado por: romon_28 en Junio 10, 2013, 06:13:02 PM
en los colores:

Siendo Rojo el 1º valor, Azul el 2º valor, Verde el 3º valor, Trasparencia el 4º valor:
porque
1 1 1 0 = 0 0 0 0 ?
Título: Re:Colores iguales
Publicado por: Mgbu en Junio 10, 2013, 06:45:57 PM
Nunca uso colores pero por lo que entiendo el primer color (1110) es blanco y el segundo (0000) negro. Pero si te fijas los dos colores son completamente transparentes, porque su cuarto valor es 0.
Título: Re:Colores iguales
Publicado por: brunoxzx en Junio 11, 2013, 08:23:53 AM
Bueno la respuesta ya te la dio mgbu pero te recuerdo que no siempre son iguales cuando usas blend modes el blanco que usas que es 100% transparente puede llegar a verse.

También hay problemas cuando en tus sprites tienes colores (cualquier valor que no sea negro) con 0 de transparencia. Esto es complicado que ya que en el editor de sprites no se ven, pero al usar la interpolación de texturas (interpolate colors between pixels) se ven y dan el aspecto de pixeles blancos o negros aparentemente aleatorios en tus sprites.
Título: Re:Colores iguales
Publicado por: romon_28 en Junio 11, 2013, 02:59:45 PM
Corrijo: Rojo el 1º valor, Verde el 2º valor, Azul el 3º valor, Trasparencia el 4º valor.
Aclaro: RVA: <"0" = 0 ; "1" = 255>;
1+1 = 1;
0-0 = 0;

Cuando adhiero un color con otro:

0 0 1 1
0 1 0 0 +
----------
0 1 0 1

Cuando sustrae un color con otro:

0 0 1 1
0 1 0 0 -
----------
0 0 1 0

/////////////////////////////////7
Objetivo: Sustraer un color a una imagen.
Quiero eliminar un color, por ejemplo el "Rojo", para eso tengo 1º colocar a quien le quiero sustraer el color y luego el color que le quiero sustraer.

ejemplo 1a
1 0 0 1
1 0 0 1 -
----------
0 0 0 0

ejemplo 1b
0 1 0 1
0 0 0 1 -
----------
0 1 0 0

ejemplo 1c
1 1 1 1
1 0 0 1 -
----------
0 1 1 0

2º- Ahora tengo un problema. Todos los colores tienen la misma traspatencia ("0"), y no me sirve. asi que le adhiero a todos una trasparencia de "1":


ejemplo 2a
0 0 0 0
0 0 0 1 +
----------
0 0 0 1

ejemplo 2b
0 1 0 0
0 0 0 1 +
----------
0 1 0 1

ejemplo 2c
0 1 1 0
0 0 0 1 +
----------
0 1 1 1

Lo que me quedaria es que en todos las combinaciones de colores el rojos sea "0", y que todas las trasparente ahora seria bisible.
Pero... eso no es lo que verdaderamente se ve. El resultado final queda asi:


ejemplo 3a
0 0 0 0
0 0 0 1 +
----------
0 0 0 1

ejemplo 3b
0 1 0 0
0 0 0 1 +
----------
0 0 0 1

ejemplo 3c
0 1 1 0
0 0 0 1 +
----------
0 0 0 1

En todos los casos la adhicion de color parece quedar nulo en el caso que la trasparecencia quede en "0".
Por lo que mi teoria es que:
1 1 1 0 = 0 0 0 0
1 0 0 0 = 0 0 0 0
0 0 1 0 = 0 0 0 0
1 1 0 0 = 0 0 0 0
Quiero saber si tengo razon y en el caso que lo tenga ¿Como puedo hacer para cumplir el objetivo?
Título: Re:Colores iguales
Publicado por: Mgbu en Junio 11, 2013, 07:06:00 PM
Que yo sepa los colores con alpha 0 no se suman porque justamente tienen alpha 0. Para mi que antes se multiplica la cantidad de color por al alpha, asi lo dice aquí (http://en.wikipedia.org/wiki/Alpha_compositing) (If it is assumed that all color values are premultiplied by their alpha values...) , algo asi:

  (0 0 0)* 1
+ (1 1 1)* 0.5
---------------
0.5 0.5 0.5 1 


Entonces todos los colores con 0 de alpha son iguales, porque todos son invisibles. No se puede sustraer un color realizando una resta con el color rojo?

  1 1 1 1
- 1 0 0 1
  --------
  0 1 1 1
Título: Re:Colores iguales
Publicado por: romon_28 en Junio 12, 2013, 02:11:03 PM
Ya lo solucione:
El 1º paso se aplica draw_set_blend_mode(bm_subtract);
El 2º paso se aplica draw_blend_mode_ext(2,6);

Ahora no se que es ese 2 y 6
No entiendo mucho soble el draw_blend_mode_ext pero eso es otra pregunta.
Título: Re:Colores iguales
Publicado por: romon_28 en Junio 13, 2013, 03:01:39 PM
Con:

surface_set_target(S1);
draw_sprite(Sp_Color,0,0,0);
draw_set_blend_mode_ext(bm_inv_src_color,bm_src_color);
  draw_sprite(Sp_Cian,0,0,0);//Color Inverso
draw_set_blend_mode(bm_normal);
surface_reset_target();

haces lo mismo en un solo paso    :-[