Wir haben eine WPF – Lösung gebaut, die eine 3D Szene mit WPF 3D (in einem Viewport3D) enthält. Wir wollten nun diese Szene stereoskopisch betrachtbar machen.

Die Technik dahinter sollte folgende sein:

3D-Brille

  • Wir haben eine GeForce- Grafikkarte, die NVIDIA 3D Vision unterstützt.
  • Wir haben einen Bildschirm mit 120hz Taktfrequenz.
  • Wir haben eine coole 3D-Shutter-Brille.

Nun sollte das Ganze so funktionieren, dass eine Applikation, die im Direct3D-Fullscreen – Mode läuft, von der NVIDIA-Software am PC stereoskopisch geschaltet werden kann. Wir haben viele, viele Direct3D Samples ausprobiert – funktioniert super. Vor allem die Beispiele im NVIDIA SDK schauen teilweise toll aus.Nun war die Idee, WPF 3D „einfach“ in den Fullscreen Mode zu schalten und alles andere läuft dann automatisch. Das Problem dabei: Das wird offiziell nicht unterstützt.

Nun haben wir probiert, das Direct3D device dahinter zu fassen zu bekommen und dann die D3DPRESENT_PARAMETERS dann Fullscreen zu schalten, etwa so:

ZeroMemory(&g_pd3dpp, sizeof(g_pd3dpp)); // clear out the struct for use
g_pd3dpp.Windowed = FALSE;
g_pd3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
g_pd3dpp.hDeviceWindow = windowHandle;
g_pd3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
g_pd3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; // set the back buffer format to 32-bit
g_pd3dpp.BackBufferWidth = sz.cx; // set the width of the buffer
g_pd3dpp.BackBufferHeight = sz.cy;
// set the height of the buffer

Aber die bittere Erkenntnis ist, dass der Bildschirm schwarz ist, sobald die Applikation wirklich Fullscreen wird. Andere Adaptionen der Parameter und auch ein ResetDevice beeindrucken WPF nicht, aber im Fullscreen Mode kann WPF einfach nicht mehr zeichnen, weil das Device im Fullscreen Mode offensichtlich exklusiv geschaltet wird und WPF dann keinen Zugriff mehr hat.

Dann hatten wir noch eine andere Idee:

Würden die beiden Bildhälften, die dann zusammengesetzt werden, dem Applikationsentwickler einfach als doppelt breiter Bildschirm angeboten, könnte er die beiden Bildhälften nebeneinander zeichnen. Hätte natürlich den Nachteil, dass die Parallaxe (die Verschiebung des Augenabstands) nicht mehr so leicht automatisch verschoben werden könnte, sondern vom Programm berechnet werden müsste, aber das wäre kein Problem (unsere Applikation kann schon Anaglyphen).

Geht scheinbar auch nicht.

Schade, und was nun? Weitere Ideen sind herzlich willkommen!

Ist gar nicht cool, oder?

LG,
Sabine.