DirectXのビルボードについて
Posted: 2012年7月27日(金) 11:51
DirectXで3D空間に2Dの画像を利用したいと考えて、ビルボード(正射影でのポリゴン)を作る事にしました。
(変換済み頂点とは違って、GPUでの行列演算が使用できるのでCPUの使用を抑えられる、また、一々VRAMにアクセスしなくて済むので)
ですが、その際αやRGB等色の設定はどうしたら効率的でしょうか?
自分がぱっと思いついたのがFVFにDIFFUSEを指定しポリゴンの色値を使いLockして、色情報のみ書き換える方法。
が、これだとどうも動作速度が気になります。(これは期待通りに動きました)
そこで、ライト・マテリアル(実際は法線を用意して無いのでライトは使いません。平面ポリゴンだし、無駄を省こうとおもったので)を使ってみようと思ったのですが、
(ちなみに此方も期待通りに動きました)
シェーダーができればライト系統は要らないと聞きました。
つまり、シェーダーを学習すればライト等をシェーダーに任せることが出来るのでしょうか?
また、出来るのであればシェーダーに指定したほうが効率的なのでしょうか?
(将来もう一寸directXに付いて理解できたらシェーダーをやるつもりなので、お願いします。環境依存しないopenglもやりたいなぁ・・・)
それと、またその他に効率的な方法(速度面、メモリ面で)はあるのでしょうか?
ところで、マテリアル構造体は結構サイズがでかいような・・・画像一個ずつに持たせると大変なことに
sizeof(float)*4*4+sizeof(float)=4*4*4+4=68バイト画像百個で6.8k・・・
ワールド変換行列もそこそこ大きいだろうし、
やはり、メモリ節約のために、DXライブラリだとSetDrawBlend()やSetBrite()で一つのマテリアルを指定してたのかな?(描画であればDraw~系でワールド変換していたのかな?ソース見てませんが、そもそもビルボードなのか?これも出来ればお願いします)。
また、ビルボードで、DXライブラリに合ったDrawModiGraph()と同じような関数を作りたいのですが
そのための行列が思いつきません。(平行移動、回転、スケールはわかりますが、自由変換の行列はさっぱりです(自分が思いつかないだけでしょうか?))
この場合はLockして頂点座標を書き換えたほうが良いのでしょうか?
(変換済み頂点とは違って、GPUでの行列演算が使用できるのでCPUの使用を抑えられる、また、一々VRAMにアクセスしなくて済むので)
ですが、その際αやRGB等色の設定はどうしたら効率的でしょうか?
自分がぱっと思いついたのがFVFにDIFFUSEを指定しポリゴンの色値を使いLockして、色情報のみ書き換える方法。
が、これだとどうも動作速度が気になります。(これは期待通りに動きました)
そこで、ライト・マテリアル(実際は法線を用意して無いのでライトは使いません。平面ポリゴンだし、無駄を省こうとおもったので)を使ってみようと思ったのですが、
(ちなみに此方も期待通りに動きました)
シェーダーができればライト系統は要らないと聞きました。
つまり、シェーダーを学習すればライト等をシェーダーに任せることが出来るのでしょうか?
また、出来るのであればシェーダーに指定したほうが効率的なのでしょうか?
(将来もう一寸directXに付いて理解できたらシェーダーをやるつもりなので、お願いします。環境依存しないopenglもやりたいなぁ・・・)
それと、またその他に効率的な方法(速度面、メモリ面で)はあるのでしょうか?
ところで、マテリアル構造体は結構サイズがでかいような・・・画像一個ずつに持たせると大変なことに
sizeof(float)*4*4+sizeof(float)=4*4*4+4=68バイト画像百個で6.8k・・・
ワールド変換行列もそこそこ大きいだろうし、
やはり、メモリ節約のために、DXライブラリだとSetDrawBlend()やSetBrite()で一つのマテリアルを指定してたのかな?(描画であればDraw~系でワールド変換していたのかな?ソース見てませんが、そもそもビルボードなのか?これも出来ればお願いします)。
また、ビルボードで、DXライブラリに合ったDrawModiGraph()と同じような関数を作りたいのですが
そのための行列が思いつきません。(平行移動、回転、スケールはわかりますが、自由変換の行列はさっぱりです(自分が思いつかないだけでしょうか?))
この場合はLockして頂点座標を書き換えたほうが良いのでしょうか?