今更といえば今更な話なのですが、あまり情報がないようにみえたのでここにメモしておきます。DDSフォーマットの A2R10G10B10 や A2B10G10R10 の並びの画像データについて罠というか、マイクロソフトも承知のバグが潜んでいました。具体的には、チャンネルのマスクビットが逆転しています・・・。
当然ですが、自分でDDSフォーマットを解析して読み込んでいる場合に問題になるようです。D3DXにお任せしてしまっている状況では D3DXがうまくやってくれます(というかバグ持っているのはここなので問題にならないはず)。
A2R10G10B10 のフォーマットでは上位からアルファ2ビット、赤10ビット、緑10ビット、青10ビットと並んでいることを期待しています。ですが、ツール等で書き出すと各チャンネルのマスクが、0xC000000, 0x000003FF, 0x000FFC00, 0x3FF00000 となっています。すなわち赤と青のマスクが逆転しています。(DDSのヘッダ構造体内で dwRBitMask, dwBBitMask といわれている部分)。
DirectX SDK付属のTextureToolで書き出して確認しましたが、2010JuneのSDKですらこの有様でした。
MSDNブログにもこの情報は発見できました。 DDS Update and 10:10:10:2 Problems
周辺のツールの影響から、もう直せはしないみたいなので、このまま対処していくしかなさそうです。そして正しく扱いたかったら FourCCを DX10 として、拡張情報をつけた&対応したDDSの扱いをサポートするようにしてくしかなさそうです。
例外で気持ちは悪いですが、 A2R10G10B10 は内部では A2B10G10R10 として扱い、逆にA2B10G10R10は A2R10G10B10 として処理をするということを求められそうです。ただしDDSを出力するツールをいくつかを確認してみたところ、10bitフォーマットをサポートしているのは DirectX Texture Tool くらいでした。Photoshop PluginもPaint.Net も10bitのフォーマットは書き出すことができないような感じでした。
コメント