sábado, 28 de mayo de 2011

Stage 3D APIs (Molehill)

0 comentarios
 
Bueno hoy nos toca hablar de lo que se viene dentro de muy poco, capaz no sea noticia nueva para algunos pero seguramente para muchos sí.



¿Que es Molehill?

Molehill es un conjunto de APIs aceleradas por hardware que van a ser integradas en ActionScript, en Adobe Flash player y en Adobe AIR. Sí como lo leen, muy pronto en vez de comprarse un need for speed seguramente lo jueguen online sin necesidad de bajarse nada!.

Integrar estas APIs van a permitir un renderizado 3D de alta gama en la plataforma Adobe Flash. Molehill esta basado en DirectX 9 en Windows y en OpenGl 1.3 en MacOs y Linux. En plataformas móviles como es Android Molehill se basará en OpenGL ES2. Técnicamente las APIs de Molehill son verdaderamente 3D, programables por GPU y basadas en shaders, y expondrá características que los desarrolladores de Flash siempre desearon y nunca pudieron obtener (hasta ahora), como vértices programables y fragment shaders, con los que se pueden realizar o habilitar diferentes técnicas como, vertex skinning, para la animación de los huesos, así como también z-buffering nativo, stencil color buffering, cubo de texturas, y más.

En terminos de performance, Adobe Flash Player 10.1 (el actual), renderiza miles de triángulos, éstos no son z-buffered,  aproximadamente a 30Hz.Con las nuevas APIs 3D, los desarrolladores pueden esperar cientos de miles de triángulos a ser renderizados en una resolución de alta definición (HD), en pantalla completa a unos 60Hz. Molehill hará esto posible para entregar una experiencia 3D sofisticada a través de casi todas las computadoras y dispositivos conectados a internet. Al final de éste artículo se pueden observar los videos de aplicaciones hechas con Molehill, los cuales nos dan una dimensión de lo que estamos hablando.

¿Cómo funciona Molehill?

Hasta acá nos podemos dar una idea de que es Molehill pero, ¿cómo funciona exactamente?.
Las APIs existentes de 2.5D de Flash Player que se introdujeron en Flash 10, no estan en desuso como muchos piensan. Molehill las aprovechará para ofrecer una solución al renderizado 3D avanzado que requieren una aceleración de GPU completa. Dependiendo del proyecto a realizar el usuario eligirá el API a utilizar.

Recientemente se ha introducido el concepto de "Stage Video" en Flash Player 10.2 disponible en su versión beta en Adobe Labs.
El Stage Video se basa en el mismo diseño, permitiendo una aceleración completa del hardware para el video, desde la codificación hasta la presentación.Con este nuevo modelo de rendering, Adobe Flash Player no presenta los frames de video o el buffer 3D dentro del display list, pero sí los presenta en una textura situada detrás del escenario pintada por el GPU. Esto permite a Adobe Flash Player pintar directamente en la pantalla, el contenido que se encuentra en la memoria de la placa de video. Ya no va a ser necesario volver a leer, cada vez que se quiera traer frames desde el GPU para ubicarlos en la pantalla a través del display list del CPU.

Como resultado, porque el contenido 3D se sitúa detras del escenario o del stage de Flash player y éste no forma parte del display list, los objetos Context3D y Stage3D no son display objects u objetos que se puedan visualizar en otras palabras. Por lo tanto hay que recordar que no se puede interactuar con ellos como cualquier DisplayObject, las rotaciones, los blend modes, los filtros y muchos efectos no pueden ser aplicados.

La siguiente figura ilustra la idea


Por supuesto, como se puede observar, el contenido 2D puede superponerse con el contenido 3D sin problenas, pero lo contrario no es posible. Sin embargo se proporcionará una API que va a permitir plasmar el contenido 3D en un bitmap si es necesario. Desde el punto de vista de las APIs de ActionScript, el desarrollador interactua con dos objetos principales, los objetos Stage3D y Context3D. Con esto solicita a Adobe Flash Player un contexto 3D y un objeto Context3D que será automaticamente creado al indicarselo.

Pero muchos se preguntarán ¿Qué pasa si mi tarjeta de video es incompatible? ¿Obtendré una pantalla negra sin poder visualizar nada?. Flash Player aún retornara un objeto Context3D, usando un sistema de respaldo de software internamente por lo que todavía se tendrán todas las características de Molehill y de las APIs pero ejecutandose en el CPU. Para lograr esto se cuenta con un muy rapido rasterizer de CPU de TransGaming Inc. llamada “SwiftShader”. La buena noticia es que incluso cuando se ejecuta en software, SwiftShaderes 10 veces más rápido que el rasterizer de vectores disponible en Flash Player 10.1, por lo que se espera un rendimiento importante incluso cuando se ejecuta en modo software.

La belleza de las APIs de "Molehill" reside en que no hay que preocuparse por lo que está pasando internamente. ¿Estoy trabajando bajo DirectX, OpenGL o SwiftShader?, ¿Debería usar una API diferente para OpenGL cuando estoy en MacOS y Linux u OpenGl ES 2 cuando estoy en una plataforma para móviles?. No, todo es transparente para el desarrollador. El desarrollador programa usando una sola API y Flash Player se encargará de hacer ésto por él internamente y de hacer la traducción detrás de la escena.

Es importante recordar, que las APIs de "Molehill" no usan lo que se llama una función fija de pipeline, sino que usan una función programable de pipeline, lo que significa que el desarrollador deberá trabajar con vértices y fragmentos de shaders para mostrar algo en pantalla. Para ésto, se podrá cargar, en la tarjeta gráfica, los shaders puros y de bajo nivel AGAL  (“Adobe Graphics Assembly Language”) bytecode como Bytearray. Como desarrolador se tienen dos maneras de hacer esto, escribir los shaders en ensamblador, lo que requiere un avanzado conocimiento de como trabajan los shaders, o de como usan un lenguaje de alto nivel como Pixel Bender 3D, el cual expondrá una forma más natural para programar los shaders y compilar el bytecode AGAL apropiado.

Para representar triángulos, se necesita trabajar con los objetos VertexBuffer3D e IndexBuffer3D pasando coordenadas de vértices y de índices, y una vez que los vertex shaders (los vértices de los shaders) y los fragments shaders (los fragmentos de los shaders) estén listos, se podrán subir o cargar en la tarjeta gráfica a través de un objeto Program3D. Basicamente un vertex shader se encarga de la posición de los vértices utilizados para dibujar los triángulos mientras que un fragment shader maneja el aspecto de los píxeles utilizados para dar textura a los triángulos.

La siguiente figura ilustra la diferencia entre los tipos de shaders:



Más explicitamente al hacer un programa en donde utilizamos lo explicado anteriormente al crear shaders podemos llegar a algo como ésto:

La idea de éste artículo no es meternos en la programación de Molehill pero si alguno esta interesado en como programar este tipo de cosas puede encontrar un poco de código acá: http://www.bytearray.org/?p=2555 (aclaro que está en inglés).

Entonces, ya se ha hablado de los objetos que se pueden utilizar en Molehill como ser Stage3D, Program3D, Texture3D, etc. Veamos un gráfico para tener una idea más clara de como está establecido esto jerárquicamente y como interaccionan entre los objetos:


Como se puede observar, las APIs de Molehill son de muy bajo nivel y exponen características avanzadas para los desarrolladores que quieran trabajar con 3D. Por supuesto, algunos desarrolladores preferirán trabajar con frameworks de alto nivel, los cuales exponen APIs listas para usar. Adobe se encargará de eso, también.

Construyendo montañas con Molehill

Muchos desarrolladores de ActionScript 3 perferirían trabajar con una luz, una cámara y un plano en vez de con un vertex buffer y shaders bytecode. Así que para asegurarse de que todos puedan disfrutar del poder de Molehill, se está trabajando activamente con frameworks 3D tales como Alternativa3D, Flare3D, Away3D, Minko, Sophie3D, Yogurt3D y más. Hoy en día la mayoría de estos frameworks tienen implementado Molehill y estarán disponibles cuando Molehill esté diponible en una próxima versión de Adobe Flash runtimes.


La mayoría de los desarrolladores de éstos frameworks estuvieron en Max, ya por el 2010, presentando sesiones de como implementan Molehill con sus respectivos marcos.
Se espera que los desarrolladores construyan sus motores basandose en Molehill, por lo que, tanto los desarrolladores 3D avanzados, así también como aquellos que no desarrollan o no saben desarrollar en 3D, se beneficiarán con Molehill.



Algunos videos de demos que se desarrollaron con la version Beta de Molehill:








Fuente: ActionScript Experiment

Deja tu comentario