domingo, 23 de enero de 2011

Sobre shaders, asteroides y tiempo...

Llevo días viendo la mejor forma de diseñar los asteroides del juego. Además he cambiado las texturas del skybox, y he mejorado muchísimo el control de la cámara, ahora puedo desplazarme libremente por el espacio, aunque el movimiento es brusco para usarla en el juego, así que posteriormente tendré que diseñar otro movimiento más suave y que use inercias, para simular lo máximo posible los giros de una nave espacial.

Bueno, vamos al tema: LOS ASTEROIDES

Asteroides reales. NASA.


Primero pensé en hacerlo proceduralmente sobre la CPU: partir de un cubo con 4 vértices por cara, alejar cada uno de esos vértices del origen del eje de coordenadas la misma distancia (r), para generar una esfera a partir de un cubo. Luego aplicar LOD a cada cara del cubo (esfera), generando dinámicamente más subdivisiones dentro de la cara y aportando asi mas detalles. Para la geometría del asteroide, usé valores pseudoaleatorios para modificar las alturas, que no es muy acertado, y tampoco liberaba los vértices creados al acercarse la cámara cuando ésta se aleja. Resultado: un desastre, se procesaba lentamente (puesto que todo el cálculo era sobre la CPU) y el aspecto era feo. Esta claro que fue un primer prototipo y podría mejorarse muchísimo.

La principal mejora en cuanto a rendimiento que pude haber añadido fue el uso de shaders y pasar todo este cálculo a la GPU, y en cuanto a la apariencia del asteroide, una buena idea podría haber sido usar Ruido Perlin, tanto para los mapas de altura como para las texturas. El principal problema que me encontré en este punto, era que para que mi proyecto tuviera asteroides procedurales tendría que aprender a programar los shaders, y aún me falta algo de dominio con los shaders. Y el principal problema que tengo es el tiempo. Se que tendré que aprender a fondo los shaders tarde o temprano, y realmente tengo ganas de empezar con ello. Pero mi juego esta bastante en pañales en algunos aspectos, y si me meto con los shaders no se cuando terminará. Prefiero recurrir a otros métodos y una vez terminado, mejorarlo o tomarlo como punto de partida para un nuevo proyecto que use shaders.

Mi única alternativa factible era generar los asteroides de forma estática con algún programa (Blender) e importarlos dentro del juego. A consecuencia de esto, se que los asteroides no serán tan reales como me gustaría, y que además apenas podré utilizar técnicas de LOD (Level Of Detail), pero a favor tengo que he ganado bastante tiempo de cara al programa.

Los asteroides los estoy diseñando en Blender y uso Ruido Perlin para deformarlos a mi gusto y una textura para envolver todo el asteroide, todo esto desde Blender. A continuación dejo una captura de uno de estos asteroides:


Detalla del asteroide, deseño en Blender usando Ruido Perlin.

En lo siguiente que estoy pensando ahora es cómo colocar en el espacio estos asteroides, y quiero intentar utilizar técnicas de frustum, agrupando espacialmente los asteroides en sectores con forma de cubo, para así poder usar de forma eficiente técnicas de frustum culling.

A continuación muestro un vídeo con algunos de estos asteroides "hechos a mano" rotando en el espacio. En el vídeo, asi como en la imagen anterior se aprecia el fondo nuevo que he puesto.



Pasado, presente y futuro:
Como comienzo no esta mal, dentro de lo que cabe me doy por satisfecho, pero quiero llegar a conseguir asteroides MUCHO más realistas, en cuanto a forma: (cráteres, más detalles al aproximarnos, aplicar técnicas de LOD), sombreado: tanto en el propio asteroide, como proyectadas en otros asteroides), así como: detección de colisiones, choques, fragmentación, etc, etc.

Además me gustaría reorganizar mejor todo el engine, limpiar y optimizar el código todo lo posible.

Próximamente más.

No hay comentarios: