2009-05-04 15 views
4

私はDirect3Dの画面に2D画像を描画しようとしています。これは、画面を埋めるように投影された長方形のビルボードポリゴンにテクスチャをマッピングする必要があると仮定しています。 (私は興味がありませんし、Direct2Dを使用することもできません)SDKで見つかったすべてのテクスチャ情報は、ファイルからビットマップを読み込んでそのビットマップを使用するテクスチャを割り当てることについて説明していますが、ピクセル単位でビットマップとしてのテクスチャ。Direct3Dテクスチャ内の単一ピクセルの色を設定するにはどうすればよいですか?

私はあるDWORD配列の周りに維持する必要があります、テクスチャオブジェクトに直接ピクセルを設定することができない場合は私が本当に欲しいことは、このような

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

としての機能でありますビットマップを作成し、そのフレームにテクスチャを割り当てますか?

最後に、私が最初にCPU上でこれを行うと仮定していますが、ピクセル単位の色の計算はおそらくGPUでも行うことができます。テクスチャ内の1つのピクセルの色を設定するHLSLコードか、ピクセルのシェーダは表示ピクセルの変更にのみ有効ですか?

ありがとうございました。

答えて

4

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

あなたは、技術的には、テクスチャのピクセルを設定することができます。それには、LockRectUnlockRect APIを使用する必要があります。

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

これを達成するための効率的(コード集約的)な方法は、実際には決してGPUを離れることではありません。レンダーターゲットとしてcreate your texture(つまり、usage引数としてD3DUSAGE_RENDERTARGETを指定した場合)、描画呼び出しを行う前にパイプラインの宛先として設定し、ピクセルをペイントするシェーダー(おそらくpassing parameters)を記述します。このようなレンダリングターゲットの使用は標準と考えられています。多くのコードサンプルを見つけることができるはずですが、パフォーマンスの問題に直面している場合を除き、1つの2Dビルボードには過度の負荷と言えます。

HTH。

関連する問題