Platform SDK: DirectX

オフスクリーン サーフェスの作成

[C++]

オフスクリーン サーフェスは、後でプライマリ サーフェスあるいはバック バッファにブリットされるビットマップをキャッシュするために使われることがある。DDSD_WIDTH および DDSD_HEIGHT フラグを設定し、対応する値を dwWidth および dwHeight メンバに与えることで、オフスクリーン サーフェスのディメンジョンを宣言する。さらに、付随する DDSCAPS2 構造体に DDSCAPS_OFFSCREENPLAIN フラグを設定しなくてはならない。

デフォルトでは、DirectDraw はディスプレイ メモリにサーフェスを作成しようとする。うまくいかなければ、システム メモリにサーフェスを作成する。DDSCAPS2 構造体の dwCaps メンバに DDSCAPS_SYSTEMMEMORY または DDSCAPS_VIDEOMEMORY フラグを設定することで、明示的にディスプレイ メモリまたはシステム メモリを選択できる。指定された位置にサーフェスを作成できない場合、メソッドはエラーを返して失敗する。

次に示す例は、簡単なオフスクリーン サーフェスの作成の方法を示す。

DDSURFACEDESC2 ddsd; 
ddsd.dwSize = sizeof(ddsd); 
 
// どのメンバが有効か DirectDraw に伝える。
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; 
 
// 簡単なオフスクリーン サーフェスを要求する。
// サイズは 100 × 100 ピクセルである。
//
// (作成するオフスクリーン サーフェスが
// プライマリ サーフェスのピクセル フォーマットに
// 適合すると仮定する。)
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; 
ddsd.dwHeight = 100; 
ddsd.dwWidth = 100; 

また、ピクセル フォーマットがプライマリ サーフェスのピクセル フォーマットと異なるサーフェスも作成できる。ただし、この場合には、システム メモリの使用が制限されるという弱点がある。次に示すコードでは、8 ビット パレット化サーフェス (現在のディスプレイ モードがピクセルごとに 8 ビット以外であると仮定する) を作成するために、DDSURFACEDESC2 構造体メンバを準備する方法について示す。

ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize  = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
ddsd.dwHeight = 100;
ddsd.dwWidth  = 100;
ddsd.ddpfPixelFormat.dwSize  = sizeof(DDPIXELFORMAT);
ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_PALETTEINDEXED8;
 
// 8 ビット サーフェスに対するビット深度を設定するが、
// あらゆる RGB マスク値を指定してはならない。パレット化サーフェスに対して、
// マスク値は 0 でなければならない。
ddsd.ddpfPixelFormat.dwRGBBitCount = 8;
[Visual Basic]

オフスクリーン サーフェスは、後でプライマリ サーフェスあるいはバック バッファにブリットされるビットマップをキャッシュするために使われることがある。DDSD_WIDTH および DDSD_HEIGHT フラグを設定し、対応する値を IWidth および IHeight メンバに与えることで、オフスクリーン サーフェスのディメンジョンを宣言する。さらに、付随する DDSCAPS2 型に DDSCAPS_OFFSCREENPLAIN フラグを設定しなくてはならない。

デフォルトでは、DirectDraw はディスプレイ メモリにサーフェスを作成しようとする。うまくいかなければ、システム メモリにサーフェスを作成する。DDSCAPS2 型の lCaps メンバに DDSCAPS_SYSTEMMEMORY または DDSCAPS_VIDEOMEMORY フラグを設定することで、明示的にディスプレイ メモリまたはシステム メモリを選択できる。指定された位置にサーフェスを作成できない場合、メソッドはエラーを返して失敗する。

次に示す例は、簡単なオフスクリーン サーフェスの作成の方法を示す。

Dim ddsd As DDSURFACEDESC2
 
' どのメンバが有効か DirectDraw に伝える。
ddsd.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH
 
' 簡単なオフスクリーン サーフェスを要求する。
' サイズは 100 × 100 ピクセルである。
'
' (作成するオフスクリーン サーフェスが
' プライマリ サーフェスのピクセル フォーマットに
' 適合すると仮定する。
ddsd.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
ddsd.lHeight = 100
ddsd.lWidth = 100

また、ピクセル フォーマットがプライマリ サーフェスのピクセル フォーマットと異なるサーフェスも作成できる。ただし、この場合には、システム メモリの使用が制限されるという弱点がある。次に示すコードでは、8 ビット パレット化サーフェス (現在のディスプレイ モードがピクセルごとに 8 ビット以外であると仮定する) を作成するために、DDSURFACEDESC2 型のメンバを準備する方法について示す。

ddsd.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH Or DDSD_PIXELFORMAT
ddsd.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_SYSTEMMEMORY
ddsd.lHeight = 100
ddsd.lWidth = 100
ddsd.ddpfPixelFormat.lFlags = DDPF_RGB Or DDPF_PALETTEINDEXED8
 
' 8 ビット サーフェスに対するビット深度を設定するが、
' あらゆる RGB マスク値を指定してはならない。パレット化サーフェスに対して、
' マスク値は 0 でなければならない。
ddsd.ddpfPixelFormat.lRGBBitCount = 8

DirectX の以前のバージョンでは、オフスクリーン サーフェスの最大幅はプライマリ サーフェスの幅に制限されていた。DirectX 5.0 では、ディスプレイ ハードウェアがサポートできるのであれば、必要なだけ広いサーフェスを作成することができる。ただし、幅の広いオフスクリーン サーフェスを宣言する場合には注意が必要である。ビデオ カードメモリが要求された広さのサーフェスを保持できない場合、サーフェスはシステム メモリに作成される。明示的にビデオ メモリを選択し、ハードウェアがそれをサポートできない場合、その呼び出しは失敗する。詳細については、「ワイド サーフェスの作成」を参照すること。