Microsoft DirectX 8.0 (C++)

シーンの開始とエンディング

C++ で記述されたアプリケーションでは、IDirect3DDevice8::BeginScene メソッドを呼び出して、Microsoft® Direct3D® にシーンのレンダリングの開始を知らせる。BeginScene を呼び出すと、システムはその内部データ構造およびレンダリング ステートの可用性と有効性をチェックする。また、シーンが進行中であることを伝える内部フラグを設定する。シーンの開始後は、さまざまなレンダリング メソッドを呼び出してプリミティブをレンダリングしたり、シーンのオブジェクトを構成する頂点を個別にレンダリングすることができる。シーンの処理中でないときにレンダリング メソッドを呼び出そうとすると失敗する。詳細については、「プリミティブのレンダリング」を参照すること。

シーンが完了したら、IDirect3DDevice8::EndScene メソッドを呼び出す。EndScene メソッドは、キャッシュされているデータをフラッシュし、レンダリング サーフェスの完全性を検証し、シーンが進行中であることを伝える内部フラグをクリアする。

レンダリング メソッドはすべて、BeginScene メソッドを呼び出してから EndScene メソッドを呼び出すまでの間に実行しなければならない。サーフェスが失われるか、または内部エラーが発生すると、シーンのメソッドはエラー値を返す。BeginScene メソッドが失敗した場合、シーンは開始されず、それに続く EndScene の呼び出しも失敗する。

これらのケースを以下にまとめる。

たとえば、次に示すのは、単純なシーンを処理するコードである。

HRESULT hr;

if(SUCCEEDED(pDevice->BeginScene()))
{
    // シーンの開始に成功した場合のみ、
    // プリミティブをレンダリングする。
    
    // シーンを閉じる。
    hr = pDevice->EndScene(); 
    if(FAILED(hr))
        return hr;
}

シーンを埋め込むことはできない。つまり、次のシーンをレンダリングするには、現在レンダリング中のシーンを完了する必要がある。BeginScene が呼び出されていないのに EndScene を呼び出した場合、エラーが返される。同様に、前のシーンが EndScene メソッドでまだ完了していないときに BeginScene を呼び出すと、エラーが発生する。

シーンのレンダリング中 (BeginScene を呼び出してから EndScene を呼び出すまでの間)、レンダリング ターゲットやテクスチャなどの Direct3D サーフェスに対して GDI 関数を呼び出してはならない。この関数を呼び出そうとすると、GDI 操作の結果が表示されなくなる可能性がある。アプリケーションで GDI 関数を使用する場合は、シーン関数の外ですべての GDI の呼び出しを行うようにする。