ミップマップに対応する

 ミップマップに関する作業をしました。ミップマップ生成では、テクスチャの未使用領域に対する特別な対応をしたいものです。また、色のテクスチャと法線マップには、それぞれ異なるミップマップの演算方法が適しています。

作業の経緯

 SculptrisにはUV展開と3Dペイントがあり、テクスチャと法線マップが作成できます。なかなか実用的です。

 ならばと、先日のリンゴやオレンジのモデルをUnityへ持ってみると、UV展開の継ぎ目が見えてしまうという問題に遭遇します。

 これは単純なアルゴリズムで生成されたミップマップが利用された結果です。Sculptrisから得られるテクスチャの未使用領域は、適当な色で埋められています。これにより、ある程度ミップマップレベルが上がると、この適当な色を含んで計算されたテクセルが可視化されてしまうことが問題となります。
※消極的な対策方法は、ミップマップを抑制してしまう方法です。しかし、これではミップマップによる利点を捨てることになります。

 そうではなく、これを本格的に解決するには、良質なミップマップを生成する必要があります。
 そんなこともあって、Silverlight 5 BetaによるXModelビューアで、手を付けていなかったミップマップ生成に対応することにしました。
 なかなか生成結果が期待通りにならないので、DDS(DirectDrawSurface)形式の処理を加え、ミップマップ生成後の画像を出力する機能をつけてみることにしました。エクスポートしたDDSファイルが「DirectX Texture Tool」で狙い通りのものになっても、テクスチャが正しくならなかったことから、現行ベータ版のTexture2D.SetDataメソッドのstartIndex引数に不具合があるという結論に至りました。幸いにも、効率を無視すれば回避可能なものだったので、XModelビューアのミップマップの初期対応はひとまず完成しました。

 ということで、今日のまとめは…

個人的な各ツールへの要望など

Sculptris Alpha 5 テクスチャ画像の未使用領域を透明にしてほしい。
Unity 3.3.0f4 DDS形式のサポートを強化してほしい。DDS形式の場合、法線マップを示すのチェックボックスがないので、上記のようなミップマップ生成を行っても利用できない(現在の理解)。
Silverlight 5 Beta Texture2D.SetDataメソッドの修正に期待。VertexBuffer.SetData/VertexDeclaration周りにも不具合がある可能性を感じている。