Pixel Noir

Pixel Noir is a real-time demo that my colleague Thomas Weber and I have programmed during a lab course at the Vienna University of Technology in winter 2010. Our goal was to create a short scene that showcases cinematic real-time graphical effects as provided by our own render-engine based on modern OpenGL.

Richard Nagy, designer and graphical artist, joined our team during early stages of the project. Together we came up with a setting that was inspired by the movie Blade Runner: A dark, surreal mood filled with an uncomfortable quietness. Of course we would not have been able to create such an atmosphere without using the right acoustic environment. Paul Gallister, film composer and musician, composed the soundtrack and environment sounds of the demo.

Here are a few technical facts and features of our demo project:

  • Variance Shadow Mapping
  • Post-Process Depth of Field
  • Particle-effects for dusty air-particles
  • Gamma-correct handling of textures and image output
  • Tone mapping and cinematic color curves
  • Barrel distortion
  • Adhoc evaluation of bezier splines for animated objects
  • Using Loose Octrees[1] for View Frustum Culling.
  • COLLADA based content pipeline, including import of geometry, animations, common materials with textures and additional 3D Studio Max specific extra profile data.
  • Awesome OpenGL core profile and extension loader, automatically generated from the OpenGL specification.
  • OpenGL 3.3 core profile
    • We tried to make the 3D artist's job of bringing content into our engine as comfortable as possible. We were using COLLADA as the intermediate format. We have also created a custom binary format that is tailor-made for the specific needs of our render engine. This was easily done using Google's protocol buffers. In this format we defined several object type structures, or 'messages' as they are called. It was then really simple to create, modify and store these message types as binary data. As a next step we took the excellent library Kyoto Cabinet to store the serialized data in a file-based hash database.

      All of the mentioned libraries are cross-platform and come with bindings for multiple languages. This allowed our content pipeline to be much more flexible when we were able to write tools in Python. Finally, the resulting file can be opened and 'played back' by our renderer.

      Having this pipeline available, I have also used this renderer for a side-project of another course at the university. Here I was generating trees using a parametric L-system. The string generation of the trees is completely written in Python. Furthermore, the turtle interpretation of these strings is simply implemented in terms of generating content into our own custom format. Checkout this YouTube video to see a demo. You can also download the binaries on the right side of this page. Sources for the tree generation and interpretation are included with the main source tree of the Pixel Noir project. The rendered trees are generated using the L-systems as given by [2].

      We have had great fun and learned a lot while working on this project. I think we came up with quite a few interesting pieces of code, and we do not want to hide those from you. Therefore you can get the complete source tree of this project from GitHub. The current source tree has been tested under Windows 7 with recent ATI and NVIDIA drivers. The complete project also runs and compiles under Linux (tested with NVIDIA drivers). The renderer requires OpenGL 3.3 or above. There are plans for porting the renderer to the Mac platform once OpenGL 3.x support has been added to the operating system.

      References:

      [1] U. Thatcher, Game Programming Gems. Charles River Media, 2000, ch. Loose Octrees, pp. 444–452.
      [2] Lindenmayer, A., P. Prusinkiewicz, 1990, The Algorithmic Beauty of Plants, pg. 60