2008年3月9日日曜日

blender - ファイルフォーマットを書き換えたい(10)

ここからは、BlenderというかDirectXの話になってくるので、向こうのブログに書こうかと思ったけど、
続きが分散するのは良くないってことでこっちに。

まず、手持ちの本(3D格闘ゲームプログラミング)によると、マテリアルの切り替えコストが結構かかるので、マテリアル毎にまとめて描画するのが通常らしい。

さらにDirectXの描画関数 DrawIndexedPrimitive は、パラメータで頂点バッファと(面の)インデックスバッファを指定できるようだ。指定できるんだから細かく指定したほうが早いはず。

つまり、
・マテリアル順に面のインデックスをソート
・その面の順に頂点座標と頂点カラーと法線をソート
・それぞれの要素に、要素数を含める。
・マテリアル毎にsubsetとして「面の開始index」「面数」「頂点の開始index」「頂点数」を含める。
・あとは必要なもの(色とかテクスチャ)をsubsetに突っ込む。


以上を考慮すると、こんな感じの構造になる。

<object name="">
  <vertex size=""> ... vertex list ... </vertex>
  <face size=""> ... face list ... </face>
  <normal size=""> ... normal list ... </normal>
  <col size=""> ... vertex color list ... </col>
  <subset firstvertex="" vertexcount="" firstface="" facecount="">
    <color r="" g="" b="" />
    <texture name="filename" />
  </subset>
</object>

まだアニメーションまで頭が回ってないが、この構造で出力できれば、とりあえず比較的楽に読み込め、高速(?)に描画できるはずだ。

で、早速Javaでジャバジャバ打ち込み、1000行弱ほど書いた。SAXで読み込んだので細かいところでバグが出まくって非常に疲れた。コピペ万歳な、かなり泥臭いプログラムを書いた気がする。

↓頂点とか


↓サブセット



余り試してないのでエラーで落ちる可能性大ですが、
↓作ったコンバーター(10KB。動作環境Java5以上)
http://render.jp/blender/xmlconverter01.jar

起動するとファイル選択の窓が出てきて、昨日うpしたBlenderで吐いたxmlを開く。
成功したら同じディレクトリにファイル名_.xmlが出来る。

0 件のコメント: