Source SDK用のテクスチャを作る2 『VTFEditの使い方』

この記事ではVTFEditの操作を通じて、vtf自体についても解説する。マップやモデル等の制作者であれば理解しておくと役に立つだろう。この記事に載っている画像はValveのwikiから勝手に転載した。

VTFEditのダウンロード先
http://nemesis.thewavelength.net/index.php?c=178

VTFEdit以外にもvtfを作る方法はある(PhotoshopやGimp用のプラグイン等)のだが、まずはVTFEditを使ってみてvtfを理解しよう。ちなみにValve純正のvtfを作るツールは、Source SDKのbinフォルダ内にあるvtex.exeというコマンドラインツールであるが、非常に面倒くさいのでバッチ処理させるのでなければ使う価値はない。

VTFEditにインポートする画像の準備

拡張子

対応している拡張子はbmp, dds, gif, jpg, png, tga。使う拡張子に悩む人は、不透明ならbmp、透明度があるならpngを選んでおけばよい。もちろんtgaに馴染みのある人はtgaでもいい。

解像度

画像の解像度は縦横両方とも2の累乗で無ければならない。両方とも2の累乗であれば、縦と横の解像度は異なってもよい。
しかし、ワールドブラシの面にフィット(ブラシの面に合わせて伸縮)させるテクスチャの場合は基本的に正方形の解像度がおすすめ。なぜだか長方形解像度は伸縮させるとかなり荒く見える可能性が高い。どうしてもファイルサイズを節約したいのであれば長方形解像度を使ってもいいかもしれないが、その場合は同容量になる正方形解像度と比べて綺麗な方を採用するとよい。例えば、512*128と256*256のファイルサイズは同じ。

使う解像度は基本的に16*16, 32*32, 64*64, 128*128, 256*256, 512*512, 1024*1024, 2048*2048のどれか。これより高い解像度が必要になる場面は滅多に無いと思われる。特に一般的なタイリングテクスチャによく使うのは128*128、256*256、512*512あたりだろうか。

インポートオプション

VTF Option画面の項目をひとつずつ見ていこう。

General

Normal/Alpha Format

アルファチャンネルを持たない画像と、アルファチャンネルを持つ画像を変換するフォーマットをそれぞれ指定する。画像がアルファチャンネルを持っていない場合はNormal Formatのフォーマットが選ばれ、アルファチャンネルを持っている場合はAlpha Formatのフォーマットが選ばれる。

このため透明度を持たない画像にはbmpを使うのが安全だ。また、「Alpha FormatにもNormal Formatと同じフォーマットを設定しておき、強制的にアルファチャンネルを破棄させる」という方法もある。

プルダウンメニューを開くとフォーマットの種類が多くて嫌になりそうだが、実際に使うのは数種類なので安心してほしい。以下に書くフォーマット名横の括弧内は、そのフォーマットを使用して512*512pxのテクスチャを作成した場合のファイルサイズ。jpg等と違い、vtfは模様に関係なく解像度が同じならファイルサイズも同じになる。

まずDXTCという画像圧縮アルゴリズムを使う非可逆圧縮フォーマットの3つ。どうでもいい話だがこれはストレージの使用量ではなく、GPUで表示する時のメモリの使用量・帯域幅を抑えるためのフォーマットである。そのため一般的なjpgより品質が劣るにも関わらず、ファイルサイズはpngより大きい。
  • DXT1 (170KB): アルファチャンネルを持たない。最も広く使われている。地面や壁などのテクスチャは大体これ。
  • DXT1 With One Bit Alpha (170KB): 通称DXT1A。1ピクセルあたり1ビット、つまり「完全に不透明/完全に透明」の2階調しかないアルファチャンネルを持つ。ファイルサイズは実用上DXT1と全く同じと思ってよい。
  • DXT3 (341KB): これは普通使わないが、DXT5の説明の為に挙げた。1ピクセルあたり4ビット、つまり16階調のアルファチャンネルを持つ。
  • DXT5 (341KB): ファイルサイズはDXT3と同じだが、ほとんどの場合DXT3より遥かに滑らかなアルファチャンネルを表現できる。仕組みが知りたい人はググれば出てくる。
上の4種類で違いが出るのはアルファチャンネルだけで、RGB部分の品質は全く変わらない。つまり透明度を持たないテクスチャをDXT5にしてもファイルサイズの無駄でしかない。そしてそのRGB部分の圧縮アルゴリズムを簡単に説明しておくと、「画像を4*4px毎のブロックに分割して、それぞれのブロックの代表色2色に、代表色の中間の補完色2色を加えた、計4色で1ブロックを表現する」というもの。普通の写実的なテクスチャであれば劣化は拡大して見比べない限りまず分からない程度なので安心しよう。一方アニメ的というか細部の色相コントラストが高いテクスチャの場合、色のエッジの劣化が目立ってしまうことがあるが、それでもゲーム内で気になることは滅多に無い。とにかく品質を最優先したい時以外は、このDXTフォーマットを使うべきである。

右から無圧縮, DXT1, DXT5
そして無圧縮フォーマットの4つ。
  • BGR888 (1024KB): アルファチャンネルを持たない。要はbmpと同じ品質。
  • BGRA8888 (1366KB):アルファチャンネルを持つ。要はpngと同じ品質。
  • I8 (341KB): グレースケール(白~黒)のみ。
  • IA88 (682KB): I8にアルファチャンネルを加えたバージョン。
見ての通りDXTに比べて非常にファイルサイズが大きい。DXTで作ってみたら劣化がどうしても許容できないレベルだったという時にだけ使う。なおBGR888に似たような名前のフォーマットとしてRGB88があり、BGRA8888に似たような名前のフォーマットとしてRGBA8888,  ABGR8888, ARGB8888があるが、これらは格納するチャンネルの順番が違うだけだと思われる。vtfではBGR888とBGRA8888が一般的なフォーマットのようなので、上ではこの2つを挙げた。おそらくRGB888やRGBA8888なども普通に使えるはずだが、あえて選ぶ必要も無いだろう。

まとめると、以下の3パターンを覚えておけば大抵通用する。
  1. 圧縮フォーマット(低ファイルサイズ, 低画質): Normal Format = DXT1, Alpha Format = DXT5
  2. 無圧縮フォーマット(高ファイルサイズ, 高画質): Normal Format = BGR888, Alpha Format = BGRA8888
  3. 無圧縮グレースケール(中ファイルサイズ, 高画質, 白~黒のみ): Normal Format = I8, Alpha Format = IA88
これに、アルファ階調が2段階しかない場合のみAlpha Formatに使う、圧縮フォーマットであるDXT1Aが加わる。

なお、全てのピクセル(=画像全体)で同じ不透明度で良い場合、DXT5やBGRA8888を使う必要は無い。変換前の画像ファイルを完全に不透明にして、VTFEditでDXT1/BGR888で保存する。そしてvmtの$alphaパラメータで不透明度を設定する。下の例では全体の不透明度が50%になる。
    "$alpha" "0.5"
この方法は汚れていない窓ガラスのような質感のテクスチャに向いている。

Texture Type

分かりづらいが、これは連番BMP等で複数の画像をインポートした時に、それをどう扱うかを設定する。普通に画像を1枚だけインポートした場合は関係無い。 私もよく理解していないが、使うとすればせいぜいAnimated Textureぐらいだろう。これは文字通りアニメーションするテクスチャである。ただし、ゲーム内で正しく再生させるにはvmtファイルでフレームレートなどを設定する必要がある。

ちなみに私は256*128px, DXT1形式で、フレーム数900枚のアニメーションvtfを作ってみたことがある。VTFEditに読み込むのに数分掛かったが、普通にゲーム内で再生できた。ファイルサイズは19MBだった。

Mipmaps

Generate Mipmapsにチェックを入れると、元の解像度の画像に加え、縦横それぞれの解像度を1/2、1/4、1/8、1/16…としていった画像(ミップマップ画像)がvtfに保存される。
例えば、これにチェックを入れて128*128pxの画像をインポートした場合は、64*64, 32*32, 16*16, 8*8, 4*4, 2*2, 1*1の、計7枚のミップマップ画像が付いてくることになる。
そしてゲーム内では、視点からの距離に応じて小さい解像度のミップマップ画像が使われる。
これによって描画速度も画質も向上するという素敵なシステムである。

たまに勘違いしている人を見かけるのでもう一度書いておくが、一般的に、ミップマップを作成したほうが遠くから見た際の画質は向上する。ミップマップが無いテクスチャは遠くからみると不自然に縮小されてジャギーになってしまう可能性が高い。

Mipmap FilterとSharpen Filterを変えると、出来上がるミップマップ画像の仕上がりが変わる。これは一概にどれが一番良いとは言えないので、下の画像を参考に状況に応じて判断して欲しい。とはいえ、最も標準的なMipmap FilterはBox、最も標準的なShapen FilterはNone又はShapen Softなので、迷ったらこれらを選んでおけば良い。私は常時Box+Noneでやっている。
Mipmap Filter 1
Mipmap Filter 2
Mipmap Filter 3
Sharpen Filter
ちなみに、ミップマップを作成する場合のファイルサイズは、作成しない場合の4/3になる。元画像の解像度がなんであろうと4/3なので覚えておこう。特別な理由が無い限りミップマップ画像は作成しておいたほうが良い。

Resize

元画像のサイズの解像度が縦横それぞれ2の累乗でなくても、インポート時にリサイズすることによって使えるようにするという機能だが、使わないことをお勧めする。しっかりVTFEditに渡す前の画像編集ソフトでリサイズしておこう。

Normal Map

高さ情報を読み取るソースや方式を設定して、ノーマルマップに変換してくれる機能だが、VTFEditでノーマルマップを作成することはお勧めしない。PhotoshopやGimp用のプラグインや、SSbump Generator等の専用ソフトを使用したほうが良い。

Advanced

Version

とりあえず7.2に設定しておけば全てのゲームで使えるようなので、7.2を推奨する。7.3以降は「リソースデータシステム」なるものやCRC値が追加されているらしいが、我々にとってメリットは特に無いと思われる。

試しに7.5のvtfを作成してみたところ、Source Engine MP(TF2やCS:Sのエンジン)のハンマーエディタでは読み込めなかった。

Gamma Correction

画像のガンマを調整できる。 やはり、これも使わずに画像編集ソフト側で調整したほうが良いだろう。

Compute Reflectivity

画像のRGBの平均値か何かから、「このテクスチャに当たった光の反射光の強さ」を計算し、vtfに埋め込んでくれる機能。とても重要なので必ずチェックを入れること。

このテクスチャがLightmappedGenericとしてワールドブラシに貼られて、マップのコンパイル時に静的ライトの光が当たった時、反射する光の色や明るさがこの時計算したReflectivityの値によって決まる。チェックを入れなかった場合、Reflectivityの値は[1 1 1]となり、これは白い強烈な光を反射することになってしまう。モデルに使用するテクスチャの場合はチェックを入れても入れなくても何も変わらない。

この時計算されたReflectivityが気に入らない場合は、vmtに$reflectivityパラメータを追加することで、マップのコンパイル時に参照されるReflectivityを上書きできる。これによって、テクスチャの色とは全く異なる色を反射させることもできる。下の例では、白い光をほのかに反射する。(.1とは、0.1を省略した形)
    "$reflectivity" "[.1 .1 .1]"
当然この値を変更してもマップを再コンパイルするまで効果は現れない。

なおSourceエンジンにおいて、この反射光は、テクスチャの模様には影響されないので注意が必要。例えば、右半分が赤、左半分が青でべた塗りされたテクスチャを作り、ワールドブラシに貼り付ける場合、「赤の部分からは赤い光を反射させ、青の部分からは青い光を反射させる」ということは出来ない

Generate Thumbnail

チェックを入れると、16*16pxのDXT1形式のサムネイルがvtfに埋め込まれる。これが実際に使われる場面があるのかは知らないが、ファイルサイズの増加量はごくごく僅かなので、チェックを入れておいて損は無いと思われる。

DXT Compression

QualityをMediumやLowにすると、画像の品質が落ち、VTFEditが画像を読み込む時間が僅かに短くなる。それだけなのでHighにしておくこと。LowやMediumにしてもファイルサイズは全く変わらない

Luminance Weights

これはフルカラー画像をグレースケール(つまりI8とIA88フォーマット)に変換する際に、RGBそれぞれのチャンネルにどれくらい比重を置くかという設定。それ以外のフォーマットならば何も影響しない。

これも基本的には画像編集ソフト側でグレースケール化したほうが良いと思うが、リサイズやガンマ調整と違ってシンプルなので、元々彩度の低い画像をさくっとグレースケール化したい場合は使っても良い。

基本的には自分で考える必要は無く、以下の2パターンから好きな方を選べば良い。
  1. Red = 0.213, Green = 0.715, Blue = 0.072
  2. Red = 0.299, Green = 0.587, Blue = 0.114
パターン1はPhotoshopでも用いられている最も一般的なもの。パターン2は、赤と青の比重が高いバージョンである。無論どちらでもあまり変わらない。

Unsharpen Mask Options

よく分からない。 いくつか値を変えてみたが、違いが分からなかった。
ミップマップのShapen FilterがUnsharpen Maskに設定されている時、ミップマップ画像に影響する?どうせ使う必要が無いので試していない。
とりあえずThresholdをデフォルトの0.00にして、Unshapen Mask以外のSharpen Filterを選んでおけば勝手にアンシャープが掛けられることは無いだろう。

X Sharpen Options 

Unsharpen Maskと同じくよく分からない。ミップマップのShapen FilterがXSharpenに設定されている時のみ、ミップマップ画像にのみ影響する?
とりあえずこれも気にしないでいい。

Resources

このタブの機能はVersionが7.3以上で無いと使用できない。

LOD Control Resource

よく分からないがチェックを入れる必要は無いと思う。一応Valve wikiの説明をそのまま貼っておく。

An U/V LOD control. This is the highest mipmap which should be loaded when game's Texture Detail setting is "High" (mat_picmip 0). An U LOD Control value of 11 selects the mipmap which is 2048 pixels (211) across. 
Note: Since users are currently only presented with one texture detail setting above High, there is little point setting this value to anything except 50% or 100% of your texture's size.

Information Resource

あなたの名前や連絡先、テクスチャの説明などを入れられる。つまり使わない。

VTFEditのメインウィンドウで出来ること

VTFEditで重要なのはインポートオプションなので、メインウィンドウで出来ることは少ない。

上部メニュー

File>Save As...でvtfファイルとして保存できる。Exportならbmp/jpg/png/tgaで保存できる。

View>ChannelでR/G/B/Aそれぞれのチャンネルのみを表示できる。
View>Maskでアルファチャンネルを適用するかしないか切り替えられる。
View>Tileでこのテクスチャをタイリング(並べること)した時にどう見えるかを確認できる。
なおこれらの表示設定がどうであろうと保存する際のvtfには影響しない。Maskのチェックを外した状態で保存したからといってアルファチャンネルが破棄されるわけではない。

Tools>Create VMT Fileでテキストエディタを使用せずにvmtが作れる。しかし使えるパラメータは一部だし、慣れてしまえばテキストエディタで書いたほうが早いので出番はあまりない。
Tools>Convert Folderでフォルダごとpng→vtfやvtf→bmpなどに一括で変換できる。たまに使う。

Options>Auto Create VMT Fileにチェックを入れると、$basetextureを保存するvtfに指定したvmtを、vtfの保存場所と同じフォルダに作成してくれる。少しだけ手間が省ける。ただしvtfの保存場所がいずれかのゲームの"materials\"以下でない場合は$basetextureはvtfのパスをうまく指定してくれない。(当たり前だが)
Options>File MappingとVolatile Accessは分からない。デフォルトでチェックが入ってるのでとりあえずチェック入れてしておけば良いと思う。

横のメニュー

最初「サイドメニュー」と書こうとしたが、それだと豚汁やサラダ等になってしまう気がした。(この記事内で最もどうでもいい情報)

File System

使わない。

Image

Frame: 複数の画像を持つAnimated Textureの場合はここで各フレームを確認できる。
Face: 複数の画像を持つEnvironment Mapの場合はここで各面を確認できる。
Slice: 複数の画像を持つVolume Textureの場合は・・・作ったこと無いので知りません。
Mipmap: 各ミップマップ画像を確認できる。
Key, Shift, Gamma: 使わない。使えない。
Play: 複数の画像を持つAnimated Textureの場合は再生できる。

Flags

色んなフラグがあるが、ほとんどはvtex.exeでコンパイルする場合しか効果が無く、VTFEditで使うのは基本的に「No Level Of Detai」だけ。これにチェックを入れると、プレイヤーのビデオ設定のテクスチャ品質に関係なく最高画質で表示されるようになる。どうしても綺麗に表示させたいテクスチャの場合はこれにチェックを入れる。文章を書いてプレイヤーを案内するようなタイプのテクスチャでは必ずチェックを入れておこう。

他のフラグについて少し補足をすると、例えば「Normal Map」というFlagがあるが、別にこれにチェックが入っていなくてもノーマルマップのテクスチャとして使える。vtex.exeでは、無圧縮フォーマットを選択する等の効果があるらしい。

「Clamp S」と「Clamp T」について
TF2などのスプレー作成ガイドではこの2つのフラグにチェックを入れておけ、と書いてあるのをよく見かけた。必須ではないが、タイリングする必要が無いテクスチャの場合はチェックしておくとよい。詳しく知りたい人は「テクスチャアドレッシング」でググれば出てくる。

Info

解像度やフォーマット等を確認できる。 特にフォーマットは忘れずに確認しておこう。

StartとBumpmapの数値を弄れるが何に使うのかは知らない。そっとしておこう。

Resources

リソースを確認できる。つまり使わない。

1 件のコメント:

  1. ありがとうございます
    とても良い記事だった!!

    返信削除