- 888 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 01:00:29.65 ]
- MMDの場合、MMEを見ればわかると思うが頂点のスキニングはCPUでやって
スキニング済みの頂点をGPUに送りそこでワールドビュープロジェクション変換してる MMMの場合はサンプルのfxmを見る限りGPUでのスキニングでvs_3_0と書いてあるのでその制限の中でやっているのだろう とりあえずシェーダーのセットアップが必要なマテリアル単位で 使っているマトリクス(ボーン)数だけを送ることになるんだろうけど もちろんそれでも想定したレジスタ数を超えることがあるので それが超えないようにプリミティブを分けて複数回の転送&描画が必要になる。 この分け方はまぁ自分で考えて。 例に出てる頂点宣言のORIGINAL_VERTEXだけど プリミティブを分ける以上 隣り合った三角形が必ず同じ描画になるというわけないので 一つの頂点に indexInShader が一つにするのは至難の業になるかもしれず。 じゃぁブレンドインデクスはストリーム分けてってのはかなりのメモリが無駄になるような気もするので 分けた後の描画数分のVertexBufferとIndexBufferおよび Matrixの元インデックス→シェーダーに送るインデックステーブルを生成するのが手っ取り早いと思う 頂点モーフやUVモーフがあるので生成した頂点に元の頂点インデックスを知る手段もなにかしらで生成。 でindexInShaderだけどどうせ256以内に収めるんだしD3DDECLTYPE_UBYTE4のunsigned char indexInShader[4]でいいんじゃないかな? [4]って書いたのは.pmxのBDEF4のため。 SDEFをやるならVECTOR3のC、R0、R1も追加。 あとスキニングなら回転(拡縮)と移動だけなので転置して1列削れば floatの数が12個なので1ボーンあたり3レジスタ分でいけてお得
|

|