jaijai’s blog

Cities Skylinesアセット作成に関するメモ・考察

Cities Skylinesとテクスチャ圧縮

テクスチャの種類

  • ディフューズマップ(_d)
  • スペキュラマップ(_s)
  • ノーマルマップ(_n)
  • アルファマップ(_a)
  • カラーマップ(_c)
  • イルミネーションマップ(_i)

これはCities Skylinesのアセットに含まれるテクスチャの種類です。これらがDXT1フォーマットにより圧縮された状態で保存されています。

DXT1圧縮

その昔、S3社がS3TC(S3 Texture Compression)として開発した圧縮フォーマットがそのままDirectXに採用されました。それがDXTnです。DXTnはDXT1からDXT5まであり、DXT1はRGB用とされる3チャンネルのデータを扱います。

DXT1では4x4の16ピクセル単位で扱います。4x4の中から代表となる2色を決めて残りはこの2色を混ぜ合わせます。これにより1/6に圧縮され展開も超高速です。詳しくはぐぐると解説がたくさん出てきます。

欠点として、2つの代表色では表現しきれない場合、結果的に近傍の色に取り込まれる色が生じます。アニメ調の画像では隣り合う色が全く異なる場合がしばしばあり、その結果4x4のブロックノイズが出現します。また、代表色も16ビット(RGB565)で保持されるため色情報も粗くなります(通常のソースはRGB888の24ビット)。

CSLの各テクスチャは3つのDXT1に振り分けられています。ModToolで見ると3つのテクスチャを確認できます。

ModToolから見た各テクスチャ

MainTexは_dのRGB3チャンネル、XYSMapは_nの2チャンネルと_sの1チャンネル、ACIMapは_a_c_iのそれぞれ1チャンネルが含まれています。

互いに干渉するXYSmap

ノーマルマップとスペキュラマップをまとめたXYSmapでは圧縮による劣化により互いに干渉します。同様のことはACIMapでも起こりますがテクスチャの使用頻度が低いので問題が表面化することはあまりありません。

次の画像はテスト用アセットを作成しダンプしたものです。

互いに残像のような跡が残っているのがわかります。もちろん元画像には存在しません。

先のテストアセットのゲーム内での見栄えです。

スペキュラマップ→ノーマルマップへの干渉ではライティングの状況次第ですが影響がはっきりと見て取れます。ノーマルマップ→スペキュラマップへの干渉も探せばわかりますが前者ほどは目立ちません。ノーマルマップはわずかでも傾斜がある部分はライティングにより明瞭に差が出ます。

圧縮による劣化を防ぐには

基本的には防げません。逃れられません。テクスチャ解像度を上げればそれだけ目立ちにくくはなります。

UVマップを数ピクセルずらす方法


先のテストアセットをダンプしたノーマルマップを拡大したものです。右下部に盛大に4x4のブロックが発生しています。しかし上部ではほぼブロックが出現していません。


DXT1の4x4ブロックの境界線を描いてみました。上部では ┛と┗ 部分がちょうど違うブロックに分かれています。これにより代表色不足に陥らず劣化が抑えられています。

どうしても許せないブロックノイズが出現した場合、UVマップを数ピクセル動かすことで該当ブロックの発生を抑えることが出来ます。しかし動かすことで他の箇所にブロックが出現する可能性もあります。

DXT1以外を使えばよいのでは?

ここからは小話です。DXT1の他にDXT2~5がありますが圧縮方法は全く同じです。DXTnが登場したのはDirectX6の時代で、確認したところ20年前ですが、最新のDirectXでもBC1~BC3と名前が変わり実質的にDXTnは使い続けられています。BC7という高画質とされる圧縮もありますが圧縮効率は半減するので常にビデオメモリが枯渇するCSLでは難しそうです。また、1チャンネル向けのBC4、ノーマルマップ向けのBC5を使えば干渉は解決できそうです。もっとも、それらを使えるようにするにはゲームを大幅に改造することになるのでMODで対応できる範疇を超える可能性が高いです。