# VirtualGL

VirtualGL es un programa de código abierto que redirige los comandos de procesamiento de aplicaciones 3D OpenGL de Unix y Linux para hardware acelerador 3D en un servidor dedicado y muestra el resultado representado interactivamente a un cliente liviano localizado en cualquier lugar de la red.

## El problema

Normalmente, VNC y otros entornos de cliente ligero para Unix y Linux o no soportan las aplicaciones OpenGL para nada o fuerzan a las aplicaciones OpenGL a renderizarse sin el beneficio de aceleración por hardware OpenGL. Mostrar de forma remota aplicaciones 3D con aceleración de hardware tradicionalmente ha requerido el uso de "representación indirecta". La representación indirecta utiliza la extensión GLX de la Sistema x Window ("X11" o "X") para encapsular los comandos OpenGL dentro de la fuente de protocolo X11 y enviarlos desde una aplicación a una pantalla de X. Tradicionalmente, la aplicación se ejecuta en un servidor de aplicaciones de forma remota localizada y la visualización de x se ejecuta en el escritorio del usuario. En este escenario, todos los comandos de OpenGL son ejecutados por el equipo de escritorio del usuario, por lo que la máquina debe tener un acelerador de gráficos 3D rápido. Esto limita el tipo de máquina que remotamente puede mostrar una aplicación 3D utilizando este método.
La renderización indirecta puede demostrarse suficientemente funcional si la red es lo suficientemente rápida (si usa Gigabit Ethernet, por ejemplo), si la aplicación no modifica dinámicamente la geometría del objeto que se representa, si la aplicación utiliza listas de pantalla, y si la aplicación utiliza una gran cantidad de texturas. Sin embargo, muchas aplicaciones OpenGL no cumplen estos criterios. Para complicar aún más las cosas, algunas extensiones OpenGL no funcionan en un entorno de representación indirecta. Algunas de estas extensiones requieren la capacidad de acceder directamente en el hardware de gráficos 3D y por lo tanto nunca es posible trabajar indirectamente. En otros casos, la pantalla X del usuario no puede proporcionar apoyo explícito para una extensión de OpenGL necesaria o la extensión puede depender de una configuración de hardware específico que no está presente en el equipo de escritorio del usuario.
Renderizando (procesando) OpenGL en el servidor de aplicaciones se eluden los problemas introducidos por la representación indirecta, dado que la aplicación ahora dispone de un camino de acceso rápido y directo al hardware de procesamiento de 3D. Si la representación 3D se produce en el servidor de aplicaciones, solo las imágenes 2D resultantes deben enviarse al escritorio del usuario. Las imágenes pueden entregarse a la misma velocidad de fotograma independientemente del tamaño de los datos 3D que fueron utilizados para generarlos, así que realizar procesamiento (renderizado) de 3D en el servidor de aplicaciones efectivamente convierte el problema de rendimiento 3D en un problema de rendimiento en 2D. El problema se convierte en cómo tratar un flujo de 1-2 megapíxeles de datos de imagen en una red a velocidades de fotograma interactivas, pero las tecnologías de productos básicos (HDTV, por nombrar uno) ya abordan este problema.

## La solución OpenGL

Biblioteca (informática) VirtualGL utiliza "GLX duplicidad" para realizar el procesamiento OpenGL en el servidor de aplicaciones. Normalmente, las aplicaciones UNIX y Linux OpenGL envían comandos GLX y ordinarias X 11 comandos al mismo x mostrar. Se utilizan los comandos GLX a contextos de procesamiento OpenGL se unen a un particular x ventana, obtener una lista de formatos de píxel que el x mostrar apoyos, etc.. VirtualGL aprovecha una característica en Unix y Linux que permite "cargar" una biblioteca en una aplicación, efectivamente interceptar (AKA "interposición") cierta función llama a que la aplicación podría realizar normalmente shared bibliotecas con la que está vinculado. Una vez que VirtualGL está precargado en una aplicación Unix o Linux OpenGL, intercepta las llamadas a funciones de la aplicación GLX y les reescribe tal que la GLX correspondiente comandos se envían al servidor de aplicaciones x display, que presumiblemente tiene un acelerador de hardware 3D conectado. Así, VirtualGL impide comandos GLX que se envían por la red x mostrar al usuario o a un virtual x pantalla ("X proxy"), como el VNC, que no admite GLX. En el proceso de reescritura de las llamadas GLX, VirtualGL también redirige el procesamiento OpenGL en búferes de píxeles fuera de la pantalla ("Pbuffers.") Mientras tanto, el resto de las llamadas de función de la aplicación, incluido el ordinario X 11 comandos utilizados para dibujar la interfaz de usuario de la aplicación, pueden pasar a través de VirtualGL sin modificaciones.
Internamente, el motor intermedio (interposer) del VirtualGL también mantiene un mapa de ventanas a Pbuffers, que relaciona atributos visuales entre la pantalla de destino X y la pantalla X en la que se producirá la representación 3D y realiza una serie de otras funciones de hash (hashing) para asegurar que la redirección GLX es transparente. Pero, esencialmente, una vez establecido el contexto de OpenGL en la pantalla del servidor de aplicaciones X, VirtualGL sale del camino y se permite a todos los comandos posteriores OpenGL pasar sin trabas al hardware 3D del servidor de aplicaciones. Así, la aplicación puede utilizar automáticamente las funciones OpenGL y extensiones proporcionadas por el hardware y controladores del servidor de aplicaciones.
Aparte del ordenamiento de comandos GLX y administración de Pbuffers, VirtualGL también lee hacia atrás los píxeles renderizados en el momento oportuno (generalmente por supervisión glXSwapBuffers or glFinish) y, a continuación, dibuja los píxeles en la ventana X de la aplicación utilizando x comandos de dibujo de imagen estándar X. Como VirtualGL redirige los comandos GLX fuera de la pantalla de destino X, puede utilizarse para agregar soporte 3D acelerado a servidores proxy X (como VNC) así como para prevenir el renderizado indirecto de OpenGL al usar una pantalla remota X.
Usar VirtualGL en concierto con VNC u otro proxy X permite que varios usuarios simultáneamente ejecuten aplicaciones 3D en un servidor de aplicación único y varios clientes para compartir cada sesión. Sin embargo, VNC y su tropa están ajustados para manejar aplicaciones 2D con grandes áreas de color sólido, pocos colores y pocas diferencias inter-frame. Las aplicaciones 3D, por otra parte, generan imágenes con patrones de color complejo de grano fino, y mucha menos correlación entre los fotogramas posteriores. La carga de trabajo generado dibujando imágenes renderizadas desde una aplicación de OpenGL en una ventana X es esencialmente la misma carga de trabajo de un reproductor de vídeo, y un software de cliente ligero disponible normalmente carece de códecs de imagen suficientemente rápidos para poder manejar esta carga de trabajo con velocidades de fotograma interactivas.
VirtualGL trabaja en todo este problema de dos maneras:
* Mediante TurboVNC
* Mediante transporte de imagen CFR

### TurboVNC

TurboVNC es una rama (offshoot) de TightVNC que acelera las rutas de codificación Tight y JPEG de éste, aprovechando las ventajas de libjpeg-turbo, una versión acelerada por SIMD de libjpeg. En redes de 100 megabits Ethernet, TurboVNC es capaz de mostrar imágenes de pantalla completa (1280 x 1024 píxeles) con calidad de imagen sin pérdidas perceptibles en más de 20 fotogramas por segundo. TurboVNC incluye optimizaciones adicionales que permiten mostrar las imágenes de pantalla completa en 7-10 fotogramas por segundo en banda ancha, con calidad de imagen notablemente menor pero utilizable. TurboVNC extiende también TightVNC para incluir doble búfer en el lado del cliente y otras características dirigidas a aplicaciones 3D, así como plena compatibilidad con plataformas Solaris. TurboVNC y VirtualGL son utilizados por el Centro Tejano de Cómputo Académico (TACC) de la Universidad de Texas en Austin para que los usuarios de TeraGrid puedan acceder remotamente a las capacidades de procesamiento 3D del clúster de visualización Longhorn.

### Transporte de imagen VGL (anteriormente "modo directo")

Cuando se utiliza el transporte de imagen VGL Image Transport, VirtualGL comprime imágenes 3D renderizadas en proceso utilizando el mismo códec JPEG optimizado que utiliza TurboVNC. VirtualGL, a continuación, envía las imágenes comprimidas sobre un socket TCP dedicado a una aplicación cliente de VirtualGL que se ejecuta en la máquina cliente. El cliente VirtualGL es responsable de la descompresión de las imágenes y de dibujar los píxeles en la ventana X apropiada. Mientras tanto, los elementos no OpenGL de pantalla de la aplicación son enviados a través de la red mediante el protocolo de control estándar remoto X11 y renderizados en el equipo cliente.
Este enfoque requiere que una pantalla X esté presente en el equipo cliente y que se confíe en el protocolo remoto X11 para llevar a cabo representación 2D, lo que significa que muchas aplicaciones se desempeñarán pobremente al utilizar el transporte de imagen VGL Image Transport en redes de alta latencia. Además, el transporte de imagen VGL no permite inherentemente la colaboración (varios clientes por sesión), ya que las imágenes son 'empujadas' a los equipos de los usuarios en lugar de tirarse de ellas. Pero el uso del transporte de imagen VGL ofrece una experiencia de aplicación completamente integrada, mediante el cual cada ventana de la aplicación corresponde a una única ventana del escritorio. El transporte de imagen VGL también reduce la carga de CPU del servidor, ya que el renderizado 2D se está produciendo en el ordenador/computador cliente y el transporte de imagen VGL permite el uso de funciones avanzadas de OpenGL, como estéreo cuadri-bufferado.
Los desarrolladores de VirtualGL visualizaron que los principales usuarios del transporte de imagen VGL serían los usuarios de portátiles con conexión inalámbrica a internet 802.11g o una conexión Ethernet rápida al servidor de aplicaciones.

## Soluciones comerciales que usan VirtualGL

VirtualGL y TurboVNC fueron los componentes principales del producto Sistema de visualización de Sun de Sun Microsystems, que fue suspendido en abril de 2009. Los dos paquetes de código abierto se combinaron con un plugin de código cerrado que permite a VirtualGL a enviar imágenes comprimidas a clientes ligeros Sun Ray y otro paquete de código cerrado que integraba VirtualGL con Sun Grid Engine, proporcionando administración de recursos y la programación de trabajos 3D remotos. La combinación de estos paquetes, llamada "Sun Shared Visualization" ("Visualización compartida de Sun"), estaba disponible como descarga gratuita (Sun cobraba por asistencia de apoyo).
La versión v2.1 del software Scalable Visualization Array (matriz de visualización escalable) de HP también incluye componentes que se integran con VirtualGL y TurboVNC, permitiendo programar y mostrar remotamente desde un clúster de visualización trabajos en 3D.
La versión v3.0.0 de ThinLinc está diseñada para trabajar en conjunto con VirtualGL.