サーフェスの反転 (Direct3D 9)
Direct3D アプリケーションでは、通常、アニメーションのフレームをバック バッファーで生成し、順番に表示することで、アニメーションシーケンスを表示します。 バック バッファーはスワップ チェーンに編成されます。 スワップ チェーンは、画面に次々と "反転" する一連のバッファーです。 これを使用すると、メモリ内の 1 つのシーンをレンダリングし、レンダリングが完了したときにシーンを画面に反転させることができます。 これにより、ティアリングと呼ばれる現象が回避され、より滑らかなアニメーションが可能になります。
Direct3D で作成された各デバイスには、少なくとも 1 つのスワップ チェーンがあります。 最初の Direct3D デバイスを初期化するときに、 D3DPRESENT_PARAMETERSの BackBufferCount メンバーを設定します。これにより、スワップ チェーン内にあるバック バッファーの数が Direct3D に通知されます。 IDirect3D9::CreateDevice を呼び出すと、Direct3D デバイスとそれに対応するスワップ チェーンが作成されます。
IDirect3DDevice9::P resent を使用してサーフェス 反転操作を要求すると、フロント バッファーとバック バッファーのサーフェス メモリへのポインターがスワップされます。 反転は、ディスプレイ デバイスがメモリの参照に使用するポインターを切り替えることによって実行されます。これは、サーフェス メモリをコピーする操作ではありません。 反転チェーンにフロント バッファーと複数のバック バッファーが含まれている場合、次の図に示すように、ポインターは循環パターンで切り替えられます。
IDirect3DDevice9::CreateAdditionalSwapChain を呼び出すことで、デバイスの追加スワップ チェーンを作成できます。 アプリケーションは、ビューごとに 1 つのスワップ チェーンを作成し、各スワップ チェーンを特定のウィンドウに関連付けることができます。 アプリケーションは、各スワップ チェーンのバック バッファーにイメージをレンダリングし、それらを個別に表示します。 IDirect3DDevice9::CreateAdditionalSwapChain が受け取る 2 つのパラメーターは、D3DPRESENT_PARAMETERS構造体へのポインターと、IDirect3DSwapChain9 インターフェイスへのポインターのアドレスです。 その後、 IDirect3DSwapChain9::P resent を使用して、次のバック バッファーの内容をフロント バッファーに表示できます。 デバイスに含めることができる全画面表示スワップ チェーンは 1 つだけであることに注意してください。
返されたバック バッファー サーフェスを表す IDirect3DSurface9 インターフェイスへのポインターを返す IDirect3DDevice9::GetBackBuffer メソッドまたは IDirect3DSwapChain9::GetBackBuffer メソッドを呼び出すことで、特定 の バック バッファーにアクセスできます。 このメソッドを呼び出すと 、IDirect3DDevice9 インターフェイスの内部参照カウントが増えるので、このサーフェスの使用が完了したとき、またはメモリ リークが発生した場合は、 必ず IUnknown を呼び出してください。
Direct3D は、サーフェス自体をスワップするのではなく、スワップ チェーン内のサーフェス メモリ ポインターをスワップすることによってサーフェスを反転します。 つまり、次に表示されるバック バッファーに常にレンダリングされます。
ディスプレイ アダプター ドライバーによって実行される "反転操作" と、D3DSWAPEFFECT_FLIPで作成されたスワップ チェーンに適用される "Present" 操作の違いに注意することが重要です。
"flip" という用語は、従来、ディスプレイ アダプターが出力信号を生成するために使用するビデオ メモリ アドレスの範囲を変更する操作を表します。これにより、以前に隠されたバック バッファーの内容が表示されます。 Direct3D 9 では、多くの場合、この用語は、D3DSWAPEFFECT_FLIPスワップ効果で作成されたスワップ チェーン内のバック バッファーの表示を表すために、より一般的に使用されます。
このような "Present" 操作は、スワップ チェーンが全画面表示の場合にフリップ操作によってほとんど必ず実装されますが、スワップ チェーンがウィンドウ化されている場合は、必ずしもコピー操作によって実装されます。 さらに、ディスプレイ アダプター ドライバーは、D3DSWAPEFFECT_DISCARDとD3DSWAPEFFECT_COPYに基づいて全画面表示のスワップ チェーンに対する Present 操作を実装するために反転を使用できます。
上記の説明は、D3DSWAPEFFECT_FLIPで作成された全画面表示スワップ チェーンの一般的に使用されるケースに適用されます。
ウィンドウと全画面表示の両方のスワップ チェーンに対するさまざまなスワップ効果の一般的な説明については、「 D3DSWAPEFFECT」を参照してください。
関連トピック