Platform SDK: DirectX |
DirectDraw を初期化してディスプレイ モードを列挙し、ステレオ ビューがサポートされていることを確認したら、DirectDraw のステレオ ビュー サポートを利用できる。最初に、ステレオ ビュー フリッピング チェーンに対してサーフェスを宣言する必要がある。
LPDIRECTDRAWSURFACE7 pFrontBuffer; LPDIRECTDRAWSURFACE7 pBackBuffer; LPDIRECTDRAWSURFACE7 pBackBufferLeft;
次に、ステレオ ビューをサポートするサーフェスを記述する DDSURFACEDESC2 構造体を準備する。
DDSURFACEDESC2 ddsd2 = {sizeof(ddsd2)}; ddsd2.dwFlags = DDSDS_CAPS|DDSD_BACKBUFFERCOUNT; ddsd2.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE| DDSCAPS_3DDEVICE; ddsd2.dwBackBufferCount =1; ddsd2.ddsCaps.dwCaps2 = DDSCAPS2_STEREOSURFACELEFT; ddsd2.ddsCaps.dwCaps3 = ddsd2.ddsCaps.dwCaps4 =0;
DDSCAPS_PRIMARYSURFACE フラグが指定されていないと、サーフェスの記述で DDSCAPS2_STEREOSURFACELEFT を指定できない。これは、アプリケーションが別のサーフェスでステレオ フリッピング チェーンを作成し、IDirectDrawSurface7::AddAttachedSurface メソッドを呼び出してアタッチするのを防ぐためである。DDSCAPS2_STEREOSURFACELEFT が能力フラグとして指定されている場合、プライマリ チェーンの各バッファに 2 つのサーフェスが作成される。たとえば、dwBackBufferCount = N の場合、2 * (N+1) サーフェスが作成される。これらのサーフェスの一方には DDSCAPS2_STEREOSURFACELEFT 能力フラグが設定され、もう一方には設定されない。
Dim ddsFrontBuffer As DirectDrawSurface7 Dim ddsBackBuffer As DirectDrawSurface7 Dim ddsBackBufferLeft As DirectDrawSurface7
次に、ステレオ ビューをサポートするサーフェスを記述する DDSURFACEDESC2 型を準備する。
Dim ddsd2 As DDSURFACEDESC2 ddsd2.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT ddsd2.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_3DDEVICE ddsd2.lBackBufferCount = 1 ddsd2.ddsCaps.lCaps2 = DDSCAPS2_STEREOSURFACELEFT ddsd2.ddsCaps.lCaps3 = ddsd2.ddsCaps.lCaps4 = 0
DDSCAPS_PRIMARYSURFACE フラグが指定されていないと、サーフェスの記述で DDSCAPS2_STEREOSURFACELEFT を指定できない。これは、アプリケーションが別のサーフェスでステレオ フリッピング チェーンを作成し、DirectDrawSurface7.AddAttachedSurface メソッドを呼び出してアタッチするのを防ぐためである。DDSCAPS2_STEREOSURFACELEFT が能力フラグとして指定されている場合、プライマリ チェーンの各バッファに 2 つのサーフェスが作成される。たとえば、lBackBufferCount = N の場合、2 * (N+1) サーフェスが作成される。これらのサーフェスの一方には DDSCAPS2_STEREOSURFACELEFT 能力フラグが設定され、もう一方には設定されない。
サーフェスは、次の図に示すようにしてアタッチされ、ラベルが付けられる。
アプリケーションが DDSCAPS_3DDEVICE を指定すると、この能力フラグはチェーン内のすべてのサーフェスにコピーされるので注意すること。
ここで、プライマリ サーフェスを作成する。
pDD7->CreateSurface(&ddsd2, &pFrontBuffer, NULL); ddsd2.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; pFrontBuffer->GetAttachedSurface(&ddsd2.ddsCaps, &pBackBuffer); ddsd2.ddsCaps.dwCaps = 0; ddsd2.ddsCaps.dwCaps2 = DDSCAPS2_STEREOSURFACELEFT; pBackBuffer->GetAttachedSurface(&ddsd2.ddsCaps, &pBackBufferLeft);
上記のコードでは、IDirectDrawSurface7::GetAttachedSurface メソッドによって、ステレオ ビュー フリッピング チェーンにアタッチされたサーフェスを取得する。
while(running) { RenderRightImage(pBackBuffer); RenderLeftImage(pBackBufferLeft); pFrontBuffer->Flip(NULL,DDFLIP_WAIT|DDFLIP_STEREO); }
上記のコードでは、アプリケーション定義関数 RenderRightImage および RenderLeftImage によって、ステレオ イメージをレンダリングする。
DDFLIP_STEREO フラグが IDirectDrawSurface7::Flip メソッドに渡されると、2 つのサーフェスがドライバに渡される。これらのサーフェスが、新しいステレオ ペアになる。DirectDraw は、DDSCAPS2_STEREOSURFACELEFT サーフェスがアタッチされたサーフェスでのみこのフラグを使用できる。
ここで、プライマリ サーフェスを作成する。
Set ddsFrontBuffer = dd.CreateSurface(ddsd2) ddsd2.ddsCaps.lCaps = DDSCAPS_BACKBUFFER Set ddsBackBuffer = ddsFrontBuffer.GetAttachedSurface(ddsd2.ddsCaps) ddsd2.ddsCaps.lCaps = 0 ddsd2.ddsCaps.lCaps2 = DDSCAPS2_STEREOSURFACELEFT Set ddsBackBufferLeft = ddsBackBuffer.GetAttachedSurface(ddsd2.ddsCaps)
上記のコードでは、DirectDrawSurface7.GetAttachedSurface メソッドを使って、ステレオ ビュー フリッピング チェーンにアタッチされたサーフェスを取得する。
Do While g_bRunning RenderRightImage ddsBackBuffer ' 右のイメージをレンダリングする。 RenderLeftImage ddsBackBufferLeft ' 左のイメージをレンダリングする。 ddsFrontBuffer.Flip Nothing, DDFLIP_WAIT Or DDFLIP_STEREO Loop
上記のコードでは、アプリケーション定義関数 RenderRightImage と RenderLeftImage によって、ステレオ イメージをレンダリングする。
DDFLIP_STEREO フラグが DirectDrawSurface7.Flip メソッドに渡されると、2 つのサーフェスがドライバに渡される。これらのサーフェスが、新しいステレオ ペアになる。DirectDraw は、DDSCAPS2_STEREOSURFACELEFT サーフェスがアタッチされたサーフェスでのみこのフラグを使用できる。
DDFLIP_STEREO フラグが Flip メソッドに渡されなかった場合、ドライバに対するサーフェス フリッピング呼び出しによって 1 つのサーフェスだけが指定される。これにより、ステレオ ビューは必要ないことをドライバに示す。
フリッピング チェーンの詳細については、「フリッピング サーフェス」の概要のトピックを参照すること。