Platform SDK: DirectX

ステップ 2.2 : DirectDraw サーフェスをセット アップする

[C++]

ここでは、Visual Basic でのアプリケーション開発について説明する。C++ については、「Direct3D 直接モードの C/C++ チュートリアル」を参照すること。

[Visual Basic]

DirectDraw オブジェクトを作成し、その協調レベルを設定すると、アプリケーションがシーンのレンダリング、表示に使用するサーフェスが作成できる。サーフェスの作成方法は、アプリケーションがウィンドウ内またはフルスクリーン モードのどちらで実行されるかによって、ほぼ決定される。

フルスクリーン アプリケーションについて :  フルスクリーン モードで実行されるアプリケーションは、上記のコード例に示すようにサーフェスを作成することができる。フルスクリーン アプリケーションでは、フルスクリーン排他モードに限って使用できる機能であるページ フリッピングを利用することが頻繁に行われている。フルスクリーン モードの使用については、以下のチュートリアルで説明する。この場合、2 つのサーフェスを明示的に作成するのではなく、単一コールで、サーフェスのフリッピング チェーンを作成することができる。詳細については、「複合サーフェスとフリッピング チェーンの作成」を参照すること。

サンプル Triangle は、ウィンドウ内で実行されるように設計されており、ディスプレイとして機能するプライマリ サーフェスの作成から始まる。

' プライマリ サーフェスを準備して作成する。
    g_ddsd.lFlags = DDSD_CAPS
    g_ddsd.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE
    
    Set g_ddsPrimary = g_dd.CreateSurface(g_ddsd)

プライマリ サーフェス記述には、寸法やピクセル フォーマットの情報は含まれない。このような特徴は、ディスプレイ モードと同じであると見なされているからである。現在のディスプレイ モードが、800×600 の 16 ビット カラーであれば、DirectDraw は、プライマリ サーフェスも同じであることを保証する。プライマリ サーフェスを作成すると、レンダリング ターゲットのサーフェスを作成することが可能になる。サンプル Triangle の場合、これは、次のようにして作成される、別のオフスクリーン サーフェスとなる。

' レンダリング ターゲットのサーフェスを作成する。ここで g_ddsd を再使用する。
g_ddsd.lFlags = DDSD_HEIGHT Or DDSD_WIDTH Or DDSD_CAPS
g_ddsd.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_3DDEVICE
    
' フォームのサイズを使ってレンダリング ターゲットのサイズと
' ビューポートの矩形を指定する。
g_dx.GetWindowRect Me.hWnd, g_rcDest
    
' サーフェス記述のサイズを設定する。
g_ddsd.lWidth = g_rcDest.Right - g_rcDest.Left
g_ddsd.lHeight = g_rcDest.Bottom - g_rcDest.Top
    
' レンダリング ターゲットのサーフェスを作成する。
Set g_ddsBackBuffer = g_dd.CreateSurface(g_ddsd)
        
' レンダリング ターゲットのサイズをキャッシュに入れる。このサイズは、
' ブリットで使用される。
With g_rcSrc
.Left = 0:.Top = 0
.Bottom = g_ddsd.lHeight
.Right = g_ddsd.lWidth
End With

上記のコードは、アプリケーション ウィンドウのサイズと等しいオフスクリーン サーフェスを作成する。オフスクリーン サーフェスを使って、後でプライマリ サーフェスにブリットされるイメージをキャッシュに入れる。それより大きいサーフェスは、ウィンドウのサイズによってユーザーに見える範囲が決定されるため、必要とされない (このコードは、ビューポートのセット アップおよびアプリケーション ウィンドウのサイズと位置の追跡を行うために使用する、グローバル変数 g_rcDest の初期化も行っている)。上記のコードが示すように、レンダリング ターゲットとして使用されるサーフェスにはすべて、DDSCAPS_3DDEVICE 能力を含めなければならない。この能力によって、システムは 3D レンダリングに使用される追加の内部データ構造を割り当てる。プライマリ サーフェスを作成する場合と同様に、オフスクリーン サーフェスのピクセル フォーマットは、サーフェス記述で指定されていなければ、ディスプレイ モードと同じとされる。

 :  深度バッファを使用するアプリケーションでは、この時点で、1 つの深度バッファを作成して、レンダリング ターゲット サーフェスにアタッチする必要がある。理解しやすくするため、このチュートリアルでは深度バッファを使用していないが、深度バッファについては、「チュートリアル 2 : 深度バッファを追加する」および「深度バッファ」で説明する。

レンダリング ターゲットのプライマリ サーフェスを作成すると、DirectDrawClipper オブジェクトを作成して表示サーフェスにアタッチすることが可能になる。クリッパーを使用すると、ウィンドウが部分的にほかのウィンドウによって隠された場合や、ウィンドウが部分的に表示領域を越えた場合の処理をしなくて済む。したがって、クリッパーは、フルスクリーン モードで実行されるアプリケーションには必要ない。サンプル Triangle は、次のコードを使用してクリッパーを作成し、表示ウィンドウに結合している。

' DirectDrawClipper を作成し、プライマリ サーフェスにアタッチする。
Dim pcClipper As DirectDrawClipper
    
Set pcClipper = g_dd.CreateClipper(0)
pcClipper.SetHWnd Me.hWnd
    
g_ddsPrimary.SetClipper pcClipper

基本的な DirectDraw オブジェクトの作成を終了すると、シーンをレンダリングする Direct3D 主要オブジェクトのセット アップに進むことができる。サンプル Triangle は、「ステップ 2.3 : Direct3D を初期化する」でこのタスクを行っている。