Microsoft DirectX 8.0 (C++)

幅とピッチ

ピッチという単語からある程度想像できるが、非常に重要な、そして明らかに異なる意味がある。したがって、その意味と Microsoft®Direct3D® で幅とピッチの記述に使用する値の判断方法を理解する必要がある。

Direct3D では、D3DSURFACE_DESC 構造体を使ってサーフェスを記述する情報を伝達する。ほかにも、このディメンジョンのメモリ内での表示方法と同様に、この構造体はサーフェスのディメンジョンの情報を含むために定義される。この構造体では Height メンバと Width メンバを使い、サーフェスの論理的なディメンジョンを記述する。両方のメンバはピクセル単位で測定される。そのため、640 × 480 のサーフェスに対する Height 値と Width 値は、8 ビットのサーフェスか 24 ビットの RGB サーフェスかに関係なく同じになる。

IDirect3DSurface8::LockRect メソッドを使ってサーフェスをロックすると、このメソッドはサーフェスのピッチとロックされたビットへのポインタを含む D3DLOCKED_RECT 構造体にデータを設定する。Pitch メンバの値は、サーフェスのメモリ ピッチ (または、ストライドと呼ばれる) を記述する。ピッチは、2 つのメモリ アドレス間 (あるビットマップ ラインの始点と次のビットマップ ラインの始点) の距離であり、単位はバイトである。ピッチはピクセルではなくバイト単位で測定されるために、640 × 480 × 8 のサーフェスは、異なるピクセル フォーマットの同じディメンジョンのサーフェスよりも非常に異なるピッチの値を持つ。さらに、ピッチの値は Direct3D がキャッシュとして確保するバイトを反映することもあるので、単にピッチをピクセル単位のバイト数を掛けた幅であると仮定することはできない。次の図は、幅とピッチの違いを示している。

上記の図では、フロント バッファバック バッファはどちらも 640 × 480 × 8 で、キャッシュは 384 × 480 × 8 である。

サーフェス メモリに直接アクセスする場合のみ、ピッチの値が役立つ。たとえば、LockRect メソッドを呼び出した後に、関連付けられた D3DLOCKED_RECT 構造体の pBits メンバには、そのサーフェスのロックされた領域の左上ピクセルのアドレスが含まれ、Pitch メンバはサーフェス ピッチとなる。ピクセル単位のバイト数により、サーフェス ポインタをインクリメントしたりデクリメントすることで、左右にピクセルにアクセスできる。また、ピッチの値を現在のサーフェス ポインタに追加したり、またはそのポインタから減じたりすると、上下に移動できる。

サーフェスに直接アクセスする場合、サーフェスのディメンジョンに対して割り当てられたメモリの範囲内に置くことと、キャッシュに対して確保されたあらゆるメモリの外に置くことに注意する。さらに、サーフェスのポインタだけをロックする場合、サーフェスをロックするときに指定する矩形の範囲内に置かなくてはならない。これに従わないと、予測不可能な結果が生じる。サーフェス メモリに直接レンダリングするときは、LockRect メソッドが返すピッチを常に使用する。単に、ディスプレイ モードに基づくピッチを仮定して使用してはならない。ほかの原因により正常に動作しなくなったいくつかのディスプレイ アダプタ上でアプリケーションが動作する場合、問題が生じる可能性がある。

詳細については、「サーフェス メモリへの直接アクセス」を参照すること。