次の方法で共有


幅とピッチ

幅とピッチ

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

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

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

ピッチと幅の違い

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

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

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