Direct3Dテクスチャの単一ピクセルの色を設定するにはどうすればよいですか?
質問
Direct3Dで2D画像をスクリーンに描画しようとしていますが、これはスクリーンを埋めるために投影された長方形のビルボードポリゴンにテクスチャをマッピングすることによって行われる必要があると仮定しています。 (私は興味がありません、またはDirect2Dを使用できません。)SDKで見つけたすべてのテクスチャ情報は、ファイルからビットマップをロードし、そのビットマップを使用するテクスチャを割り当てることを説明していますが、操作する方法をまだ見つけていませんピクセルごとのビットマップとしてのテクスチャ。
本当に欲しいのは次のような関数です
void TextureBitmap :: SetBitmapPixel(int x、int y、DWORD color);
テクスチャオブジェクトにピクセルを直接設定できない場合、ビットマップであるDWORD配列を保持し、そのフレームにテクスチャを割り当てる必要がありますか?
最後に、最初はCPUでこれを行うと想定していますが、ピクセルごとの色の計算はおそらくGPUでも実行できます。テクスチャの単一ピクセルの色を設定するHLSLコード、またはピクセルシェーダーは表示ピクセルの変更にのみ有用ですか?
ありがとう。
解決
まず、直接の質問:
技術的には、テクスチャにピクセルを設定できます。それには、 LockRect および UnlockRect API。
D3Dコンテキストでは、「ロック」とは通常、リソースをGPUメモリからシステムメモリに転送することを意味します(それにより、レンダリング操作への参加を無効にします)。ロックされたら、必要に応じて入力されたバッファを変更してからロックを解除できます。つまり、変更されたデータをGPUに転送します。 一般にロックは非常に高価な操作と見なされていましたが、 PCIe 2.0 はおそらくもう大きな問題ではありません。また、LockRectの2番目の引数として小さな(1ピクセルでも)RECTを指定することで、無視できるデータボリュームのメモリ転送が必要になり、ドライバーがそれだけを転送できるほどスマートであることを期待できます(事実を知っています)古いnVidiaドライバーではこれは当てはまりませんでした。)
それを達成するためのより効率的な(そしてコード集約的な)方法は、GPUから離れることはありません。 RenderTargetとしてテクスチャを作成する場合(つまり、 usage 引数としてD3DUSAGE_RENDERTARGETを指定します。 )、描画呼び出しを行う前にパイプラインの宛先として設定し、シェーダーを記述することができます(おそらくパラメータを渡す))ピクセルをペイントします。このようなレンダーターゲットの使用は標準と見なされており、多くのコードサンプルを見つけることができるはずですが、パフォーマンスの問題に既に直面しているのでなければ、単一の2Dビルボードではやり過ぎです。
HTH。