ClusterGL
ClusterGL ist ein verteiltes Renderingsystem für OpenGL-Anwendungen. Dabei werden OpenGL API Aufrufe von ClusterGL bei der Ausführung von OpenGL-Programmen direkt abgegriffen und über Netzwerk an entsprechend konfigurierte Rechner geschickt. Diese empfangen die Befehle von ClusterGL und wandeln sie wieder zurück in OpenGL API Aufrufe, die sie dann lokal in ein Fenster rendern.
Gegenüber anderen Lösungen wie (X-)DMX, WireGL, dessen Nachfolger Chromium, sowie BroadcastGL bietet ClusterGL ein paar Möglichkeiten zur Optimierung und läuft auch auf aktuellen Unix-artigen Betriebssystemen.
Immer wenn mir irgendwas unklar war und ich länger nachforschen musste, werde ich es hier niederschreiben. :)
Anwendung
Bei der Programmierung von Anwendungen für ClusterGL ist vor allem zu beachten, dass nicht alle (exotischen) Befehle der OpenGL API unterstützt werden - auch mit Shadern beispielsweise gibt es noch Probleme. Wenn man die Beispiele aus dem Repository hernimmt, ist es jedoch möglich, über Erweiterung dieser entsprechend Anwendungen von Grund auf zu implementieren.
Von Hause aus jedoch werden bereits Anwendungen wie MineCraft, Open Arena und ähnliche ohne jegliche Modifikation unterstützt.
OpenGL-Programme selbst können nun in verschiedenen Programmiersprachen geschrieben werden, für die es die entsprechende Bibliothek gibt. Auch mittels Processing ist es möglich unter Verwendung des OpenGL-Renderers Anwendungen zu schreiben, die anschließend mittels ClusterGL verteilt gerendert werden. Dabei ist allerdings zu beachten, dass die Javaumgebung von Processing vergleichsweise resourcenintensiv ist und es somit zu Verzögerungen bei der Ausführung auf schwachbrüstigen Rechnern kommen kann.
Mit der Berkelium-Bibliothek und den damit gelieferten Beispielprogrammen ist es auch möglich, Webseiten in OpenGL-Texturen zu rendern. Die URLs der Webseiten werden dabei durch Berklium an eine selbstkompilierte Chromiuminstallation durchgeschleust, in dieser vom bekannten Webkit gerendert und wieder an Berklium gegeben, dass eine sich aktualisierende Textur erzeugt, welche wiederum in OpenGL weiterverwendet werden kann. Das ermöglicht es nun per Javascript und all den "schönen" Dingen Anwendungen für die Darstellung in ClusterGL zu schreiben. Das geht sogar soweit, dass die Chromiuminstanz den Flashplayer auf dem System erkennt und verwendet und somit sogar Flash-Anwendungen gerendert werden können. Einzig zu bedenken ist hier selbstverständlich, dass die aufgerufene Webseite selbst für die Aktualisierung der Inhalte Sorge tragen muss.
ClusterGL bringt im Wesentlichen zwei Anwendungen und eine Bibliothek mit, welche im folgenden kurz beschrieben werden.
cgl-capture
cgl-capture ist eigentlich nur ein Bash-Skript. Es ersetzt die OpenGL Bibliothek bei der Ausführung des Programms durch die ClusterGL Biblitohek. Somit sorgt es dafür, dass die Befehle an die OpenGL API statt von OpenGL von ClusterGL verarbeitet werden.
libcgl-capture.so
libcgl-capture.so ist die eigentliche Programmbibliothek. Sie liest die Konfiguration unter /etc/cgl.conf ein und greift die Befehle an die OpenGL API ab, wenn sie aus der cgl-capture-Umgebung heraus gestartet wurde. Diese Befehle werden nach Vorverarbeitung an die in /etc/cgl.conf definierten outputs über Netzwerk verteilt. Auf diesen Knoten werden sie von derselben Bibliothek entsprechend wieder zurück in OpenGL-Befehle gewandelt und lokal gerendert.
cgl-render
cgl-render ist ein Programm, dass unter Nutzung der libcgl-capture.so und nach Einlesen der Konfiguration unter /etc/cgl.conf den im ersten Argument mitgegebenen output rendert.Installation von ClusterGL - Mac OS X
Um ClusterGL auf Mac OS X (getestet mit 10.7 und 10.8) zu installieren, werden einige Bibliotheken aus der Linux-Umgebung benötigt, die so unter OS X noch nicht zur Verfügung stehen.
Sowohl über Homebrew, als auch über MacPorts können diese installiert werden:
MacPorts
port install libconfuse libsdl libsdl_net lzo2 glew
Homebrew
brew install confuse sdl_net lzo glew intltool gettext brew link gettext
Kompilieren
Das Kompilieren der ClusterGL-Anwendungen aus meinem Fork des origianl Repository sollte ohne weitere Probleme vonstatten gehen.
Ein Pullrequest auf das original Repository ist gestellt - sollte also demnächst auch über das original Repository funktionieren.
Ausführen
Beim Ausführen ist die Herangehensweise ein wenig anderes, als bei Linux. Statt dem dort zu verwendenden LD_LIBRARY_PRELOAD ist unter OS X DYLD_INSERT_LIBRARIES notwendig. Doch damit nicht genug, es muss auch noch mittels DYLD_FORCE_FLAT_NAMESPACE der sog. two-level namespace deaktiviert werden:
export DYLD_INSERT_LIBRARIES=/usr/lib/libcgl-capture.so export DYLD_FORCE_FLAT_NAMESPACE=
Anschließend werden innerhalb dieser Terminalsession ausgeführte Programme durch ClusterGL gejagt, anstatt direkt lokal angezeigt zu werden.