DirectDraw では、構造体に特定のフィールドを設定し、それをインターフェイスのメソッドにDDSURFACEDESC渡すことによって、メモリ内のデータからサーフェスを作成できます。CreateSurfaceIDirectDraw
DDSURFACEDESC最初に、構造体のどのフィールドに正しい情報が含まれているかを DirectDraw に伝える必要があります。これには、dwFlagsフィールドを次の一連のフラグに設定しますDDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_LPSURFACE | DDSD_PITCH。
ああ、これはシステム メモリ サーフェスに対してのみ機能するため、おそらくフィールドにDDSCAPS_SYSTEMMEMORYフラグを追加する必要がありddsCaps.dwCapsます (DirectDraw がデフォルトで追加しない場合)。
次に、フィールドでピクセル データ配列の先頭のアドレスを指定しますlpSurface。バッファが連続している場合は、lPitchを 0 に設定するだけです。それ以外の場合は、そこに正しいピッチを設定します (2 つの後続のスキャンラインの始まりの間のバイト単位の距離)。
フィールドで正しいピクセル形式を設定し、ddpfPixelFormat正しいビット深度を でdwRGBBitCount、RGB マスクを でdwRBitMask、dwGBitMaskおよび で設定しdwBBitMaskます。
次に、lXPitchをピクセルのバイト数 (RGB の場合は 3) に設定します。使用するピクセル形式によって異なります。
次に、塗りつぶされた構造を渡して、それがCreateSurface機能するかどうかを確認します。
この方法でサーフェスを作成する場合、DirectDraw は自身のデータ バッファを管理せず、一度Releaseサーフェスを呼び出すとこのメモリを解放しないことに注意してください。このメモリがサーフェスで使用されなくなったら、自分で解放する必要があります。
一方、このピクセル データをビデオ メモリに配置する場合は、通常の方法でオフスクリーン サーフェスを作成してからロックし、ビデオ メモリ内の独自のバッファにピクセルをコピーする必要があります (lpSurfaceフィールドにアドレスを入力しlPitch、カウントを忘れずに取得してください!)、ロックを解除します。