古いDirectXのコードをいじる必要があって8とか7を使っています。
件名のとおりバックバッファを空のテクスチャサーフェスに転送して
そのテクスチャで有効にPrimitive描画したいと思っています(要するにバックバッファの内容をテクスチャにしたい)。
ですがテクスチャサーフェスとして作成してしまうとバックバッファからBlt転送する時に
既にうまく転送されていないようです…(真っ黒になってしまう)
ちなみにテクスチャサーフェスではなく普通のサーフェスとして作成すれば
通常のDirectDrawSurface::Bltでうまく転送されているようです。
Blt自体がテクスチャに対応していない感じがします。
上記のBltを止めてそれぞれのサーフェスからHDCを取得しWinAPIのBitBlt等でも行ってみましたが
やっぱり無理なようです。
バックバッファからテクスチャサーフェスに有効に転送して
最終的にDrawPrimitive()で描画したいので、どうしてもテクスチャサーフェスに有効に転送できるようにしたいです。
何か良い方法はありますでしょうか?
DirectXでバックバッファの内容をテクスチャサーフェスに転送したい
Re: DirectXでバックバッファの内容をテクスチャサーフェスに転送したい
バックバッファの内容を直接テクスチャサーフェスに転送する手段はありません。
まずシステムメモリを使用するオフスクリーンサーフェスにバックバッファの内容をBitBltやBltFast転送して、
そこからテクスチャサーフェスに転送する必要があります。
システムメモリを使用するオフスクリーンサーフェスからテクスチャサーフェスへの転送もBlt等は使用できませんので、
お互いをLockして地道に1ピクセルづつシステムメモリ上のオフスクリーンサーフェスから読み取り、
テクスチャサーフェスへ書き込む必要があります。
想像できると思いますがこの処理は非常に重いです。
なのでレンダリングターゲットにできるテクスチャサーフェスを作成して、それに対してレンダリングを行い
それをテクスチャとして使用する方がずっと楽で、処理も高速です。
まずシステムメモリを使用するオフスクリーンサーフェスにバックバッファの内容をBitBltやBltFast転送して、
そこからテクスチャサーフェスに転送する必要があります。
システムメモリを使用するオフスクリーンサーフェスからテクスチャサーフェスへの転送もBlt等は使用できませんので、
お互いをLockして地道に1ピクセルづつシステムメモリ上のオフスクリーンサーフェスから読み取り、
テクスチャサーフェスへ書き込む必要があります。
想像できると思いますがこの処理は非常に重いです。
なのでレンダリングターゲットにできるテクスチャサーフェスを作成して、それに対してレンダリングを行い
それをテクスチャとして使用する方がずっと楽で、処理も高速です。
Re: DirectXでバックバッファの内容をテクスチャサーフェスに転送したい
すみません、一部説明に誤りがありました
バックバッファの内容を転送したシステムメモリを使用するオフスクリーンサーフェスからテクスチャサーフェスへ
転送する際にお互いをLockすると書きましたが、テクスチャサーフェスがDDSCAPS2_TEXTUREMANAGEフラグ付きで
作成されていない場合はLockすることができません
その場合はテクスチャサーフェスと同じフォーマットのシステムメモリを使用する(DDSCAPS_SYSTEMMEMORYフラグ付きの)
テクスチャサーフェスを作成し、まずバックバッファの内容を転送したシステムメモリを使用するオフスクリーンサーフェス
からシステムメモリを使用するテクスチャサーフェスへ内容を転送した後(ここではお互いをLockして1ピクセルづつ転送)
システムメモリを使用するテクスチャサーフェスからテクスチャサーフェスへの転送にはIDirect3DDevice7のLoadを使用します
バックバッファ
↓
↓HDCを使用したBitBltまたはIDirectDrawSurface7のBltFast
↓
システムメモリを使用するオフスクリーンサーフェス
↓
↓お互いをLockして1ピクセルづつ読み出し、書き込み
↓
システムメモリを使用するテクスチャサーフェス
↓
↓IDirect3DDevice7のLoad
↓
テクスチャサーフェス
バックバッファの内容を転送したシステムメモリを使用するオフスクリーンサーフェスからテクスチャサーフェスへ
転送する際にお互いをLockすると書きましたが、テクスチャサーフェスがDDSCAPS2_TEXTUREMANAGEフラグ付きで
作成されていない場合はLockすることができません
その場合はテクスチャサーフェスと同じフォーマットのシステムメモリを使用する(DDSCAPS_SYSTEMMEMORYフラグ付きの)
テクスチャサーフェスを作成し、まずバックバッファの内容を転送したシステムメモリを使用するオフスクリーンサーフェス
からシステムメモリを使用するテクスチャサーフェスへ内容を転送した後(ここではお互いをLockして1ピクセルづつ転送)
システムメモリを使用するテクスチャサーフェスからテクスチャサーフェスへの転送にはIDirect3DDevice7のLoadを使用します
バックバッファ
↓
↓HDCを使用したBitBltまたはIDirectDrawSurface7のBltFast
↓
システムメモリを使用するオフスクリーンサーフェス
↓
↓お互いをLockして1ピクセルづつ読み出し、書き込み
↓
システムメモリを使用するテクスチャサーフェス
↓
↓IDirect3DDevice7のLoad
↓
テクスチャサーフェス
Re: DirectXでバックバッファの内容をテクスチャサーフェスに転送したい
ご回答、ありがとうございます!!
なるほどです!やはりバックバッファの内容をBlt等で直接テクスチャサーフェスへ転送する手段は無いのですねえ。
仰るようにレンダリングターゲットに出来るテクスチャサーフェスを作成してから
そこにレンダリングを行ってそれをテクスチャにする方法が一番現実的だと思いました。
具体的内容としては、鏡面反射のような事が行いたくて
反射させるオブジェクトの位置から見たカメラアングルでレンダリングした内容を
反転させてそのオブジェクト位置へステンシルバッファの機能を使って描画するつもりです。
一つレンダリングターゲットに出来るテクスチャサーフェスを作っておいて
それを鏡面反射用に使えるようにしておけば実現できそうです。
これで大丈夫そうでしょうか?
なるほどです!やはりバックバッファの内容をBlt等で直接テクスチャサーフェスへ転送する手段は無いのですねえ。
仰るようにレンダリングターゲットに出来るテクスチャサーフェスを作成してから
そこにレンダリングを行ってそれをテクスチャにする方法が一番現実的だと思いました。
具体的内容としては、鏡面反射のような事が行いたくて
反射させるオブジェクトの位置から見たカメラアングルでレンダリングした内容を
反転させてそのオブジェクト位置へステンシルバッファの機能を使って描画するつもりです。
一つレンダリングターゲットに出来るテクスチャサーフェスを作っておいて
それを鏡面反射用に使えるようにしておけば実現できそうです。
これで大丈夫そうでしょうか?