27 nov 2005

27/11/05: Parcheo y mejoras

Diario de Guerra de Alejandro González, Alias "WaaghMan". Centesimotrigesimosegunda anotación:

AVISO! POST MUY TÉCNICO.

He actualizado el cronómetro de MSN-Messenger, nada serio de todas maneras. Tan sólo he añadido una línea al comienzo del XML, especificando el encoding. Lo hice porque el programa no funciona correctamente si no lo pones y metes acentos o caracteres raros en el archivo de texto. Presumiblemente, por la forma cutre en que se convierten las strings de WCHAR a TCHAR (o algo así), cualquier caracter por encima del 256 en la tabla ASCII fallará al mostrarse, me temo. Pero al menos no dejará de funcionar.

El otro cambio se ha hecho en el motor 2D en C#. He creado un par de Pixel Shaders más, que sumados al de inversión de colores que había creado antes, hacen un total de 3.
El primero de los nuevos simplemente duplica las componentes RGB del color (o una sola de ellas, si se desea). Esto hace que los colores se vean mucho más fuertes.
El segundo es un poquito más complejo (aunque sigue siendo muy facilón): Si una componente RGB es menor a 128, la divide a la mitad. Si es mayor, le suma la diferencia entre 256 y su valor. Es decir, en cualquier caso se alejan del punto medio. Esto logra una especie de contraste que queda bastante cuco.

Posiblemente busque a ver si encuentro algún PS ya hecho que cambie el color a un tono sepia. Seguro que ya existen, es un efecto bastante típico.

La segunda mejora al motor ha costado bastante más, se trata del Render To Texture. Esta técnica y yo somos viejos conocidos ya, ya me dio bastantes dolores de cabeza al programar el Little Racers 2 (aunque en aquella ocasión fue bajo OpenGL).
En Direct3D la cosa resulta más sencilla que en OpenGL, porque las texturas permiten ser modificadas sin tener que hacer nada raro antes. Eso sí, al terminar hay que acordarse de regenerar los mipmaps, si no pasarían cosas graciosas :).

Así pues, el dibujar algo sobre una textura no resultó ser el inconveniente. El inconveniente fue el dibujarlo como y donde queríamos. Me explico:

Para hacer el Render To Texture, lo que hace Direct3D es crear un nuevo "Render Target", o dispositivo donde se va a hacer el renderizado (Es decir, que en vez de dibujar al buffer de la pantalla, dibujaremos a la memoria de la textura). Por tanto, a todos los efectos es como una pantalla más, con sus matrices de transformación, etc. Por tanto, hay que dibujar todo en las coordenadas adecuadas, para que aparezca donde queríamos que apareciese. Como las coordenadas ya estaban siendo transformadas para aparecer en pantalla, me costó bastante descubrir qué matrices había que tocar y qué matrices no, cuales ignorar y cuales no. Al final, lo conseguí. Surgió un problema menor, y era que estaba redibujando toda la textura, lo que daba un parón de más de un segundo en texturas grandes. Eso fue fácil de solucionar, especificando una región concreta de la textura en vez de toda ella.

Ahora tan sólo me queda hacer una textura que sea un manchurrón de sangre, y ver qué tal queda el suelo repleto de ella :).

Sigo sin poner link por culpa de la mierda de las versiones de DirectX :P.

PD: Manchurrones de sangre hechos :).

1 comentario:

Abe dijo...

Es posible que la opción de mostrar mensajes según la aplicación de tu cronómetro no sea compatible con "Lo que estoy escuchando"?