Digging through some programming documents on Nvidia’s website I was able to find something interesting in one quite old document, regarding programming for GeForce 7 series, but these are still mostly the same issues that bring problems to current games when you try to play them in stereo 3D. I’m citing the part where Nvidia talks about these common issues and suggests workarounds (in terms of programming the game) for them below, because you need to be aware of these in order to be able to avoid most of them by changing settings in the game options etc. If you know what hurts the game looking good in stereo 3D mode you may be able to disable some of the problematic things or lower their negative impact with lets say custom convergence, so that the game will still be playable and look nice. And although these are related to Nvidia’s stereoscopic 3D drivers (prior 3D Vision) they do apply to 3D Vision and other alternative solutions that allow you to play a game in stereo 3D mode…
Rendering at an Incorrect Depth
This problem is the number one thing you should take care of. The 3D Stereo Driver uses the depth to create the stereo effect, so anything that is not at the correct depth stands out like a sore thumb when viewed in Stereo.
- Place background images, sky boxes, and sky domes at the farthest possible depth. Otherwise, the world will look like it’s in a little box in stereo.
- Place HUD items at their proper 3D depth. If you have name labels that hover over objects, putting them at the 3D depth of the object gives a better stereo effect than putting them on the near plane of the view frustum.
- It’s also helpful to render the HUD as far into the scene as possible. This trick gives you a greater perceived depth in the rest of your scene while not causing eyestrain when looking at the HUD.
- Laser sights, crosshairs, and cursors do not look correct unless placed in the 3D world at the depth of the objects they are pointing to. When they aren’t, it is almost impossible to use them since the user’s eyes are converging on one depth, but the cursor is at another depth; users see two cursors, neither of which point at the correct place.
- Highlighting objects should happen at the depth of the object itself, not in screen space.
Billboard effects look flat and bad in regular 3D; they look even worse in stereo. In regular 3D you see the billboards as you move around, but in 3D Stereo the problem immediately pops out at you, even in a static scene. Most billboard effects look extremely flat in stereo, so use real geometry everywhere you can instead, even low resolution geometry looks better. For particle effect billboards (sparks, smoke, dust, etc), these may or may not look ok, the best thing you can do is test your app in stereo to see what it looks like and judge if the quality is good enough, and make sure that the billboards have a meaningful depth in 3D.
Post-Processing and Screen-Space Effects
2D screen-space effects can greatly hurt the stereo effect. Things like blurry glow, bloom filters, image-based motion blur fall into this category. These effects are usually created by rendering the 3D geometry to a texture, then rendering a 2D screen aligned quad to the screen. The geometry in the texture is no longer at the correct depth in the world as the effect should be, thus working poorly in 3D Stereo. You should provide the option to disable these effects for people playing in stereo and render the geometry to the back buffer.
Using 2D Rendering in Your 3D Scene
Any object rendered as 2D doesn’t really have a real 3D depth, so it is placed at the monitor depth. This will look very flat in 3D Stereo. If you are mixing 2D and 3D in your HUD you may have inconsistent depths leading to eye strain. Again, render everything at the proper depth, in 3D, and test with stereo on.
When rendering a sub view to the screen, such as a picture in picture display, car mirror, or small map in the upper corner, you must set the viewport to cover the area before rendering. This trick prevents strange stereo effects bleeding outside of the intended section of the screen.
Updating the Screen with Dirty Rectangles
If you are determining only the parts of the screen that have changed and not updating the rest of the screen this can cause odd looking rendering in 3D stereo. Just render all visible objects each frame.
Resolving Collisions with Too Much Separation
If you are resolving collisions by pushing objects away from each other, make sure you don’t push them away too far. It looks bad in normal 3D when moving around but stands out right away in stereo, making things appear to hover above the ground.
Changing Depth Range for Difference Objects in the Scene
Splitting the scene into multiple depth ranges can cause distortions in the stereo effect making some objects look shorter or elongated. All objects should be rendered in a consistent depth range for the best stereo effect.
Not Providing Depth Data with Vertices
When sending vertices for rendering to D3D for software transform and lighting, include the RHW depth information for stereo to function properly.
Rendering in Windowed Mode
NVIDIA’s 3D Stereo only works when your application is in full-screen exclusive mode. If you don’t support fullscreen mode, then game players can’t take advantage of 3D Stereo.
Rendering stencil shadows using a fullscreen shadow color quad will not work properly in stereo. However, re-rendering shadowed objects in the scene at their proper depth in shadow color will function correctly in stereo. Shadow maps function fine, and projection shadows function as long as you are projecting to the proper depth for the shadow.
Manually Writing to Render Targets
Don’t lock render targets and do direct writes; doing so bypasses the stereo driver.
Very Dark or High-Contrast Scenes
Very dark scenes can become even darker when using 3D Stereo shutter glasses. Providing a brightness or gamma adjustment will help this problem. Using very bright objects on very bright and very dark objects causes ghosting, which hurts stereo. Testing your game in stereo quickly shows whether or not this is a problem.
Objects with Small Gaps between Vertices
Small gaps in meshes can become much more obvious when rendered in stereo. Make sure your meshes are tight and test in stereo to be sure this isn’t happening.