次の方法で共有


幅とピッチ (Direct3D 9)

"幅" と "ピッチ" という用語は、多くの場合、非公式に使用されますが、非常に重要で、明確に異なる意味があります。 その結果、それぞれの意味と、Direct3D がそれらを記述するために使用する値を解釈する方法を理解する必要があります。

Direct3D は 、D3DSURFACE_DESC 構造を使用して、サーフェスを記述する情報を伝達します。 特に、この構造は、サーフェスのディメンションに関する情報と、それらのディメンションがメモリ内でどのように表されるかを含めるために定義されています。 構造体では、Height メンバーと Width メンバーを使用して、サーフェスの論理ディメンションを記述します。 両方のメンバーはピクセル単位で測定されます。 したがって、640 x 480 サーフェスの Height と Width の値は、8 ビットサーフェスでも 24 ビット RGB サーフェスでも同じです。

IDirect3DSurface9::LockRect メソッドを使用してサーフェスをロックすると、このメソッドは、サーフェスのピッチとロックされたビットへのポインターを含むD3DLOCKED_RECT構造体を埋めます。 Pitch メンバーの値は、ストライドとも呼ばれるサーフェスのメモリ ピッチを表します。 ピッチは、1 つのビットマップ行の先頭と次のビットマップ行の先頭を表す 2 つのメモリ アドレス間の距離 (バイト単位) です。 ピッチはピクセルではなくバイト単位で測定されるため、640 x 480x8 サーフェスのピッチ値は、同じ寸法でピクセル形式が異なるサーフェスとは非常に異なります。 また、ピッチ値には、Direct3D がキャッシュとして予約したバイトが反映される場合があるため、ピッチがピクセルあたりのバイト数を乗算した幅であると見なしても安全ではありません。 代わりに、次の図に示すように、幅とピッチの違いを視覚化します。

同じフロント バッファー、バック バッファー、およびキャッシュのピッチと幅の図

この図では、フロント バッファーとバック バッファーはどちらも 640 x 480x8 で、キャッシュは 384 x 480 x 8 です。

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

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

Direct3D サーフェス