jueves, 7 de junio de 2007

sprites de la GUI

Hola ,
hace bastante que no actualizo el log , así que allá voy .
Como os conté , conseguí hacer funcionar las animaciones ( leer correctamente los .x , utilizar el sistema de jerarquias de bones para animar el esqueleto , pasar suavemente de unas animaciones a otras ... ) y estructurarlas bien ...
A continuación hice el movimiento básico del personaje , y luego cargue un escenario y lo rendericé . Así que tengo un persoanje moviendose por una habitación ( con dos animaciones : una parado y otra andando ) . Después me metí un poco con las colisiones y colisiona con las paredes ( aunque no tengo acabado lo de las colisiones , solo colisiono el escenario con un rayo en direccion al movimiento , y tendré que hacerlo con un bounding box o sphere probablemente para que vaya bien en todos los casos ) .
AH ! ahora que me acuerdo ... creo que me pasé un par de días por lo menos con un problema que encontré : a veces se veia mal el personaje , aparecían "rayas" en la textura de algunas partes , y en algunas posiciones el personaje tenía como "huecos" y pequeños fallos . Lancé programas de ejemplos , el visualizador de directx ... y no parecían tener problemas . Bueno , ¡ pues a jugar a encuentra las diferencias! , a ver dónde estaba yo metiendo la pata .
Este tipo de fallos , pequeños y que pueden estar en cualquier parte son los más complicados . Debugueé todo , rendericé de mil maneras distintas ... lo típico , una locura , lo puse todo patas arriba . Al final el problema era el formato del depth buffer : lo tenía como d16 , y con eso parece ser que el depth buffer no tiene precision suficiente ( 16 bits ) . Así que algunos pixels el z-buffer pensaba que estaban "por detrás" cuando en realidad estaban "por delante" y sí había que renderizarlos . con el formato d24X8 tiene más precisión y se ve bien .

Bueno , lo más interesante : me he metido con el 2d . Renderizar una imagen en 2d . Tenía creada una clase ( graphics2d ) , que a partir de una textura la renderizaba en x,y con w anchura y h altura . La que usé en la aventura de numa . Como habreis visto en la aventura de numa las imagenes 2d se ven como un poco "borrosas" , y eso es lo que quería solucionar , ver qué pasaba . Porque para la aventura de numa vale , epero para este juego no puede ser .

Me metí con el ID3DXSprite de directx . Muy facil de usar , pero ¡ me seguía pasando lo mismo !! . Las imagenes salen algo borrosas , no respetan el pixel original . Es más , con el ID3DXSprite , ( no tienes que especificar el tamaño) , ¡ me renderizaba la imagen a un tamaño distinto del original ! .

Estaba claro que en algún momento la imagen se reescalaba o pasaba un filtro y por eso pedía nitidez .

A partir de ahí el caos : implementé como 3 sistemas distintos de renderizar en 2d , probé todos los estados de filtros , usos del mipmapping , opciones de render y texture addressing , tamños de ventanas , formatos del backbuffer ...

Por internet una risa : a todo el mundo le parece super difil rotar una imagen con el ID3DXSprite , pero a nadie le importa la perdida de pixeles del render ( también podría pensar que nadie metia la pata donde yo ... pero no se que decirte , he ejecutado ejemplos que se veian mal ... ) .

Bueno , ya me he alargado mucho , así que intento resumir : mirando distintas formas de crear la textura ( que es uno de los parametros de ID3DXSprite ) , pensé que podría estarse reescalando la imagen en la tarjeta a tamaños de potencia de 2 ( porque algo pone en la documentación , aqune no exactamente así ) ... bingo !! .
altura y anchura tienen que ser potencia de dos . Siempre meto las texturas para 3d en potencias de 2 de tamaño , pero si les cambias el tamaño no pasa nada , no se nota nada extraño . Pues lo que hace directx es hacer una imagen tamaño potencia de 2 y reescalar la imagen original a eso . En 3d es un problema de memoria y rendimiento , pero en 2d se nota visualmente .
Así que para no perder tanto espacio me tocara hacer el 2d en plan móvil : en una imagen meter muchos sprites , y luego renderizar solo el x,y,w,h del sprite que necesito .
Según la documentación esto depende de la tarjeta grafica que sea .
una imagen de 32x1024 se vería bien , no se reescala . Pueden ser distintos valores anchura y altura .

Bueno , todo esto parece una tontería , pero creedme : lo que he escrito aquí os podría ahorrar días de locura .

un saludo .

7 comentarios:

Zalo dijo...

Jejejeje...

Lo de las imágenes que tengan que ser potencia de dos hace tiempo que muchas tarjetas soportan ya cualquier dimensión de imagen. En opengl sé que hay una extension para hacerlo, así que en DirectX debe haber algún flag o algo, échale un vistazo antes de redimensionar todas las imágenes

Unknown dijo...

Sí, usa OpenGL, es libre y abierto. Así podrás portar tu juego a la GP2X y tal... xD

Un abrazo y ánimo, se ve que trabajas duro :)

flipper83 dijo...

Trankilo el mensaje de Nadie es esPABLISmo asi q no le hagas mucho caso. Oye cuando tengas dudas o problemas te recomiendo q las pongas en GameDEV son buena peña y responden rápido :P

platinio dijo...

Sí , si , si soportan tamaños que no sean potencia de 2 ... por eso me he vuelto yo loco ... ! . Pero hace lo que te digo : al menos mi tarjeta , internamente reescala la textura a una potencia de dos . En 3d no se nota , pero si lo pones en 2d y te fijas bien , ves que no son los pixeles originales .

Oye , me ha sorprendido muchísimo que leyerais un post que va solo sobre codigo ... ni frasecitas ni nada , jaja !!! . ¿ que tal va todo por playw ? .
Espero poderme pasar dentro de poco a haceros una visita y veros un poco , que he pasado de estar 24 horas con vosotros a no veros nada en un mes ! .

Por cierto , estoy portando a gus , y va bastante bien , ya os contaré en otro post . Cuando lo acabe os lo paso .

Pablo , no tienes solución :)

Zalo dijo...

No... no deberían reescalar la textura. Al menos en opengl no es así.

platinio dijo...

miraré a ver si encuentro algun flag a la hora de crear la textura , que puede ser .

Odest dijo...

en que idioma hablais?
FRIKIS