5

Direct3D で画面に 2D 画像を描画しようとしていますが、これは、画面いっぱいに投影された長方形のビルボード ポリゴンにテクスチャをマッピングすることによって行う必要があると想定しています。(私は興味がないか、Direct2D を使用できません。)SDK で見つけたすべてのテクスチャ情報は、ファイルからビットマップをロードし、そのビットマップを使用するテクスチャを割り当てることを説明していますが、まだ操作する方法を見つけていません。ピクセルごとのビットマップとしてのテクスチャ。

私が本当に欲しいのは、次のような関数です

void TextureBitmap::SetBitmapPixel(int x, int y, DWORD color);

テクスチャ オブジェクトにピクセルを直接設定できない場合、ビットマップである DWORD 配列を保持してから、すべてのフレームにテクスチャを割り当てる必要がありますか?

最後に、最初はこれを CPU で行うことを想定していましたが、ピクセルごとの色の計算もおそらく GPU で行うことができます。テクスチャ内の単一ピクセルの色を設定する HLSL コードですか、それともピクセル シェーダーは表示ピクセルの変更にのみ役立ちますか?

ありがとう。

4

1 に答える 1

5

まず、あなたの直接の質問:

技術的には、テクスチャにピクセルを設定できます。これには、 LockRectおよびUnlockRect API を使用する必要があります。

D3D のコンテキストでは、「ロック」は通常、リソースを GPU メモリからシステム メモリに転送することを指します (それにより、レンダリング操作への参加を無効にします)。ロックしたら、必要に応じて入力されたバッファーを変更し、ロックを解除できます。つまり、変更されたデータを GPU に転送します。一般に、ロックは非常にコストのかかる操作と考えられていましたが、PCIe 2.0以降はおそらく大きな問題ではなくなりました。小さな (1 ピクセルでも) RECT を LockRect の 2 番目の引数として指定することもできます。これにより、ごくわずかなデータ量のメモリ転送が必要になります。ドライバーが実際にそれを転送するのに十分なほどスマートであることを願っています (私は事実を知っています)。古い nVidia ドライバーでは、これは当てはまりませんでした)。

それを達成するためのより効率的な (そしてコード集約的な) 方法は、実際には GPU を決して離れないことです。テクスチャを RenderTarget として作成する(つまり、D3DUSAGE_RENDERTARGET を使用引数として指定する) 場合、描画呼び出しを行う前にそれをパイプラインの宛先として設定し、シェーダーを記述して (おそらくパラメーターを渡す)、ピクセルをペイントすることができます。 . このようなレンダー ターゲットの使用は標準と見なされており、多くのコード サンプルを見つけることができるはずですが、既にパフォーマンスの問題に直面していない限り、単一の 2D ビルボードではやり過ぎだと思います。

HTH。

于 2009-05-04T06:39:21.890 に答える