Skyrim箱庭DIY

MODによる固有の環境不具合は自分で直して快適ゲーム。CTDにさようなら。Do It Yourself!!

テクスチャ最適化によるCTD対策(圧縮編)



スポンサーリンク

Skyrimを快適に遊ぶために丁度いいテクスチャの解像度の話、DXTC圧縮の話をしてまいりました。次は実際にどう圧縮するか?を考えます。DXTCの話をみた限りじゃ、全部DXT5で圧縮すればいいんじゃないの?と思うかもしれませんが、あまりお勧めできません。そこら辺の理由もまぜつつ、圧縮をやっていきましょう。

 

過去記事はこちら

  

DDSを扱うために必要なソフト

Optimizer Textures

リサイズと圧縮と両方まとめて処理してくれます。指定したフォルダの中身に対して全部やってくれるので便利です。アルファチャネルの状態次第でDXT1、3、5を使い分けるように設定できます。DXTC圧縮のアルゴリズムは綺麗な方と言われています。

Mipmapを作ってくれる機能もあります。(後述)

Optimizer Textures at Skyrim Nexus - mods and community

OptimizerTexture

 

NVIDIA Texture Tools for Adobe Photoshop

PhotoshopでDDSファイルの読み書きができるようになるプラグインです。タダです。リサイズや圧縮目的ではあまり使わないと思いますが、使っていないアルファチャネルが無いかの確認や、テクスチャに手を入れたい時には便利です。画質に関しては、そんな悪い噂はききませんが、どうでしょう。無圧縮で保存してから、Paint.NETでDDSに書き出す人も多いようです。

nvidia-Texture-Tool-For-Photoshop

見たことある名前が並んでます。Photoshopで扱えるようになります。

 

Paint.NET

上でも少し触れた、フリーのペイントソフトです。標準でDDSを扱えます。圧縮アルゴリズムは綺麗と言われてます。

http://www.getpaint.net/



他にもGIMPでDDSを扱えるようになるプラグインもありますが、使ったこと無いのでちょっとわかりません。

 

各ソフトの使い方は、それぞれのドキュメントを参照してください。(例によって使い方講座はやらない予定です)

 

テクスチャの圧縮設定の一例

では具体的な圧縮の話をしてみます。前述のOptimizer Textureが便利かと思います。一気に作業できますので。バックアップを忘れないでください

ちょっと復習です。

  1. DXT1,3,5の違いはアルファチャネルの取り扱いだけ。カラー部の画質は変わらない。アルファチャネル分容量が増えるだけ。
  2. アルファチャネルが無い場合はDXT1。1bitアルファ(真っ白か真っ黒か二者択一)の場合、DXT1にすると元のテクスチャに上書きされる。サイズが一番小さくなる。
  3. 近似した透明度を全て均一にしていい場合、または狭い領域に透過の有無が混在しているようなアルファであればDXT3。
  4. 滑らかな透過グラデーションが欲しい場合はDXT5。DXT3とサイズは同じ。

 

個人的にはDXT3が優勢になる場合って、あまり無い気がするんですが。1bitアルファの場合に適用しても、0と255の2パターンは作ってくれますし。

そんな訳で、圧縮方法としては、

  • アルファチャネルの有るものはDXT5
  • 無い物はDXT1

の設定で良いと思います。見るからにアルファ無さそうなのに容量が大きい場合は、DDSファイルを開いて、アルファチャネルが「真っ白」であれば、削除してDXT1にするのが良いかと。OptimizerTexturesがやってくれます

※アルファチャネルのデータがグレースケールで数%といった、一見白と見間違える場合もあるので注意してください。コントラスト上げたりで確認してください(手動でやる場合)。

 

DXT圧縮を適用すべきテクスチャ

最初に「あまりお勧めしない」とは言いましたが、特にこだわりが無ければ、Data\Texturesフォルダ以下全部圧縮してしまうのも手です。簡単です。致命的に酷くなることは、そんなに無いと思います。バックアップを取っておけば、気になった所だけ戻せば済みます。外や街中、ダンジョンといった景観はまず問題出ないです。武器や防具の類もそうですし、クリーチャーもそんなアップで見ないでしょうから、問題ないかと。それでも、できれば圧縮を避けたほうがいいテクスチャがあるのも確かです

Data/Texturesをどこかに退避させておけば確実です。そのほかのフォルダ構成は、過去記事を参照してください。

 

DXT圧縮を使うことが基本方針ですが、中には避けたほうがいい物もある、ということです。

スペキュラマップ(末尾_s)やSSS用テクスチャ(末尾_sk)は、普通にDXTで問題無いです。

プレイヤーキャラや、良く使う装備だけ圧縮しない、というのも手もあります。三人称視点で表示が大きくなった際、どうもブロックノイズが気になるとか(ディフューズマップ)、光の反射具合が悪くなった気がする(スペキュラマップ)とか。

 

DXT圧縮に不向きなテクスチャ

 4x4ピクセルを代表2色+中間色2色で作るという仕様上、この小さな領域内に全然違う「3色目」が現れると、完全に削られることになります。こういった3色目は、主に境界線に現れます。例えば服の刺繍であったり、瞳の虹彩部とか。唇と肌の境界も、崩れると不細工になってしまいますね(唇はTintなので直接肌色とは干渉しませんが、Maskが荒いと境界が怪しくなります)。意外とうまく圧縮できてしまうこともありますが・・・

そんな訳で、圧縮しない方がいいと思う物を、いくつか上げてみます。

※SSは、縮小してしまうとほとんど違いが判別できず、かつアップすぎても見づらい物になってしまったので、とりあえず無しで。(うまいの作れたら後日追加するかもしれません)

Data\Textures\Actors\Character下のテクスチャ

基本種族のテクスチャフォルダです。自キャラが追加種族で、NPCは圧縮してもいいよ!って話ならば、ノーマルマップ以外の体のテクスチャだけ圧縮するのも手です。ファイル名は上のフォルダ構成まとめの記事見てください。

それ以外はあまりお勧めできません。R8G8B8で使うのがお勧め。

このフォルダのファイルは、キャラクターのスキンテクスチャと、髪や面相に関連するテクスチャです。歯もあります。フォルダ名は、EyesとかBrowとかHairとか、そのまま名前の通りです。わかりづらいのは、

FaceGenData/FaceTint/xxx.esp/・・・NPCの化粧(アイラインや唇も含む)

Character Assets/Tintmasks/・・・キャラクターの化粧(マスク)

くらいでしょうか。MODで追加されたキャラクターも、大抵はCharacter下にフォルダが出来てます。

NPCの化粧データは、FaceGenData/FaceTintに入ってます。ファイル名は、esp名のフォルダ内の、該当キャラクタのBase IDになっています。

面相系は、なるべくそのまま使った方が吉、ということです。R8G8B8(A8)で入っていると思います。

※アルファは要らない気がしますが、32bitデータにしたほうがGPUが扱い易い?

 

追加した髪の毛、水質改善MOD、天候エフェクト系のテクスチャ

結構ブロック目立つことがあります。髪の毛はDXT5で圧縮されてる有名MODもありますが(これは綺麗かと)、そうでない物は、そのまま使った方がいい気がします(大抵はDXT5でいけます)。三人称視点だと、常に視界に入りますし。水質系や天候関連も、目に見えてノイジーなことがあります。氷のリテクスチャもそうかもしれません。

絶対では無いので、容量減らしたい場合は試してみてください。うまくいったら採用で。

 

ノーマルマップ

ノーマルマップは凹凸を表現する、メッシュに対して立体感を補完する「トリックアート」的なテクスチャです。つまり、この絵を見て楽しむ訳では無いです。擬似的に作られた法線(ノーマル)の情報が重要です。これをDXTで圧縮してしまうと、視覚的に似たような色で置き換える為、法線としての意味が破綻してしまいます

normalmap-Tangent-Object

左がaMidianBorn Steel Armorのタンジェントスペース型ノーマルマップ。ファイル名末尾に「_n」が付いています。

右がBetterMalesのオブジェクトスペース型ノーマルマップ。ファイル名末尾に「_msn」が付いています

タンジェントスペース型はUVマップ(平面)を基準とした座標系なので、ほとんど青いです。比較的DXT圧縮に向いてます。

オブジェクトスペース型は、3Dモデルありき空間ありきでの座標になるので、あらゆる方向を向いた虹色になっています。これはDXT圧縮に向いていないです。色の変わり目の法線の向きが、かなりヤバそうです。ブロックノイズは法線の異常に直結します。

タンジェントスペース型は主に装備系やクリーチャー、オブジェクトスペース型は主にキャラクターに使われています。

オブジェクトスペース型の方が処理は軽いものの、現世代のGPUでは誤差のようです。タンジェントスペース型のように平面基準の座標系から、オブジェクト基準の座標系に変換(オブジェクトの面に貼った後、各法線が空間内でどこ向いているのかを再計算)する必要が無い為。

むしろ圧縮に不向きな為、オブジェクトスペース型の方がサイズ的には重くなります。反面オブジェクトの法線に依存しないので、ローポリモデルでもなめらかで綺麗な凹凸表現になります。キャラクターには最適なノーマルマップです。

※tktkさんからコメント頂けましたので、最後のコメント欄も参考にしてみてください。 

 

テクスチャの詳細は別記事もありますので、よかったらどうぞ。

 

 

ノーマルマップの圧縮提案

 オブジェクトスペース型ノーマルマップ

主にキャラクター。R8G8B8のまま使うか、どうしても小さくするならR5G6B5(16bit)に減らして使うのがお勧め。DXT圧縮はやめたほうがいいです

※顔はすごく目立ちますが、体は露出度次第で気にならないかも。どうしても削りたい場合は検討してみてください。

自分は昔DXT1でノーマルマップも全部圧縮したことあります。暫くそれを使っていたのですが、再インストール後にR8G8B8のノーマルマップでゲーム起動した時、絵の違いに愕然とした覚えがあります。慣れって怖いです。

OptimizerTexturesでProfileをmidiumにすれば、_msnのノーマルマップをR5G6B5にしてくれます。INIで選別方法の設定します。詳しくはDescription読んでください。

 

タンジェントスペース型ノーマルマップ

装備や景観とかキャラクター以外。DXT5で良さそうですが、物によっては微妙かも知れません。アルファチャネルにスペキュラマップが入っているので圧縮するならDXT5になりますそのまま使うかDXT5で試してみるのをお勧めします。大きすぎる場合はリサイズだけするのも有りかと。

 

ミップマップ

aMidianBorn Steel Armorのテクスチャです。mipmap(ミップマップ)付きで表示してみました。見ての通り、サイズがどんどん半分になっていくテクスチャが、右に並んでいます。これは、遠くにあるオブジェクト(表示が小さい)に対して、あらかじめ用意されている小さなテクスチャを貼ることで、GPU負荷を下げることができます

aMidianBornSteelArmorのmipmap

大きなテクスチャを貼ってリサイズするより効率的ですよね。しかしながら小さなテクスチャを用意する以上、テクスチャ容量が33%増大します。作っておいてた方が負荷が減るのでCTD対策にも有効かと思います。VRAMに余裕無いけどマシンパワー余りまくり、という人は、無くてもいいかもです。自分はmipmap使った上で、2GBでやりくりできるようにしています。

OptimizerTexturesで「Mipmaps」にチェック入れておけば作ってくれます。

※TintMaskのミップマップを作ると、CKでNPCの頭部メッシュ出力した時に変なTint作ってしまうので、よしたほうがいいかもです。 

 

まとめ

ノーマルマップ以外の圧縮

基本方針はDXT圧縮。面相全般、なるべく水質関連や髪、天候エフェクト系は避けておく。あとは必要に応じてDXT1かDXT5で圧縮。(アルファ有無の判別は設定しておけばOptimizerTexturesがやってくれる)

 

ノーマルマップの圧縮

  •  オブジェクトスペース型ノーマルマップは、16bitカラー(R5G6B5)に変換して容量節約。できればR8G8B8のまま使うのが好ましい。
  • DXTで圧縮するなら、タンジェントスペース型ノーマルマップだけにしておく。
  • オブジェクトスペース型ノーマルマップはなるべくDXTで圧縮しない。

 

 その他

  • ミップマップを作っておく。マシンパワー超強力でVRAMキツかったら要らないかも。(あまりそういう状況無いと思いますが)

 

記事の意味を否定しそうですが、結局は自分が納得できるか否かが一番重要です。綺麗だけどFPSが低すぎては意味無いですし、その逆もまた、です。この記事はあくまで参考程度にした上で、時間をかけて自分で色々試してみることをお勧めします。長く遊ぶ上で、極めてウェイトの高い作業なので、適当にやらずに時間をかけて検討してみてください

上手にPCリソースを活用して、CTDを減らしましょう。

 

 関連記事