31 de julio de 2008

Problemas en las bolas

Llevo un par de días probando algo nuevo, y aunque no me lo esperaba he avanzado lo suficientemente rápido como para tener casi listo un nuevo ejemplo para PC:



Son las típicas metaballs o "blobs", pero generados mediante un efecto de post-proceso. Esto como siempre tiene su parte buena y su parte mala. La buena es que es muy rápido (ahora mismo me funciona a unos 600 fps pese a que uso un par de rendertargets de 64 bits), y la mala es que al no tener en cuenta la profundidad, a veces se pierde mucho la sensación de perspectiva y se mezclan bolas que quizás no deberían... Eso seguramente será un problema donde iba a usar este efecto, así que quizás tengo que hacer algunos cambios de concepto. ^^U

En fin, que por un lado estaba contento porque había quedado bastante bien en poco tiempo, pero por otro acabé sumamente cabreado porque no hubo manera de hacerlo funcionar bien en Xbox 360. En el ejemplo se usan point sprites para pintar las diferentes bolas, y por alguna razón que todavía no se explicar, en la consola no he conseguido modificar el tamaño de estos sprites para dar sensación de 3D. Y además en general todos los shaders usados dan algún problema, ya sea con las coordenadas de textura (si, he usado SPRITETEXCOORD en el caso de ejecutarlo en la consola) o en el paso final de post-proceso, donde no hace lo que debe hacer.

Necesito que esto funciona en ambas máquinas, así que será lo que trabaje en los próximos días.

27 de julio de 2008

A otra cosa, mariposa

Acabo de subir a XNACommunity el ejemplo de fluidos! Ahora toca ponerse con otro tema, que ya digo que será completamente diferente. Ya tengo una idea de qué hacer, pero hoy no voy a tener tiempo de empezar hoy, así que mañana al lío.



Por cierto, si se pausa la simulación en la demo, se puede seguir echando tinta y por tanto se sigue sumando la velocidad del fluido, así que si luego se reanuda se generan animaciones y formas bastante curiosas. ^^

25 de julio de 2008

Por fin se acabó

Bueno, tampoco es que haya sido una tortura, pero ya tenía ganas de terminar. Acabo de dar por finalizado el ejemplo de los fluidos 2D. He añadido un par de cosas puramente estéticas y mejorado el rendimiento (unos 15 milisegundos en ambas máquinas), además de cambiar un poco la funcionalidad (el fluido ya no va hacia arriba automáticamente, sino en la dirección del cursor) y añadir soporte total para Xbox 360. Un ejemplo del resultado final es esto:



Ahora en mi máquina va incluso un poco demasiado rápido (no hago ningún tipo de control en ese aspecto), pero creo que después de todo no ha quedado tan mal. Durante este fin de semana acabaré de pulir detalles en el código (aka limpieza de mierda) y lo colgaré, a ver si gusta. ^^

Ya grabaré el video correspondiente cuando vaya a colgar el ejemplo. ;)

24 de julio de 2008

Decepcionado

Y mucho, además. Hoy he usado la suscripción gratuita al Creators Club que dan al registrarte en DreamBuildPlay (es un añazo gratis!). Me hacía bastante ilusión probar mis ejemplos en la consola, y al principio todo ha ido bien... He probado un par de ejemplos antiguos y funcionaban perfectamente, pero luego ha llegado el momento de probar el que realmente quería poner a prueba.

He creado un proyecto de los fluidos para Xbox 360, he toqueteado un poco el código para que funcionase sin ratón y... F5... Deploying... Running... Zas, lento de narices. Es que no iba ni la mitad de rápido que en PC.

He cambiado alguna cosa más para tener información más precisa de cuánto estaba tardando:

- PC: Fluido de 100x100 -> ~25 ms
- Xbox360: Fluido de 64x64 -> ~65 ms

Si, eso es más del doble de tiempo con una matriz de casi un cuarto del tamaño original. La diferencia es muy grande, *enorme*, sobre todo cuando en principio había metido el thread de la simulación en su propio core... Sabía que XNA era bastante lento en la consola, pero no imaginaba que tanto.

Esto me ha trastocado un poco los planes, y me ha dejado un poco de bajón. ^^U

Pero bueno, me ha servido para ver que con el fluido de 64x64, el Gaussian Blur que puse no servía para prácticamente nada porque lo hacía sobre una imagen muy pixelada puesta sobre un backbuffer a una resolución bastante alta. Esto podría parecer un palo más, pero en realidad me ha servido para mejorar algo bastante interesante... como la Xbox (y muchas gráficas actuales) no permitía filtrar por hardware la textura de la tinta, he decidido implementar el filtro bilinear directamente en el shader, a mano. Bueno, irá como una tortuga pero por lo menos se ve bonito. Seguramente este fin de semana lo dejaré como pueda y lo subiré ya.

OMG no hay foto! o_O

23 de julio de 2008

Pacheando

Estos días he probado el tema de los fluidos en otros PCs para comprobar el rendimiento en máquinas bastante diferentes. Parece que aguanta bastante bien aunque al guardar el color en una textura de 128 bits, hay muy pocas gráficas que la puedan filtrar a la hora de pintar (básicamente todo lo que no lleva una DX10 lo pintará pixelado).

En vez de cambiar la manera de guardar el color (que tenía más curro de lo que parecía al principio), he tomado la decisión de aplicar un Gaussian Blur como efecto de post-proceso, de manera que se suaviza la imagen cargando casi todo el trabajo en la GPU que en este ejemplo no hace prácticamente nada. El resultado es bastante bueno y rápido, así que es muy posible que lo deje así finalmente.

Ah, también añadí la posibilidad de sacar screenshots. :P

17 de julio de 2008

Ya casi...

Ya está cerca, parece que por fin voy acabando cosas y no sólo las estoy empezando. He añadido otro detalle más al simulador de fluidos, y a falta de un par de cosas ya va teniendo el aspecto que quería que tuviese.



Por desgracia he añadido los colores demasiado rápido y sin pensar, y como resultado tengo que ahora mismo necesito pintar la simulacion sobre un rendertarget de 128 bits, lo cual limita mucho el rendimiento y las plataformas donde quiero que se ejecute (no cumplo uno de los puntos que requería en la última entrada sobre esta demo).

Total, que tengo que volver al punto de la optimización, pero al menos ya sé que funciona el tema de los colores. A ver si este fin de semana lo puedo finiquitar...

16 de julio de 2008

El chico de los recados xD

Me han vuelto a pedir que haga un pequeño shader para el Model 2 Emulator, y yo encantado de poder aportar algo más a un programa tan conocido. ^^ Esta vez se trata de imitar el aspecto de los antiguos monitores arcade con un efecto normalmente conocido como "scanlines". En muchos emuladores se permite activar un efecto similar, y hay mucha gente que lo ha pedido para éste. Esta tarde me he puesto un momento y ya tengo una versión más o menos bien afinada:


Al ser un efecto procedural y no una textura que se aplica encima de la imagen original, no hay efectos raros al cambiar de resolución y cosas por el estilo. A ver si gusta y veo otro shader mío funcionando en algo que usará mucha gente. ^^

Aunque parezca mentira también he seguido con mis cosas de XNA, y ya he empezado a adaptar el simulador de fluidos para soportar varios colores simultáneos. Lo malo es que estaba muy cansado (está siendo una semana un poco dura) y he avanzado muy lentamente. A ver si mañana le doy más ritmo y pronto puedo colgarla. ;)

13 de julio de 2008

Dayyytooonaaaaaa!!

Let's go away! Let's go away! Menudo temazo y menudo juegazo. ^^ Finalmente ElSemi ha añadido mi shader a su emulador de Model 2, y Daytona USA ya luce unos colores mucho más agradables y fieles a la recreativa. He grabado un video con una WIP de la nueva versión del emulador donde se muestra cómo se ve actualmente:



La calidad de imagen es lamentable, pero podeis forzar a YouTube a enseñaros algo más decente añadiendo '&fmt=6' o '&fmt=18' al final de la URL del video. Con 6 se ve a 60fps con una calidad decente y con 18 se ve mucho mejor, pero perdiendo algunos frames por segundo.

Lo dejo linkado igualmente:

VIDEO Calidad Media 60 fps
VIDEO Calidad Alta

10 de julio de 2008

Pecado capital

Estoy un pelín perezoso. Será el verano, el calor, que aún no he hecho vacaciones (y llevo como 3 años sin hacer) o lo que sea, pero el cansancio diario me puede y avanzo poco.

Aún así he sacado algo de fuerzas para seguir con el tema de los fluidos, y ya va teniendo una pinta más interesante. Estos días básicamente me he puesto a mejorar un poco el rendimiento, he pasado todo el cálculo de la simulación a un thread secundario (que será directamente un core distinto en 360), dejando el principal para el render (que es una chorrada y va rapidísimo). De esta manera funciona bastante más suelto aunque sigue siendo muy exigente en cuanto a CPU. A ver si mañana me monto algo para saber realmente a qué velocidad funciona (ahora mismo no tengo más información que los frames por segundo de render, que no dice gran cosa) para poder ir probando más cosas. Actualmente tiene este aspecto:



En el video también se ve que he añadido un par de funcionalidades más (echar tinta con el ratón y "empujar" el fluido), pero el cambio más importante es el rendimiento. El ejemplo final no distará mucho de esto, pero si no se me quitan las ganas quiero probar un par de cosas más:

- Echar tinta de varios colores a la vez (esto puede ser bastante costoso, así que a lo mejor lo pruebo y luego lo quito ^^U).
- Hacer el ejemplo 100% compatible con Xbox 360. Ahora mismo se llama a funciones típicas de C++ (mem_cpy y memset) y por tanto no funcionaría en consola.

Y bueno, y si al final funciona bien lo de varios colores a la vez, quizás pruebe más cosas que no formarán parte del ejemplo... :P

8 de julio de 2008

Ampliando horizontes

Ayer me puse un rato a hacer un pequeño trabajo que me pidió Wesker de SpekSNK. En el foro de esta web (en la que estoy desde hace varios años ^^) está incluido el foro oficial de Nebula, un conocidísimo emulador multisistema que entre otras emula la Neo·Geo. El desarrollador de Nebula, ElSemi, lleva además otro emulador muy conocido de Model 2, la genial placa de SEGA.

Se ve que el sistema que usa esta máquina para calcular el color en algunos juegos es bastante "peculiar", dando como resultado que estos juegos aún no estén emulados correctamente en este aspecto. Se han probado algunos cambios en el brillo del color para intentar acercarse al juego original, pero sin unos resultados realmente satisfactorios.

Lo que me pidieron es que hiciera un pequeño shader que permitiera manipular el color de manera que se pudiera conseguir un aspecto más cercano al arcade sin tocar nada de la emulación (si, es una manera muy cerda de hacerlo, pero por ahora no hay nada mejor).

El shader ya está listo y se pueden hacer cosas como esta (a la izquierda la imagen que da el emu, a la derecha la imagen después de aplicar el shader con una cierta configuración):


Por supuesto es completamente configurable, y precisamente se puede descargar una pequeña demo que permite ajustar diferentes constantes para que los usuarios den su opinión y así añadir al emulador el shader con los valores más "correctos". La demo se puede encontrar AQUI. Todavía no se sabe si el shader se va a incluir en el emulador o no, a ver si hay suerte y gusta.

Ah, también he subido el ejemplo del Component que pinta un texto de LEDs, está en el lugar habitual. ^^

6 de julio de 2008

Disperso pero activo

Una vez más me he puesto con una cosa nueva sin tener la anterior terminada. El simulador de fluidos marcha bien y ha avanzado en estos días (sobre todo en la parte de rendimiento), pero esta tarde no me apetecía seguir con él y he preparado algo rápido y sencillo que pueda subir pronto a XNACommunity.

Se trata de un GameComponent que permite pintar texto de manera que tenga el aspecto de una pantalla de LEDs como las que se ven en los marcadores deportivos. En realidad se le podría haber metido cualquier shader al texto, pero necesitaba éste en concreto. Este es el aspecto que tiene:


Como se puede deducir de la imagen, el componente permite configurar cosas como la fuente, el color o la posición, y aunque no se ve en la imagen también se pueden modificar cosas como el tamaño de los puntos, variables que controlan el gradiente de color, etc.

Ahora estoy preparando un ejemplo en el que se ve un posible uso del componente, a ver si me da tiempo de subirlo hoy mismo. ^^

2 de julio de 2008

Lo que no te mata...

Después de un par de días muy duros a nivel personal que me han tenido atontado y concentrado a la vez (si, eso es posible), vuelvo por fin con algo que en enseñar. Es muy preliminar y tengo que añadir/mejorar muchas cosas, pero ya empieza a tener buena pinta, y es una parte fundamental de otro pequeño proyecto que quería iniciar a medio plazo.



Antes de ponerme con esto, y después de ver el estupendo motor de raycasting de Nick Gravelyn para conseguir pseudo-3D en el Zune, se me ocurrió lo que yo creía que era una genial. Y la verdad es que era jodidamente buena, pero parece que hay gente que piensa como yo. XD La idea era hacer una pequeña demo de voxels en XNA. Es la técnica usada en juegos como Comanche, Delta Force o el enorme, enorme Outcast. Con este tipo de visualización se podrían pintar terrenos 3D bastante realistas incluso en el Zune, y era algo que aún no se había hecho en XNA. Pero Catalin Zima se me ha adelantado con un buen ejemplo (aunque se ve que va algo lento en Zune), así que tendré que plantearme hacerlo mucho mejor o sencillamente aprender de él y olvidarme. ^^U

Espero a ahora a nadie se le ocurra hacer fluidos... :P