4

What tools, APIs, libraries are out there that I could use to create a system capable of rendering hi-res 3D scenes in real time in a display made of 4, 8, 9, 16, etc screens/projectors? For a setup with 8 projectors I should go for clustered solutions or should I stay with a single node featuring 4 dual headed video cards? Does someone have any experience with that?

Brian Gianforcaro
  • 26,564
  • 11
  • 58
  • 77
user16120
  • 952
  • 1
  • 10
  • 16

5 Answers5

5

Equalizer is probably one of the better solutions you'll find.

It's specifically designed for splitting apart renders and distributing them across display's.

Description:

Equalizer allows the user to scale rendering performance, visual quality and display size. An Equalizer-based application runs unmodified on any visualization system, from a simple workstation to large scale graphics clusters, multi-GPU workstations and Virtual Reality installations.

Example Usage of Equalizer:

Render Wall
(source: equalizergraphics.com)

I've worked on projects trying to do similar things without Equalizer, and I can honestly say it was pretty bad. We only got it barely working. After finding equalizer later, I can't imagine how much easier it would have been with such a tool.

Glorfindel
  • 21,988
  • 13
  • 81
  • 109
Brian Gianforcaro
  • 26,564
  • 11
  • 58
  • 77
2

You can use Xinerama or XRandR when working with X11/Xorg. But to quote Wikipedia on Xinerama:

In most implementations, OpenGL (3D) direct-rendering only works on one of the screens. Windows that should show 3D graphics on other screens tend to just appear black. This is most commonly seen with 3D screen savers, which show on one of the screens and black on the others. (The Solaris SPARC OpenGL implementation allows direct rendering to all screens in Xinerama mode, as does the nvidia driver when both monitors are on the same video card.)

I suggest you read the Wikipedia article first.

2

I use one of these nifty TripleHead2Go's at home on my gaming rig to drive 3 displays from one video card (even in Vista). Two displays with a bezel in the middle is kinda a bummer for gaming. TripleHead2Go
(source: maximumpc.com)

I found out about them because we were looking at using several of them at work for driving a system of ours that has about 9 displays. I think for that we ended up going with a system with 5 PCI-X slots and a dual-head card in each. If you have trouble with getting that many PCI slots on a motherboard, there are PCI-X bus expansion systems avilable.

Glorfindel
  • 21,988
  • 13
  • 81
  • 109
T.E.D.
  • 44,016
  • 10
  • 73
  • 134
  • Supported Operating Systems from the site: Microsoft® Windows® 20003, Windows XP (32/64bit), Windows Vista™ (32/64bit), Windows Server 2003/2008 (32/64bit), Mac® OS X v10.4 and Mac OX v10.5 Leopard – Brian Gianforcaro Feb 07 '09 at 22:46
  • My "(even in Vista)" comment wasn't about it's support. What I was referring to is the fact that dual-headed video cards can't do "span" mode in Vista, due to the thrice damned MPAA-inspired "security" Microsoft put in the video driver stack. That's why Vista gamers need one of these babies. – T.E.D. Feb 08 '09 at 03:21
2

You should have a look at the "AMD Radeon HD 5870 Eyefinity 6-edition" graphics card. This supports output to six displays simultaneously and allows the setting of several options in the driver regarding the arrangment of the outputs (3 in a row, 2x3 horizontal/vertical), etc).

Regarding API's: with a card like this (but also with a TripleHead2Go) you get a single virtual canvas, which supports full 3D accelerations without performance loss (so much better than with an Extended desktop). At AMD they call this a Single Large Surface (probably equivalent to what NVidia calls a Horizontal/Vertical span). The caveat here is that all outputs need to have the same resolution, frame rate and color depth. Such a surface could have a resolution of 5760 x 3240 or higher, depending on settings, so it's a good thing that the 5870 is so fast.

Then, in your application, you render to this large virtual canvas (using OpenGL, Direct3D or some other way) and you're done... Except that you did not say if you were going to have the displays at an angle to each other or in a flat configuration. In the latter case, you can just use a single perspective camera and render to the entire backbuffer. But if you have more of a 'surround' setup, then you need to have multiple cameras in your scene, all looking out from the same point.

The fastest loop to do this rendering is then probably:

for all all objects
    set textures and shader and renderstate
    for all viewports
        render object to viewport

and not

for all viewports
    for all objects
         set textures and shader and renderstate
         render object to viewport

because switching objects causes the GPU to lose much more useful information from its state and caches than switching viewports.

You could contact AMD to check if it's possible to add two of these cards (power-supply permitting) to a single system to drive up to 12 displays.

Note that not all configurations are supported (e.g. 5x1 is not, as I read from the FAQ).

A lot of my experience regarding this was gathered during the creation of the Future Flight Experience project, which uses three beamers (each with its own camera in the 3D scene), a dual Nvidia GTX 280 in SLI, and a Matrox TripleHead2Go on Windows XP.

1

I know that the pyglet OpenGL wrapper (http://www.pyglet.org) for python has multiplatform multimonitor support; you might want to look at their source code and figure out how it is implemented.

user42056
  • 71
  • 3