一部の武器や防具の色変更に使われているカラーパレットですが、検索してもいまいち構造がよく判らなかった為、自分で調べてみました。例によって情弱なだけだったらマジすいません(汗)
コンバットアーマーでの話になります。
※いつもながら勝手な独自研究なので、間違いがあるかもしれません。あらかじめご了承の上でお願いします。
コンバットアーマーのディフューズマップとカラーパレット
モデルに貼られるディフューズマップと、色を変換するカラーパレットの概要について、まずはじめに載せておきます。
コンバットアーマー用ディフューズマップ
胴のディフューズマップ、CombatArmor_Torso_d.ddsです。 実質的に256階調のグレースケール(RGB画像ですけど、便宜的に)と同じだと思います。これがカラーパレットで選択された色に置き換わります。
ポーチ、装甲、ベルト、ボタンの4部位で、グレースケールのレンジが切り離されています。
コンバットアーマー用カラーパレット
コンバットアーマー用のカラーパレット、CombatArmor_palette_d.ddsの実寸大です。128x64ピクセルの小さなテクスチャで、これを参照することでディフューズマップの色を変換しています。LUT(Look Up Table)的な使い方ですかね。
色の基準となるテーブルの為、DXTやBCによる圧縮は避けた方が良いと思います。元々小さいので、30KB程度の節約と引き換えにパレットの色が代表値+計算値になるのはデメリットが大きいかと。バニラは32bit(A8R8G8B8)みたいです。理由は判りませんが、ARGBでないとうまく動いてくれないようです。
カラーパレットの構造
カラーパレットの構造と見方、マテリアルごとに色が変更される仕組みについて。
ディフューズマップとの応答
まず横軸から見ていきます。
128ピクセルが、ディフューズマップのグレースケールに128階調で対応しています。左端の縦列を0(黒)として、右端128個目の縦列が127(白)に相当します。バニラだと128階調ですが、Custom Combat and Synth Armorのように256ピクセル(256階調)にサイズを上げても使えるようです。元のグレースケールに対して単に色相情報を載せるだけでなく、自由に置換え可能みたいです。
ディフューズマップで切り離されているレンジ別に、4部位が対応しています。
つまり、マテリアルごとに横向きに使っていくということになります。
色が変更される仕組み
次は縦軸をメインに。
このカラーパレットは1枚で7パターンの色に対応している為、横向きに使うパレットが縦方向に積まれているイメージになります。赤枠内は、それぞれ縦方向は同じ色です。
例えばマテリアルを"Shadowed"仕様にすると、下から2番目の赤枠のパレットを使います(Standardは一番下)。
※便宜上、Line(ピクセル番号に対応した横軸の意)という言葉を使ってますが、僕の造語です(rowとcolumnで説明するのも解りづらいかな、と)。何か適切な単語があれば、置き換えて読んでくださいませ。
装甲部だけ比較すると、特に緑系の違いが顕著です。
カラーパレットの選択方法
使いたいパレットは、Color Remapping Indexで指定します。このIndexはプラグイン(esm、esp)で設定します。各マテリアルのObject Modificationに項目が有ります。
実際に使うのは、青線(と赤線)で塗ってある1ピクセル幅のLineのみです。つまり、マテリアルごとに128x1ピクセルで切り出した色を参照しています。 この縦幅1ピクセルのLineの置き場所を、Color Remapping Indexで決めています。
例えばShadowed仕様のパレット領域は、Line48~58の11ピクセル幅です。この中に正しく納まるように、Index値が設定されています。
このIndexはちょっと面倒で、縦方向の最終ピクセル(この場合は64個目)をIndex=1として、floatで計算されています。
各マテリアルのIndex値はSSに載せてありますので、参考までに。
Material SwapsにもIndexが設定項目があるのですが、これは正しく動作しないようです。BoS仕様のみこちらの設定が使われています。残念ながらBoS仕様のコンバットアーマーはIndex0.33が反映されておらず、Line0のパレットを読んでいます。結果として錆色のコンバットアーマーになっており、恐らくこれはバグだと思います。
正しいIndexを反映させると、BoS仕様のパワーアーマーと同じく鋼鉄色になるので、こちらが本来の想定ですかね?
次回の記事で実際に修正します。
(おまけ)実験用カラーパレット
興味のある人は、このSSを"CombatArmor_palette_d.dds"としてA8R8G8B8で保存して、コンバットアーマーのテクスチャフォルダに入れてみてください。BoS仕様が真っ赤に、それ以外のコンバットアーマーは全部青になると思います。
この色付きのLine以外を全部黒塗りしても動きます。なので実際は128x7ピクセルのカラーパレットでも、適切にIndexを計算すれば動作すると思います(確認してないですが多分)。
推測ですが、目視確認やIndex計算の利便性の為に、幅を取ってるんですかね?。元々サイズも小さいので、無駄なく納めてもメリット薄そうです。
バニラでは縦64ピクセルですが、Indexの再計算をすればもっと縦に伸ばせます。ただし競合要因になりやすいので(バニラのOMODのIndexを上書きする必要がある為)、伸ばすのはオリジナルのカラーパレットだけにした方がよさそうです。
今回はこんな所で終了です。次回に実際の色変更の実験と、BoS仕様のIndexを正しく反映させるパッチ作成を試します。
続きはこちら