次の方法で共有


幅とピッチ (Direct3D 9)

幅およびピッチという用語は同じように使用されることがよくありますが、意味は極めて重要でまったく異なります。そのため、それぞれの意味、そして Direct3D がこれらの用語を記述する際に使用する値を解釈する方法を知っておく必要があります。

Direct3D では、D3DSURFACE_DESC 構造体を使用してサーフェスを記述する情報を伝達します。とりわけ、この構造体は、サーフェスの寸法や、これらの寸法がメモリーで表される方法についての詳細を含むように定義されています。この構造体では、Hight メンバーと Width メンバーを使用してサーフェスの論理寸法を記述しています。両方のメンバーがピクセル単位で測定されます。ただし、640 x 480 サーフェスの Height 値と Width 値は、これが 8 ビットのサーフェスと 24 ビットのサーフェスのいずれであろうと同じです。

IDirect3DSurface9::LockRect メソッドを使用してサーフェスをロックする場合、メソッドは、サーフェスのピッチおよびロック済みビットへのポインターを含む D3DLOCKED_RECT 構造体に書き込みます。Pitch メンバーの値は、サーフェスのメモリー ピッチ (ストライドとも呼ばれる) を記述します。ピッチとは、1 つのビットマップ行の開始と、次のビットマップ行の開始を表す 2 つのメモリー アドレス間の距離 (バイト) です。ピッチはピクセルではなくバイトで測定されるため、640x480x8 のサーフェスの場合、同じ寸法でもピクセル フォーマットが異なるサーフェスとはピッチの値が大きく異なります。さらに、ピッチ値は Direct3D がキャッシュとして予約しているバイトを反映することがあるため、ピッチがピクセル当たりのバイト数によって乗算される幅であると想定することは安全ではありません。幅とピッチの違いを具体的に表すと、次の図のようになります。

Pitch and width difference

この図では、フロント バッファーとバック バッファーは両方とも 640x480x8 であり、キャッシュは 384x480x8 です。

サーフェスに直接アクセスする場合は、サーフェスの寸法に割り当てられているメモリー内にとどめ、キャッシュに予約されているメモリーには触れないよう注意してください。さらに、サーフェスの一部だけをロックする場合は、サーフェスのロック時に指定する矩形内にとどめる必要があります。これらのガイドラインに従わないと、予期せぬ結果が生じることがあります。サーフェス メモリーを直接レンダリングする場合は、常に IDirect3DSurface9::LockRect メソッドから戻されたピッチを使用するようにしてください。表示モードのみを基準とするピッチは想定しないでください。アプリケーションが一部のディスプレイ アダプターで動作していて、他のアダプターでは文字化けして見える場合、これが問題の原因となっている可能性があります。

詳細については、「サーフェス メモリーへの直接的なアクセス (Direct3D 9)」を参照してください。