Platform SDK: DirectX

幅とピッチ

ピッチという単語からある程度想像できるが、非常に重要な (そして、明らかな違い) 意味がある。そのため、それぞれの意味と、DirectDraw が幅とピッチを記述するために使う値の判断方法を理解しなくてはならない。

[C++]

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

DDSURFACEDESC2 構造体には、サーフェスが lPitch メンバからどのようにメモリ内に表示されるかという情報が含まれる。lPitch メンバの値は、サーフェスのメモリ ピッチ (または、ストライドと呼ばれる) を記述する。ピッチは、2 つのメモリ アドレス間 (あるビットマップ ラインの始点と次のビットマップ ラインの始点) の距離であり、単位はバイトである。ピッチはピクセルではなくバイト単位で測定されるために、640 × 480 × 8 のサーフェスは、異なるピクセル フォーマットの同じディメンジョンのサーフェスよりも非常に異なるピッチの値を持つ。さらに、ピッチの値は DirectDraw がキャッシュとして確保されるバイトを反映することもあるので、単にピッチをピクセルごとにバイト数を掛けた幅であると仮定することはできない。次の図で、幅とピッチにおける違いを説明する。

[Visual Basic]

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

DDSURFACEDESC2 型には、サーフェスが lPitch メンバからどのようにメモリ内に表示されるかという情報が含まれる。lPitch メンバの値は、サーフェスのメモリ ピッチ (または、ストライド と呼ばれる) を記述する。ピッチは、2 つのメモリ アドレス間 (あるビットマップ ラインの始点と次のビットマップ ラインの始点) の距離であり、単位はバイトである。ピッチはピクセルではなくバイト単位で測定されるために、640 × 480 × 8 のサーフェスは、異なるピクセル フォーマットの同じディメンジョンのサーフェスよりも非常に異なるピッチの値を持つ。さらに、ピッチの値は DirectDraw がキャッシュとして確保されるバイトを反映することもあるので、単にピッチをピクセルごとにバイト数を掛けた幅であると仮定することはできない。次の図で、幅とピッチにおける違いを説明する。

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

[C++]

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

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

[Visual Basic]

サーフェス メモリに直接アクセスする場合、ピッチの値が役立つ。たとえば、DirectDrawSurface7.Lock メソッドを呼び出すと、lPitch メンバはサーフェス ピッチとなる。ピクセルごとのバイト数により、サーフェス ポインタをインクリメントしたりデクリメントすることで、左右にピクセルをアクセスできる。また、ピッチの値を現在のサーフェス ポインタに追加したり、もしくはそのポインタから減じたりすると、上下に移動できる。

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

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