Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
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