テクスチャを環境にあわせてリサイズしよう、という話を前回はしましたので、次は圧縮です。リサイズしても圧縮の方法がわからないと、セーブができませんよね。という訳で、用途別に分けた圧縮方法を考えて生きたいと思います。
今回はテクスチャの圧縮についての理屈まとめなので、リサイズは別にどうでもいい、という人は、この記事だけ読んでも大丈夫です。
CTD対策でテクスチャ容量を減らしたい、という人で、リサイズの記事を読んでない場合は、下のリンクからどうぞ。
テクスチャを圧縮する意味
非可逆圧縮なので、ある程度の画質は損なわれます。よほどのアップで見ない限りは気にならないですが。
なのに何故圧縮するかと言えば、非圧縮だと効果の割に負荷が大きすぎるという点につきます。割に合わないってことですね。
ファイルサイズが大きければメモリ沢山使います(VRAMだけでなくメインメモリも)。結果、転送速度にも影響するので重くなります。物理メモリ使い切ればスワップ発生しますし、メインメモリ4GB使い切ればCTDします(ENBoostで大半は回避可能ですが)。
いいこと無いですね。これでFPS下がりすぎたりCTD連発しては本末転倒です。どれだけマシンパワー有ってもSkyrimには膨大な数のオブジェクトがあるので、チリツモ効果で襲ってきます。戦いは数だ、兄貴!
ちなみに装備リテクスチャで有名なaMidianBornシリーズでも、ゲーム最適化のための圧縮がされています。非圧縮なら綺麗とは限りません。マシンパワーを最大限使い切るにも、テクスチャサイズの最適化は勿論、圧縮も非常に大切です。
Skyrimのテクスチャのフォーマット
.dds(DirectDrawSurface)は、画質やサイズでみた場合にはJPEGに劣ってますが、展開せずに処理できるというメリットがあります。静止画では微妙ですけどゲームには向いているという訳ですね。
圧縮方式であるDXTC(DirectXTextureCompression)のうち、SkyrimではDXT1、DXT3、DXT5が使えます。(2と4はアルファチャネルの扱いから、使えない気がしますが、もし使えたらすいません)
DXT1、3、5の違いは、このアルファチャネルの扱いだけです。カラー部分に関しては同じです。DXT5の方が容量大きいからといってDXT1より画質が良い訳ではありません。
アルファチャネル
アルファチャネンネル、とも。(年寄りのエンジニアはチャネルって言うんです・・・)RGBに加えて「透過」を表現するためのチャネルです。アルファチャネルが入っているときは「ARGB」とか書きます。真っ白なら何も影響せず、真っ黒なら透明にします。中間のグレー度合いで透明度が作れます。氷とか、半透明系の装備のテクスチャにはいってます。
自分で新規に透明つくる場合は、メッシュファイルにもAlphaPropatyが必要です。
アルファチャネルが有るか無いかは、開いて見れば分ります。下はPhotoshopの例です。GIMPでも見られます。
こんなかんじでアルファチャネルがいます。たまに全部真っ白で使ってないアルファがついてるテクスチャがありますが、その場合は切ってしまいましょう。
Transparent and refracting Glass Eqmnt CBBE UNP UNPBの盾をSkyrim内での比較に使いました。
※比較画像は男ですので期待しないでください
オリジナルです。A8R8G8B8の無圧縮で配布されています。1Kテクスチャで5.33MBです。
※無圧縮でのMOD配布が悪い訳ではありません。むしろ綺麗な無圧縮で配布してくれることに感謝しましょう。あとはPCと相談して各自で圧縮するのが良いかと思います。
DXT1
4x4ピクセルの区画が、DXTCの最小単位になります。16bitカラー(R5G6B5 人間の目は緑に敏感らしいです)で代表2色を最初に決めて、中間色2色をそこから生成、計4色。上の図はaMidianBorn SteelArmorから拾った1区画です。4x4の16ピクセルが、4色で表現されています。
この4x4ピクセルで4色というルールが、DXT1,3,5で共通です。
データサイズは、16bitカラーx2で32bit(あとの2色は計算で作る)、4パターンを示す2bit(00、01、10、11)が、16マスを埋めるので、2x16=32bit。合計すると、16ピクセルで64bit=8byteになります。
無圧縮だと24bitカラーx16マスで384bit=48byte。DXT1は容量1/6ですね!
アルファチャネルは一応対応していて、使う場合はA1R5G5B5。アルファ1bitなので、「消す」か「消さない」かしか設定できません。半透明は無理です。
※DXT1はアルファチャネル無い、と良く書かれてますけど、1bitありますよね?グリーン削って。でもPhotoshopで開くとチャネルはあるものの、元画像に乗算されて消されてるので、厳密には「チャネル」じゃないって意味でしょうか。致命的な勘違いしてたら、教えて頂けるとありがたいです。
この盾をDXT1で圧縮して、Skyrimを起動してみると、こうなっちゃいます。
透明が無くなってます。ただし容量は一気に減って683KB。アルファ分も圧縮しているので1/8です。すくな!アルファ無いならこれで十分な気がします。
1bitアルファを真っ黒にしたDXT1。透明部分が完全に無くなってます。屈折の効果は残ってますが、これはテクスチャではないので。容量は同じ683KB。元のディフューズマップに透過部分が書き込まれているので元に戻せません。
DXT5
DXT3を飛ばします。アルファを有効に使うには、Skyrimではほとんどこっちで良いかと思いますし。
説明しました通り、カラー部分はDXT1と同じなので省略して、アルファからいきます。
これもaMiddianBornから4x4ピクセル抜いてきました。8bitグレースケール(256階調)で代表2色を最初に取ります。このあと生成する中間色の数は、カラー部分が2色に対して、アルファは6色作ります。計8色です。ただし完全真っ黒(消える)、完全真っ白(何もしない)が有る場合は、黒、白を確保した上で、最初の2色+4色作成の、計8色になるみたいです。上のマス目にはどちらも無いので、8色作られています。
8パターンの不透明度を作れるので、綺麗な透過表現ができます。その代わり、カラー部64bitに加えて、代表8bitx2=16bit、8パターンを示す3bitが16マスを埋めるので48bit。全部足すと64+16+48=128bit=16byteです。DXT1の2倍の容量になります。アルファ部分で容量が2倍になっているので、透過の無いテクスチャをDXT5で圧縮しても無意味ということです。
盾をDXT5で圧縮して、Skyrimを起動すると、こんなかんじです。
綺麗に透明になってます。無圧縮と比べてもさして劣化してないんじゃないでしょうか。容量は1.33MB。DXT1の2倍ですが、無圧縮と比べると1/4です。
DXT3
DXT3はDXT5に似ているのですが、アルファの作り方が違います。DXT5は代表値2個を取ってから中間色を作るのに対し、DXT3は決まった16色(黒白間の16階調)からしか選べません。その代わりDXT5のような8色縛りが無く、4x4ピクセルの中に16色置くことも可能です。データサイズはカラー64bitに加えて、16パターンを示す4bitが16マスを埋めるので4x16=64bit。あわせて128bit=16byte。DXT5と同じ容量です。
8色制限が無いので、万が一4x4ピクセルの中に16色使い切ることがあれば、すごいグラデーションができますけど、まず有りえないですよね。実際には固定された16階調なため、近い色がすべて同一色になってしまうので、エッジの効いた感じの絵になると思います。
aMidianBornSteelArmorのアルファ部の比較です。肩のファーっぽいところです。それぞれの右上を見ると分りやすいと思います。DXT5ではグラデーションができているのに対して、DXT3は単一色での塗りつぶしが目立ちます。
ゲーム内では自分の環境(2kディスプレイ)では、区別付きません。(目が悪いのかもですが・・・)なもんで、こんな超アップ比較画像作りました。
※(20150430追記)Steel ArmorのNiAlphaPropertyのFlagsが4844なので、実ゲーム内ではAlpha Blend ModeでなくAlpha Test Modeです。閾値120を基準に表示するかしないかの2択なので、Steel Armorの場合はDXT3でも5でもゲーム内の見た目は変わらないですね。あまり無いケースだと思いますが、閾値ギリギリの色が多用されている場合は、不具合的に見た目変わるかもしれません。関連記事にAlphaの記事を置いておきますので、興味のある人は読んでみてください。
とりあえず理屈はこんな感じです。次回は具体的に、どのテクスチャをどう圧縮していいのか?という所をまとめてみます。
関連記事
続きはこちら