Nuevas APIs en Antares

Mientras hacía en Antares el sistema de renderizado a textura necesité usar una versión superior del binding que usaba de OpenGL, JOGL. Este binding pertenece a JogAmp, un proyecto que incluye una serie de bindings para Java. Y ya que me iba a descargar la última versión de estas librerías, no me limité a coger sólo el binding para OpenGL, sino que cogí el paquete entero, que incluye bindings para OpenCL y OpenAL. Y he estado usando estas librerías.


OpenCL es similar a OpenGL, pero en vez de Graphics Library, significa Computing Library. Su paradigma es muy similar, tú únicamente haces llamadas de configuración y otras para establecer buffers que contienen los datos a procesar, y especificas también el código fuente de un programa a ejecutar. En OpenGL especificas un programa en GLSL (Shading Language), que se ejecuta para cada píxel de los triángulos que dibujas, y calcula el color del píxel en cuestión. En OpenCL el programa está en… CL (la extension es .cl), es un lenguaje parecido a GLSL, pero más orientado a cálculos genéricos, no orientados a gráficos, y así este programa puede realizar cualquier cálculo sobre los datos de entrada y generar una salida. Además los buffers de OpenGL y OpenCL pueden ser compartidos, así que puedes calcular datos y usarlos para dibujar algo, muy rápidamente.


La otra librería, OpenAL, significa Audio Library, y te permite usar el sonido 3d acelerado por hardware. El sonido 3d significa que puede variar el panning de un sonido, su volumen y su frecuencia según la posición del que escucha y de las fuentes de sonido, y de sus velocidades. Aún no he usado sonido 3d para Antares, sólo he reproducido sonidos sin propiedades 3d. Eso parece más adecuado para un simulador de coches o un FPS. Otra cosa que he intentado es la decodificación Ogg Vorbis, pero ya no funciona (antes lo hacía)…


Bueno, y ¿qué he hecho en OpenCL? He estado simulando partículas. Fácilmente se puede simular el movimiento de millones de partículas. La verdad, son muchas, más que para llenar la pantalla. Ahora bien, si quieres que tengan interacción entre ellas (que colisionen, tengan atracción gravitatoria entre ellas o se repelan), el número de partículas que se pueden simular a un framerate aceptable son unas 10.000 (30 fps).


No pongo fotos porque lo bonito es verlo simulándose, y tampoco vale la pena un vídeo. La verdad, no he conseguido gran cosa. Intenté hacer un “sólido” formado por partículas, pero perdía su forma (las partículas se desmoronaban y empezaban a intercambiarse) antes de que el objeto tocase el suelo y pudiese ver un rebote bonito, sólo rebotaba una masa de partículas informe.


Otra prueba que he hecho es con partículas que empiezan con forma de disco rotatorio y se atraen entre sí, y cuando se tocan dos de ellas se fusionan en una sola. Quedaba más o menos bien, al final aparecía una sola pelota con varias más pequeñas orbitando, pero eso es todo.


Lo bonito de OpenCL es que puedes paralelizar mucho el cálculo. Mi tarjeta 3D tiene 1024 “unidades de ejecución” o como las llamen (workgroup creo), lo que significa que puede realmente haber 1024 threads, ocupándose cada uno del cálculo de una sola partícula, y cogiendo una nueva cuando termina, hasta completar todas las partículas en cada frame. Cada thread tiene disponibles las posiciones y velocidades de las partículas en el frame anterior, y escribe únicamente la posición y velocidad nuevas de la partícula que está procesando, en un búfer diferente, de esta forma se puede paralelizar todo el cálculo.


Hasta la próxima!