過去の独りごち/独りごとはこちら
過去のJavaアプレットは
こちら

 

9/21 時間の無駄だって

 今回の内容はきちんと読まないと要らぬ混乱を招く内容かもしれませんよ。

 ん〜

 なんとかTSXMeshに格納されている頂点フォーマットを可変にしました。そして、ようやっと光源計算なしの物体を正しく表示できるようになりましたとさ(^^;)

 光源計算ありの物体のほうが、光源計算なしの物体よりも簡単に描けたというのが我ながら、イヤな意味で物凄いなぁ…と思うことしきりです。

 また、それに伴って、SXファイル形式を拡張し、SXFファイル形式を考えました。SX Flexible というわけで。DXFとは何も関係ないです。数値演算プロセッサが抜いて合ったりはしません(何?

 でも、ファイル構造がフレキシビリティに富んだ厄介な構造なのではなく、格納される頂点フォーマットがフレキシブルなんですね。フォーマットとしては…

name      | ofs | size | comment
-------------------------------------------------------------------------
Signature | 0   | 16   | 'Simplified_X01 '
nVextices | 16  | 2    | number of vertices
nIndices  | 18  | 2    | number of indices for vertices
dwFVF     | 20  | 4    | flags for flexible vertex format
VertexSize| 24  | 4    | required bytes per vertex

Vertices  | 256          | VertexSize * nVertices | vertices
Indices   | 256+Vertices | 2 * nIndices           | indices for vertices

 う、表組みがズレてて申し分けない。でも、とても簡単で、DirectXにベタベタに依存してて、将来FVFに関する定数が変わったら使えなくなります(ぉ

 将来FVFに関する定数が変わったらもう使えなくなっちゃうのは痛いかもなので、そこはちょっと考えたほうが良いかもしれませんが、とにかく簡単です。

 また、新しいSXLibでは、古いSXファイルもそのまま読み込めます。単にdwFVFとVertexSizeにデフォルト値を設定すればいいだけの話なので、ラクチンでした。

 

 しかし、ただ単に光源計算を省くためになんでこんなに苦労したかというと…

 D3DRENDERSTATE_LIGHTINGにFALSEを指定するだけだと、テクスチャも何も貼られない、白いポリゴンになってしまうんですね。仮にDiffuseに白以外が設定されていても、白です。これやいかに…?

 DirectX7 SDKによると、IDirect3DVertexBuffer7.ProcessVerticesをつかいなはれと書いてあったのですが、それ使っても全く効果なし。白いまんまでしたm(__

 そういうわけで、D3DLVERTEXを頂点データに持つTSXMeshを作ってやり(SXSimplifyを拡張した)、それをレンダリングさせる事で解決しました。うう〜、疲れた!

 …ところが

 実は頂点のspecular要素に白を指定してただけという事実が↑まで実行した時点で明らかになり、僕が真っ白になってしまいました(ヒュー SXVertexには、Specularがあるのさ…すっかり忘れてたよ(ぉ

 

 気を取り直して、残っている

  • DCではハードがやってくれちゃう、半透明体のソート
  • 環境マップ
  • レイピック

 の実装をとっととやっちまいますか!

 頂点フォーマットがフレキシブルになったので、もうマルチテクスチャだろうがトゥーンシェーディングだろうがワンスキン処理だろうが実装できます。できるかもしれんけどさ。その労力は誰が支払うのさ。

 ヲレさm(__

 ともかく、大変だったけど夢の膨らむ一日でした。

 

Taku Hayase(SANDMAN)

戻る