VTF/VMTについて備忘録
//-------------------------------------------- | |
// VTF/VMTについて備忘録 | |
// Created at: 2011/03/22 | |
// Change Log: | |
// 2011/06/10: 誤字脱字を修正、軽く推敲した | |
// Author: KIMOTO | |
//-------------------------------------------- | |
時間を見つけて、徐々に加筆/推敲/修正していく予定 | |
この文書はgistによってリビジョン管理(バージョン管理)されています | |
この文書の最新のURLはここです: https://gist.github.com/879358 | |
L4D解剖シリーズ: | |
HUDの改造方法について: https://gist.github.com/524968 | |
cfgやconsoleについて: https://gist.github.com/583969 | |
VTF/VMTについて備忘録: https://gist.github.com/879358 | |
■汎用的な部分 | |
・VTFとはValve Texture Formatの略 | |
http://developer.valvesoftware.com/wiki/Valve_Texture_Format | |
・VTFの構造は実際の画像データ + メタ情報(設定)になっている | |
補足だがUnrealEngineでは微妙に違うので注意。 | |
UnrealEngineでは、Textureは正真正銘ただの画像データで | |
MaterialがTexture + メタ情報(設定)となっている。 | |
SourceEngineでは、Texture自体にメタ情報が仕込まれているし | |
さらにTextureに情報を付加したものがMaterialと呼ばれている | |
・VTFの縦のサイズと横のサイズがそれぞれ2の累乗のサイズになっているべき | |
32x32, 64x64x 128x128, 256x256, 512x512とか | |
おそらくこれはハードウェアで高速処理するためにやっている制限で | |
DirectXでは2の累乗サイズだと最適化されるようになっているのでそれが由来だと思われる | |
・VMTファイルとは何か | |
Valve Material Typeの略 | |
VTF(テクスチャ)に、さらに光沢や動きなどより詳細な情報を含んだものをマテリアル(VMT)という。 | |
詳細 -> http://developer.valvesoftware.com/wiki/Material | |
簡単なプログラミングっぽいことができるし、表面のでこぼこを表現したり出来る | |
・VTFは画像の格納方式を選択できる(動画ファイルで言えばCodecのようなものか) | |
そのうち、DXT1形式ではアルファ(透過)情報を含めないので注意 | |
BGRA8888やDXT5なら透過情報を含めることが出来る | |
・Windows向けの便利なシェル拡張について | |
VTF Shell Extensionというものがあり、これをインストールすれば | |
エクスプローラー上で、他のjpegなどの画像ファイルと同じようにアイコンとして表示出来るので便利 | |
参考画像: http://gyazo.com/56ba17eec69067f5fb8895d6f5f904b7.png | |
Download: http://www.wunderboy.org/sourceapps.php#vtf_shell | |
・VTF Editというソフトで各種画像形式と相互変換出来る | |
・normal mapとは何か | |
表面のデコボコ情報を含んだ画像データのこと(標準的なマップって意味ではない) | |
画像データ + その画像のnormal mapで、デコボコした表面を表現出来る | |
normal mapは青っぽい画像データ | |
GIMPのプラグインにnormal mapを出力してくれるやつがあるのでそれを入れると製作が楽に | |
・mipmapという用語はなにか | |
距離に応じてテクスチャを変更出来る仕組み | |
L4Dでは8段階くらいまであるっぽい | |
・skybox = 空(そら)の画像データ | |
SourceEngineでは必ずプレイヤーはどこかの箱の中に居なければならない。 | |
そうしないとマップのコンパイルに失敗する。いちばん外側の箱は一般的には"空(そら)の箱"になってる。 | |
おそらくskyboxという単語の語源はそこ | |
・vgui = HUD関係の画像データ | |
・bikファイルについて | |
動画形式。ここに書くべきものではないかもしれないが、起動し終わった後の背景に流れてる動画がこの形式で保存されてる。 | |
RadVideToolsというソフトウェアで、各種動画形式とBink形式への相互変換が可能 | |
http://www.radgametools.com/bnkdown.htm | |
なおこのツールを入れておけば、windows上でbink形式をダブルクリックしたときに動画として再生されるようになるので便利 | |
■スプレーについて | |
・基本的にVTFファイルが使える | |
・VTF Flagに、No Level Of Detail(強制的に最高画質)とNo Mipmapsをつけるとキレイなスプレーになる | |
後者は必要条件ではないかも | |
・実際にゲーム内で表示されるときは256x256サイズに拡大縮小されてるっぽい | |
・ゲーム内にはVTFでしかインポートできないが、インポートされた後は内部的にはVTF + VMTで保存されてるっぽい | |
場所は、materials\vgui\logos | |
もしかしたらこれをうまく利用して、スプレーにもVMT(マテリアル)が利用できるとなると表現の幅が広がる | |
たとえば発光したりとか、表面がスクロールされたりするものが作れそう | |
またそうなればnormal mapが使えるので、表面がデコボコした立体的なスプレーも可能かも | |
→訂正、VMTの使用は無理だった。クライアントはmaterials/vgui/logosの方を見ているのではない可能性がある | |
ここからは推測だがユーザーがサーバーにログインするときに、materials/vgui/logos/選択されているvtfが | |
サーバーにアップロードされる。サーバー側としてはその受け取ったファイルを | |
materials/tempに格納すると同時に参加している他のユーザーにもそのvtfを配布して表示出来るようにしてあげている | |
・アニメーションVTFは、プレイ環境のFPSに応じて再生速度が変わるわけではない。FPS高くても低くても一定速度 | |
・距離によって変化するスプレーの作り方 | |
http://kocha.ciao.jp/xxx/?p=1312 | |
・アニメーションVTFの作り方 | |
http://kocha.ciao.jp/xxx/?p=1236 | |
・高画質なスプレーの作り方 | |
512x512で元画像を用意、VTF Editでimportして、No Level Of DetailとNo MipmapsフラグをONにしてSaveする | |
・透過スプレーの作り方 | |
GIMPなどの透過情報を扱える画像編集ソフトで、透過情報を設定したtga形式で出力 | |
その後、VTF Editでそれを読み込んでVTFに変換するだけでOK | |
■Skinについて | |
・Skinは、VMT(マテリアル)と、VTF(テクスチャ)で作る。normal mapデータを使って表面の凹凸も表現可能 | |
・TankなどのInfectedを発光させることはできない。おそらくチートっぽい行為対策 | |
そういうvpkを使ってるとサーバーログイン時に弾かれる | |
Tankのmodelデータを変更することも出来なくなったため、これについては対処不能だと思う | |
色を鮮明なものに変更させる、などはInfectedでも可能 | |
こういったチートっぽいAddonに対するサーバー側の対策、についてはあまり調査していないが | |
おそらくsv_pureの仕組みを使って可能で、これは変更可能なmaterialのファイルなどを | |
ホワイトリスト方式 / ブラックリスト方式、いずれかにより制限できるというもの | |
・ディレクトリ名のv_modelsってのは一人称視点の時(first person)にモデルに適用されるマテリアル | |
w_modelsってのは三人称視点の時(third person)にモデルに適用されるマテリアル | |
パイプボムを手に持ってる時と、地面に落ちてる時では使用されてるマテリアルが違うってこと | |
■マテリアルの定義ファイル(VMT)について | |
・基本的に値はダブルクォート(")で囲む、単体の数字で合った場合は囲まなくても良いらしい | |
構文エラーがあればvpk.exeによるコンパイルに失敗するのでわかりやすい | |
-------------------------------------------- | |
"100" | |
-------------------------------------------- | |
・Materialに指定出来る変数 | |
・色 | |
-------------------------------------------- | |
"$color" "[float float float]" | |
-------------------------------------------- | |
・内部からの光 | |
-------------------------------------------- | |
"$selfillum" "1" | |
"$selfillumtint" "[1 1 1]" | |
-------------------------------------------- | |
マテリアルに対応するVTFファイルが、アルファチャンネルを持っていない場合は意味ない | |
たとえばDXT1形式なんかだと駄目。DXT5とかBGRA8888だと出来る | |
より詳細について: | |
マテリアルについて: http://developer.valvesoftware.com/wiki/Material | |
マテリアルに指定出来るパラメーター: http://developer.valvesoftware.com/wiki/Category:List_of_Shader_Parameters | |
・Proxiesについて | |
ちょっと変わったマテリアルを作るときに必要、小さな範囲ではあるがプログラミング的なことが出来る | |
Proxiesは上から順番に実行されるイメージで、基本的に | |
srcVar = 入力元となる変数 | |
resultVar = 出力先となる変数 | |
となっている | |
これらを一時的な変数に代入したりを繰り返して、最終的にはマテリアルのパラメーター($alphaや$colorなどの変数)に | |
代入することによってL4D世界に反映させる。以下の例でいうFunc1/Func2自体にL4D世界への影響があるものもある | |
-------------------------------------------- | |
Proxies | |
{ | |
Func1 | |
{ | |
srcVar $temp | |
resultVar $temp | |
} | |
Func2 | |
{ | |
srcVar $temp | |
resultVar $temp | |
} | |
} | |
-------------------------------------------- | |
ためしに上記例の実行手順を解説するとこんな感じ | |
Func1 | |
入力 => $temp | |
Func1が実行される | |
結果 => $temp に代入 | |
Func2 | |
入力 => $temp | |
Func2が実行される | |
結果 => $temp に代入 | |
□Proxiesの例文集 | |
・テクスチャのスクロール | |
-------------------------------------------- | |
TextureScroll | |
{ | |
texturescrollvar $baseTextureTransform | |
texturescrollrate 1.0 | |
texturescrollangle 0.00 | |
} | |
-------------------------------------------- | |
・プレイヤーの視点情報 | |
-------------------------------------------- | |
"PlayerView" | |
{ | |
"scale" 8.0 | |
"resultVar" "$dotproduct" | |
} | |
-------------------------------------------- | |
・乱数生成 | |
-------------------------------------------- | |
"EntityRandom" | |
{ | |
"scale" "12" | |
"resultVar" "$offset" | |
} | |
-------------------------------------------- | |
・サイン(sinh / 数学的な意味でのサイン / 周期的な何かを実現する時に使う) | |
-------------------------------------------- | |
"Sine" | |
{ | |
"sineperiod" 4 | |
"timeoffset" "$offset" | |
"resultVar" "$color[0]" | |
} | |
-------------------------------------------- | |
・値の範囲をmin - maxに抑える | |
-------------------------------------------- | |
"Clamp" | |
{ | |
"min" 0.0 | |
"max" 1.0 | |
"srcVar1" "$alpha_unclamped" | |
"resultVar" "$alpha" | |
} | |
-------------------------------------------- | |
詳細: | |
Proxiesの解説: http://developer.valvesoftware.com/wiki/Proxies | |
マテリアルに指定出来るProxies一欄: http://developer.valvesoftware.com/wiki/List_Of_Material_Proxies |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment