Yes use one camera, with two render targets.
Here is the basis I used for my system:
Type EyeType
RenderImage as integer
DepthImage as integer
Sprite as integer
PosX as float
PosY as float
PosZ as float
EndType
Global LeftEye As EyeType
Global RightEye As EyeType
Global EyeDistance As float : EyeDistance = 10.0
//Set Camera/Eye positions
LeftEye.PosX = -( EyeDistance / 2.0 ) : LeftEye.PosY = 0.0 : LeftEye.PosZ = 0.0
RightEye.PosX = ( EyeDistance / 2.0 ) : RightEye.PosY = 0.0 : RightEye.PosZ = 0.0
//set up images to render cameras to
LeftEye.RenderImage = CreateRenderImage( GetDeviceWidth() / 2.0, GetDeviceHeight(), 0, 0 )
LeftEye.DepthImage = CreateRenderImage( GetDeviceWidth() / 2.0, GetDeviceHeight(), 1, 0 )
LeftEye.Sprite = CreateSprite( 0 )
SetSpriteTransparency( LeftEye.Sprite, 0 )
SetSpriteDepth( LeftEye.Sprite, 0 )
FixSpriteToScreen( LeftEye.Sprite, 1 )
SetSpriteVisible( LeftEye.Sprite, 0 )
RightEye.RenderImage = CreateRenderImage( GetDeviceWidth() / 2.0, GetDeviceHeight(), 0, 0 )
RightEye.DepthImage = CreateRenderImage( GetDeviceWidth() / 2.0, GetDeviceHeight(), 1, 0 )
RightEye.Sprite = CreateSprite( 0 )
SetSpriteTransparency( RightEye.Sprite, 0 )
SetSpriteDepth( RightEye.Sprite, 0 )
FixSpriteToScreen( RightEye.Sprite, 1 )
SetSpriteVisible( RightEye.Sprite, 0 )
Repeat
`Game stuff here
SetSpriteVisible( LeftEye.Sprite, 0 )
SetSpriteVisible( RightEye.Sprite, 0 )
Update3D( Engine.FrameTime# )
Render3D()
//Left Eye
SetCameraPosition( 1, LeftEye.PosX, LeftEye.PosY, LeftEye.PosZ )
SetRenderToImage( LeftEye.RenderImage, LeftEye.DepthImage )
ClearScreen( )
Render( )
//Right Eye
SetCameraPosition( 1, RightEye.PosX, RightEye.PosY, RightEye.PosZ )
SetRenderToImage( RightEye.RenderImage, RightEye.DepthImage )
ClearScreen( )
Render( )
SetRenderToScreen( )
Offset# = 0.5 : ` Final value should be 0.25
//Left Eye
SetSpriteImage( LeftEye.Sprite, LeftEye.RenderImage )
SetSpriteSize( LeftEye.Sprite, 50, 100 )
SetSpritePosition( LeftEye.Sprite, 0, 0 )
SetSpriteVisible( LeftEye.Sprite, 1 )
SetSpriteUV ( LeftEye.Sprite, 0.5 - Offset#, 0.0, 0.5 - Offset#, 1.0, 0.5 + Offset#, 0.0, 0.5 + Offset#, 1.0 )
//Right Eye
SetSpriteImage( RightEye.Sprite, RightEye.RenderImage )
SetSpriteSize( RightEye.Sprite, 50, 100 )
SetSpritePosition( RightEye.Sprite, 50, 0 )
SetSpriteVisible( RightEye.Sprite, 1 )
SetSpriteUV ( RightEye.Sprite, 0.5 - Offset#, 0.0, 0.5 - Offset#, 1.0, 0.5 + Offset#, 0.0, 0.5 + Offset#, 1.0 )
DrawLine( 50, 0.0, 50, 100, 255, 255, 255 )
Render( )
Swap( )
Until GetRawKeyReleased( 27 )