次の方法で共有


D3DHAL_DP2TEXBLT 構造体 (d3dhal.h)

D3DHAL_DP2TEXBLT構造体は、 D3dDrawPrimitives2 が D3DDP2OP_TEXBLT コマンド トークンに応答するときにテクスチャ blts に使用されます。

構文

typedef struct _D3DHAL_DP2TEXBLT {
  DWORD dwDDDestSurface;
  DWORD dwDDSrcSurface;
  POINT pDest;
  RECTL rSrc;
  DWORD dwFlags;
} D3DHAL_DP2TEXBLT;

メンバー

dwDDDestSurface

宛先テクスチャへのハンドルを指定します。

dwDDSrcSurface

ソース テクスチャへのハンドルを指定します。

pDest

blt を実行するターゲット ポイント、つまり、blt を開始する宛先サーフェス (dwDDDestSurface) 内のポイントを指定します。 POINT 構造体のこれらの x および y メンバーは、画面座標で指定されます。

rSrc

ソース テクスチャ内で blitted する四角形、つまり、ソースサーフェス (dwDDSrcSurface) から blt のソース四角形を指定します。

dwFlags

システムで使用するために予約されています。

注釈

D3dCreateSurfaceEx コールバックは、テクスチャ blts のソース テクスチャと宛先テクスチャとして使用できるテクスチャに対する小さな整数ハンドルを作成します。

D3DHAL_DP2TEXBLT構造体は、D3DDP2OP_TEXBLT コマンド ストリーム トークンと共に使用され、ソース テクスチャから宛先テクスチャへの blt 操作を実行するようにドライバーに通知します。 テクスチャは、立方環境マップにすることもできます。 ドライバーは、ソース テクスチャの rSrc で指定された四角形を、コピー先テクスチャの pDest で指定された場所にコピーする必要があります。 宛先テクスチャとソース テクスチャは、テクスチャの作成時にドライバーに通知されたハンドルによって識別されます。 ドライバーがテクスチャを管理できる場合は、宛先ハンドルが 0 である可能性があります。 これは、テクスチャをビデオ メモリ (またはハードウェアの効率的なテクスチャの場所) に事前に読み込む必要があることをドライバーに示します。 この場合、ドライバーは rSrcpDest を無視できます。

MIP マップテクスチャの場合、 D3dDrawPrimitives2 コマンド ストリームに挿入されるD3DDP2OP_TEXBLT命令は 1 つだけであることに注意してください。 この場合、ドライバーはテクスチャに存在するすべての MIP マップ レベルを blt することが期待されます。 MIP マップ サブレベルでコピーする領域は、各レベルで rSrcpDest を 2 で除算することで取得できます。

ソース テクスチャとターゲット テクスチャに異なる数の MIP マップ レベルが含まれている可能性があります。 この場合、ドライバーは共通レベルを blt することが期待されます。 たとえば、256 x 256 のソース テクスチャに 8 つの MIP マップ レベルがあり、宛先が 6 レベルの 64 x 64 テクスチャの場合、ドライバーはソースから 6 つの対応するレベルを blt する必要があります。 ドライバーは、移行先テクスチャの最上位 MIP レベルのディメンションが、ソース テクスチャの最上位 MIP レベルのディメンション以下であることが常に予想されます。

ソース ハンドルと変換先ハンドルは常に最上位のサーフェスを参照し、MIP マップ サブレベルは参照しません。 アプリケーションでエラーが発生したため、ターゲット テクスチャに追加の MIP マップ レベルが含まれている可能性があります。 たとえば、ソース 256 x 256 テクスチャには 5 つのレベルが含まれる場合がありますが、変換先の 256x256 テクスチャには 8 個が含まれる場合があります。 ドライバーは、このケースを安全に処理することが期待されますが、正しい結果が生成されるとは思われません。 レガシ アプリケーションの互換性の問題により、Direct3D では、このようなソースと宛先のテクスチャのペアがドライバーに渡されるのを妨げることはありません。

ドライバーは、ソーステクスチャとターゲットテクスチャのピクセル形式が同一であることを期待でき、一般に、指定された blt は安全に実行できます。 上記の 1 つのケースを除き、ドライバーは、blt を実行することが不可能な状況で提示されることを期待しないでください。

ドライバーがシステム メモリからビデオ メモリへの非同期 blts を実行する場合は、DirectDraw HAL 呼び出し GetSysmemBltStatus を実装する必要があります。そうしないと、不整合が発生する可能性があります。

TexBlt では、TexBlts は常にレンダリング コマンドと共に適切な順序で発行されるため、ドライバーが同期を実行する必要はありません。 この前は、DirectDraw blt が Direct3D コンテキストのレンダリング コマンドによって参照されたテクスチャを変更したときに、ドライバーがケースを正しく処理する必要がありました。 複数のコンテキストが存在する場合、Direct3D は TexBlts を発行しません。 つまり、ドライバー ライターは、TexBlt コード パス内の同期コードを省略できます (ただし、blts の同期が必要です)。

サンプル

次の擬似コードは、MIP レベル i から MIP レベル i + 1 に移動するために、連続する MIP レベルに対してサブrectangleを計算する方法を示しています。

rect.left >>= 1; 
rect.top >>= 1; 
DWORD right = (rect.right + 1) >> 1; 
DWORD bottom = (rect.bottom + 1) >> 1; 
rect.right = ((right - rect.left) < 1) ? 
    (rect.left + 1) : (right); 
rect.bottom = ((bottom - rect.top ) < 1) ? 
    (rect.top + 1) : (bottom);

要件

要件
Header d3dhal.h (D3dhal.h を含む)

こちらもご覧ください

D3DDP2OP_TEXBLT

D3dCreateSurfaceEx

D3dDrawPrimitives2