28 de junio de 2008

No estaba muerto

Que no, que no estoy parado! Llevo días sin postear nada, pero por una buena razón: no tengo fotos guays que poner. Además han sido unos días movidillos de currículum para arriba y para abajo (si al final sale todo bien ya pondré el porqué de esto ;) ), y trabajo en general.

Ya avisé que me había puesto con una cosa que me llevaría más tiempo de lo habitual, y aún estoy con ello. Ni siquiera he picado una sola línea de código, por ahora me estoy estudiando el asunto porque tiene cierta matemática detrás que me trae un poco de cabeza. Además es muy posible que sea un ejemplo con una filosofía algo diferente de lo habitual, porque no cargará sobre la GPU sino que tirará básicamente de CPU aunque el resultado sea gráfico. Pero bueno, a ver si me sale bien porque mi ratio de fracasos está subiendo peligrosamente. xD

22 de junio de 2008

De vuelta a la realidad

Ayer me pasé el MGS4 (el cual recomiendo a todo el mundo), así que podré volver a mis tareas habituales. Hay que ver lo mucho que puede afectar un simple juego a mi vida diaria, estos días lo único que hacía era ir a trabajar y jugar. xD

En fin, que intentaré dar los últimos toques al ejemplo de deferred rendering y seguir con cosas nuevas.

18 de junio de 2008

Pequeño parón

Ayer por fin pude comprar el Metal Gear Solid 4, así que seguramente los próximos días voy a estar un poco más parado de lo habitual. xD Aún así me dio tiempo a colgar el ejemplo de Bubble Shader en el lugar habitual, y he empezado un nuevo tema que me llevará algo de tiempo (aunque no olvido la demo de deferred y no creo que tarde demasiado en colgarla, quizás la semana que viene si no hay nada nuevo).

No hay mucho más que comentar, así que para que el post no quede tan soso, dejo una bonita foto de la pompa de jabón. ^^

12 de junio de 2008

Un fin de semana menos excitante de lo esperado

Quería jugar al Metal Gear Solid 4, joder. Según Konami es por la huelga de transportistas, yo digo que es una plafinicación de distribución lamentable (lo del paro no se sabía hace sólo dos días). Hay gente que considera a esta saga el anti-juego por los muchos videos que hay y el "poco" contenido jugable, pero a mi me encantan como pocos. En fin, no pasa nada por esperar unos días más, tengo entretenimiento para rato...

Como hoy tampoco tenía mucho tiempo y he tenido una semana bastante durilla en el curro, me he vuelto a poner con algo ligero como las pompas de jabón:



Iba a poner una escena más trabajada como un cuarto de baño y varias pompas volando por ahí, pero es difícil encontrar un modelo que me guste y tal y como está ahora también queda bastante bien (además se puede ver bien el reflejo del skybox).

El efecto es rapidísimo (a mí me funciona a unos 2500 fps), así que debería tener un buen rendimiento en casi cualquier máquina.

10 de junio de 2008

Jugando a mi manera para despejar la mente

Hoy he dedicado mi tiempo libre a otras cosas que no son las habituales y no tenia muchas ganas de ponerme con el ejemplo de deferred, pero he podido jugar un poco con un efecto un poco tonto pero que da un resultado muy curioso:


Si, es una burbuja de jabón. ^^ En movimiento queda bastante realista, y es un efecto muy sencillo que se puede ejecutar incluso en tarjetas que sólo soporten Shader Model 1.1. Ahora me toca pensar un ejemplo donde pueda meterla(s). :P

9 de junio de 2008

Revisiting cosas antiguas

Hasta el momento siempre que he querido hacer motion blur he seguido la misma técnica: guardarme dos matrices ViewProjection (la actual y la del frame anterior), generar un vector de velocidad 2D en el vertex shader y pasarlo al pixel shader para sacar estas velocidades en una textura y así usarlas en un paso posterior para "blurrear" el frame.

Por norma general esto funciona de lujo y es my sencillo de implementar, pero tiene un gran fallo. Como se calculan las velocidades por vértice, puede ocurrir que algún vértice de un polígono quede fuera del frustum y otros dentro, y entonces al hacer clipping se le va completamente la olla ocurriendo cosas como esta:


Efectivamente, esto no mola un carajo. ¿Cómo solucionarlo? La idea es calcular la velocidad por píxel. Es mucho más costoso pero abordable hoy en día. En principio se puede reconstruir la posición en world space de un punto en el pixel shader sabiendo su profundidad. Basta con multiplicar el punto en cuestión en screen space con sus coordenadas de la forma (x, y, depth, 1.0) por la matriz ViewProjection inversa y dividirlo después por la componente w que le queda después de esta multiplicación. De esta manera se consigue otra vez su posición en el mundo 3D. Para conseguir el vector de velocidad buscado sólo queda multiplicar este punto reconstruido por la matriz ViewProjection del frame anterior y ver la diferencia con el actual.

Ahora es cuando debería enseñar la foto molona de cómo queda siguiendo este nuevo método, pero no la tengo. No sé porqué todavía no he conseguido que funcione, y no veo que esté haciendo nada mal. Estoy un poco cansado así que lo dejaré por hoy, pero ahora voy a estar pensando en ello hasta que pueda volver a ponerme. Qué rabia.

6 de junio de 2008

Las prisas son malas

El cabreo que me entro el otro día con el tema de XNA 3.0 CTP fue de lo más absurdo, ya que era una cagada mía. Pero bueno, rectificar es de sabios aunque ahora me de rabia el motivo por el cual no funcionaba. Se ve que la función que quería usar está disponible sólo si se desarrolla para Zune, y queda deshabilitada al trabajar en Windows (hay que recordar que en la CTP no se puede hacer nada en Xbox 360). Total, que me quedo sin probar lo que quería, y ya me había ilusionado... Espero que en la versión final esté solucionado.

Por otro lado ayer me puse a grabar un video del estado actual del ejemplo de Deferred Shading. Es una pena que con la calidad de imagen que da YouTube apenas se pueda ver el motion blur.

4 de junio de 2008

Qué rabia da!

Estos días tengo a mi sobrinilla en casa, así que después del curro tengo poco tiempo para hacer nada (¡pero no viene de eso el título del post!). Aquí la vemos en su nuevo bólido:



Qué mona ella. ^^

Lo que me da rabia es que estaba probando unas cosillas con XNA 3.0 CTP relacionado con el nuevo namespace Media (que en principio es para trabajar con el Zune, pero en Windows ofrece una manera sencilla de manejar sonidos con XNA sin tener que pasar por XACT), cuando de repente no me pilla una función de la clase Mediaplayer sin ninguna causa aparente. No aparece en la lista de métodos y si lo pongo a saco no compila, cuando hay varios ejemplos en la red usando esa función. No sé si es porque tenía en marcha también el VC#2005 y se le ha ido la olla con los frameworks, pero me he cabreado y lo he dejado. Para un rato que me pongo me toca las narices que ocurran cosas tontas como esta.

En fin, para aliviar un poco mi furia (:P) he añadido en un momento el postproceso de motion blur al ejemplo de deferred shading. Tal y como está ahora el código, en los casos de mayor coste (cuando se procesan todas las luces y éstas ocupan casi toda o toda la pantalla) me va a unos 270 fps. Puede parecer que vaya a un gran rendimiento pero tengo comprobado que manejando yo cifras similares, al probar los ejemplos en otros PCs la cosa iba bastante peor (parece que no me puedo quejar de mi gráfica ^^), así que voy a intentar afinar un poco ese aspecto.

Hay cosas que no creo que cueste demasiado mejorar (por ejemplo el número de cambios de estado en la gráfica durante el render de un frame, que son bastantes actualmente), así que espero conseguir algo en poco tiempo. También es verdad que estoy abusando un poco de la técnica, ya que con las luces que hay ahora se hacen 5 pasadas a pantalla completa de iluminación por cada frame, ya que aunque son luces puntuales, éstas afectan a casi todo el escenario y se solapan entre ellas. Podría hacer que ocupasen un área mucho menor, pero entonces la escena perdería bastante estéticamente. Igualmente, lo que hoy importa es el motion blur, que tiene un aspecto como este (estaba moviendo la cámara a una velocidad bastante elevada):


Se distingue poco, pero también he estado afinando un poco la iluminación, que era demasiado oscura. ;)

2 de junio de 2008

Otro ejemplo P.L.S

Es decir, Pa La Saca! Acabo de colgar la demo de God Rays, que ya tenía ganas de hacerlo desde hace días. A este paso, dentro de poco voy a tener problemas para tener nuevas ideas. xD Pero bueno, al menos eso me obligará a bajar el ritmo un poco.

Por otro lado, hoy he vuelto a avanzar bastante con el ejemplo de deferred shading, y ya tiene un aspecto tal que así:


Es increíble el cambio que puede llegar a sufrir una escena con una pequeña variación en la iluminación... Aún así todavía no estoy contento del todo con el resultado, así que los próximos días los pasaré dejándola lo mejor posible. Y además aún queda añadirle el postproceso de motion blur (aunque ya tengo todos los datos necesarios para ello), y me da miedo que haga bajar demasiado el rendimiento... Ahora mismo no funciona mal, a unos 350-450 fps según el espacio que ocupen las luces, pero creo que puedo sacarle algo más de jugo.

1 de junio de 2008

el g0e Weekly Update o_O

Bueeeno, ya estoy otra vez con otro ejemplo. Os presento a mi nuevo amigo:


A primera vista no parece nada fuera de lo normal: el HellKnight de Doom3 cargado con el loader de MD5 que sacaron recientemente en XNA Community y el escenario que usó Race en su ejemplo de luces volumétricas.

Pero no es ni mucho menos sólo eso. La escena se está pintando con una técnica de render conocida como Deferred Rendering o Deferred Shading. Esta técnica no es nueva, pero hasta hace poco no era posible usarla a una velocidad decente en juegos, y aún hoy en día hay muy pocos que la usen (los más conocidos son STALKER y Killzone 2).

Esta técnica tiene varias particularidades, como que sólo se iluminan aquellos puntos de la escena que realmente se están viendo o que el coste de pintar luces es proporcional al espacio que ocupan en pantalla, y no a su número. Con las tarjetas actuales se puede implementar gracias al uso de Multiple Render Targets (que ya usé en la demo de God Rays que, por cierto, colgaré mañana seguramente), este es un ejemplo:


En esta imagen se ven los cinco RTs que se usan en la visualización (color, normales, velocidad, profundidad e iluminación). Este no es el aspecto final del ejemplo ya que quiero meterle una iluminación con algo más de gracia, pero más o menos ya lo tengo encarrilado.