Platform SDK: DirectX

ステレオ ビューの実装

DirectDraw を初期化してディスプレイ モードを列挙し、ステレオ ビューがサポートされていることを確認したら、DirectDraw のステレオ ビュー サポートを利用できる。最初に、ステレオ ビュー フリッピング チェーンに対してサーフェスを宣言する必要がある。

[C++]
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 能力フラグが設定され、もう一方には設定されない。

[Visual Basic]
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 を指定すると、この能力フラグはチェーン内のすべてのサーフェスにコピーされるので注意すること。

[C++]

ここで、プライマリ サーフェスを作成する。

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 サーフェスがアタッチされたサーフェスでのみこのフラグを使用できる。

[Visual Basic]

ここで、プライマリ サーフェスを作成する。

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 つのサーフェスだけが指定される。これにより、ステレオ ビューは必要ないことをドライバに示す。

フリッピング チェーンの詳細については、「フリッピング サーフェス」の概要のトピックを参照すること。