# OpenSG

OpenSG is a scene graph system to create real-time graphics programs, e.g. for virtual reality applications. It is developed following Open Source principles, LGPL licensed, and can be used freely. It runs on Windows, Linux, Solaris and OS X and is based on OpenGL.
Its main features are advanced multithreading and clustering support (with sort-first and sort-last rendering, amongst other techniques), although it is perfectly usable in a single-threaded single-system application as well.
It is not part of Khronos Group.

## History

It was started, just like many other systems, at the end of the scenegraph extinction in 1999 when Microsoft and SGI's Fahrenheit graphics API project died. Given that there was no other scene graph system on the market nor on the horizon with the features the authors wanted, they decided to start their own.
OpenSG should not be confused with OpenSceneGraph which is entirely different scene graph API, somewhat similar to OpenGL Performer. Development on both started about the same time, and both chose similar names.

## Technology

OpenSG is a scene graph like many others, but with a number of unique features that set it apart from others. It features a blocked state management system to reduce the overhead for state change optimization, highly flexible traversal and other mechanisms to allow run-time exchange and enhancement of core data structures, but the most unusual aspect is its multi-threading approach.
Scene graphs are notoriously hard targets for multi-threading, as they contain very large data structures easily consuming hundreds of megabytes of memory. Duplicating these is not an option due to the large overhead. Many scene graphs just lock individual nodes to prevent data corruption due to parallel writes, but that is only a partial solution. The state of the scene graph is represented by the whole scene graph, only protecting individual nodes can still lead to inconsistent results (e.g. when running an asynchronous physics simulation only updating parts of the graph will lead to partial simulation steps being displayed). OpenSG uses selective multi-buffering, by duplicating the small parts of the graph for each thread that needs to be protected while sharing the bulk data like vertex arrays and texture images, and only duplicating these using a copy on write mechanism. Synchronization of the changes for individual threads is done using a change list approach that allows minimal overhead.
The same mechanism also allows highly flexible and effective clustering. To synchronize an application running on several machines, only the changes for each frame are sent to each machine and integrated into the local scene graph. This way the distinction between local and remote changes is almost invisible. An application that wants to run on a cluster just needs to open a ClusterWindow that can distribute all changes across the cluster and can very easily drive a Powerwall or a CAVE without having to worry about distribution protocols and other complications.

## People

The project was started by Dirk Reiners, Gerrit Voss and Johannes Behr. it has received contributions by many other people, most notably by Carsten Neumann, who currently functions as the main maintainer.