Programación Específica > DirectX
Color De Mascara
JuanK:
saludo...
se me ha presentasdo un inconveniente..
he diseñado en directx unas librerias para soportar sprites con un color de mascara
R=255 G=0 B=255
adicionalmente las librerias soportan cualquier color de mascara segun se pase un parametro en el constructor del personaje, es decir cualquier color de mascara funciona OK.
Adicionalmente tambien soportan un rango de color desde que este sea pasado como un rango de enteros de 32 bit.
Hasta aca todo esta OK, esto siempre y cuando se utilice modo de color 32 o de 24 bit, pro al inicialzar el modo de color de 16 bit ninguno de los colores de mascara surten efecto...
No se porque sucede esto, ya que la mascara la establezco con el colorkey que posee directX, es decir no uso nada del otro mundo...
Cuando mire detenidamente me di cuenta que en modo de 16 bit asume como mascara el color negro unicamente o por lo menos eso es lo que parece, la pregunta es si alguno de ustedes sabe como puedo establecer mi propio color de mascara en modo de 16 bit.
Esto solo falla cuando se establece el modo de pantalla completa ya que en el modo ventana todo funciona segun lo previsto.
agradezco cualquier comentario.
Anexo ejemplo de lo que sucede.
Amilius:
Saludos al foro!!
Y que tal provando con el color Magenta directamente como su valor entero y no como triada RGB:
$3E0F (15 bits.)
$F81F (16 bits.)
$FF00FF (24 bits)
$00FF00FF (32 bits)
El color negro siempre funciona por que obviamente el R:0,G:0,B:0 que es el negro siempre es 0 en 15,16,24,32 bits.
JuanK:
:D De hecho con los valores enteros si funciona, de eso me he dado cuenta ya hace unas horas B)
En todo caso mil gracias amilus...
Ahora el problema realmente radica en que ya tengo hechas las funciones que me aceptan usar las diferentes sobrecargas del constructor de pesonajes para usar cualquier color de mascara o cualquier rango de colores de mascara, o el color que siempre he usado por defecto (Magenta)... pero no funcionan con 16 bits ...
pero ya lo solucione!! :ph34r:
Codigo de las clase que carga los personajes desde achivos:
--- Código: Text --- if(gc.ProfColor == 16 && gc.EstadoVideo ==EnEstadoVideo.PantallaCompleta) { ck.ColorSpaceLowValue = gc.ConvierteA16Bit(ccb); ck.ColorSpaceHighValue = gc.ConvierteA16Bit(cca); } else { ck.ColorSpaceLowValue = ccb; ck.ColorSpaceHighValue = cca; }
Codigo del administrador grafico:
--- Código: Text --- public UInt16 ConvierteA16Bit(Int32 color) { byte uno, dos, tres; ushort ret; byte p1, p2; uno = (byte)(color & 0x000000FF); dos = (byte)((color & 0x0000FF00)>>8); tres= (byte)((color & 0x00FF0000)>>16); uno= (byte)(0x1F*uno/0xFF); tres=(byte)(0x1F*tres/0xFF); dos= (byte)(0x3F*dos/0xFF); p1 = uno; p1 = (byte)(p1&((dos <<5)|0xFF)); p2 = (byte)(dos>>3); p2 = (byte)(p2|(tres<<3)); ret =p1; ret =(ushort)(ret|(p2<<8)); return ret; }
Ahora ya ha quedado solucionado ;)
Sin embargo pues la verdad no soy muy bueno con la eficiencia en los algoritmos de bajo nivel, asi que me tomo el atrevimiento de ahora pedir ayuda para hacer mas eficiente la funcion de conversion de colores, no es que tenga problemas, de hecho como solo se usa cuando se establece el colorKey, es decir en los cambios de modo de pantalla y al inicializar no es muy importante y nunca se notaria las fallas de rendimiento.. pero estoy totalmente seguro de que se puede hacer de una manera mucho mas eficiente, y pues la verdad no tengo mucho tiempo para dedicarle a ese tipo de cosas (aunque son muy importantes),
nuevamente agradezco cualquier colaboracion.
Ruben3d:
Hola.
La manera más óptima que se me ocurre de pasar de 32 bits a 16 es:
--- Código: Text --- public UInt16 ConvierteA16Bit(Int32 color) { return (ushort) ( ((color >> 8) & 0xF800) | ((color >> 5) & 0x07E0) | (color >> 3) ); }
Intuitivamente debería de funcionar. Primero desplazo los bits más significativos a la posición que deberían ocupar si fuese de 16 bits, después elimino los menos significativos que no quiero, y después lo recompongo todo.
Ya me dirás si funciona (espero que sí :blink: ).
Un saludo.
Ruben3d
JuanK:
;)
Hola ruben3D,
Gracias.
Arrojo el error que anexo.
En todo caso revisare muy bien tu propuesta para ver si puedo hacerla funcionar.
Navegación
[#] Página Siguiente
Ir a la versión completa