ConvertToIndexedBlendedMesh調査中


先日の状態よりはうまくいくようになったのですが、
使用できるボーンのマトリックスパレット数が少ないときの挙動でどうにも限界が。

問題点

パレット内でのインデックス割り当てのコンフリクトを解消できない。

頂点において、以前使用したときのマトリックスパレットのインデックスと同じにしなくてはならないのですが、
時たまそのインデックスがコンフリクトして3角形を描けない状況へ陥ってしまいます。

例:
頂点1は、インデックス1,3にボーンID 4,5を割り当てて使用
頂点2は、インデックス0,1にボーンID 6,5を割り当てて使用
このときに、インデックス1にボーンID4,5がコンフリクト

本家ConvertToIndexedBlendedMesh関数

どうがんばってみても自力実装での
ConvertToIndexedBlendedMesh関数がうまくできなかったので、
本家のほうを調べてみました。

使用したプログラムはSDK付属のSkinnedMeshです。データはtiny.xを使用。

パレット数 面数 頂点数
26 6841 4474
13 6841 4578
8 6841 4646
4 6841 4903

ちなみにConvertToIndexedBlendedMesh関数を呼び出す前はこんな状態でした。

面数 頂点数
6841 4432

まとめ

どうやら入力時の頂点の数と、変換後の頂点の数は一致しなくてもよいらしい。
当たり前といえばあたりまえだけど、面の数が変わらないという点で、
インデックスデータの長さも変換前後で変化しないということみたい。

自前変換の手順

自前でやっていた内容をメモしておきます。意外と面倒だったりするので…。

  1. そのマテリアルで描けるデータ列(面データ)の頂点を随時処理
  2. このデータ列全て処理が完了したらループを抜けて、次のマテリアルへ。
  3. ある程度パレットが埋まるまで面単位で処理をしてみる。-(A)
    1. 以前に使用されていた場合の、パレット内インデックスを今回に予約。
    2. (このとき以前未使用なら、自由に再割り当てしてOKということで今スキップ)
    3. 今回のパレットがある程度うまったら、再度(A)ループをやり直す
    4. このとき前回はスキップした部分を埋めていく
    5. 未使用のデータについて現在のパレット内での空きを利用して再割り当てを行っていく

という状態で割り当てていったのですが。
自由に割り当てという部分でもうちょっと調停が必要だったのかもしれません。

まとめ

自分のやっていた方法では、変換前後で頂点の数は変化しません。
一方ConvertToIndexedBlendedMesh関数では、前後で数が変化します。

おそらくコンフリクトしたときに、頂点を再生成し現在の状況にあうように変換しているのではないかと考えられます。
この機構をいれれば、変換はうまくいくのではないかと思います。

もうちょっとがんばらないとダメそうですね。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする