カスタムマテリアルの作成

Last-modified: 2009-09-19 (土) 16:10:33

http://tendon.s35.xrea.com/phpBB/kb.php?mode=article&k=109
からの転載、改変です。

マテリアルの作成

ソ-スエンジンは表面(モデル、世界、スプライトなど)にどのテクスチャ(.VTFファイル形式)とシェ-ダ(マテリアルがどのように画面にレンダリングされるのかを定義する関数)を使用するかを定義するのにマテリアルを使います。

  • マテリアルファイル
  • 元テクスチャからのコンパイル
  • .TXTファイルによるVtexコンパイルパラメ-タ
  • .VMTファイルの作成
  • Vtexのコマンドラインでの使用
  • マテリアル作成のまとめ

マテリアルファイル

マテリアルは.VMT(Valve Material)ファイルの中で定義されます。これはどのようにマテリアルがレンダリングされるかを定義する高レベルスクリプトです。

まず.VMTファイルの例を見てみましょう:

Code:
"LightmappedGeneric"
{
   // String values are quoted 文字列は引用符で囲まれます
   "$basetexture" "shadertest/LightmappedTexture"
   "$envmap" "shadertest/LightmappedTexture_envmap"
   // Vector values are quoted ベクトルデ-タは引用符で囲まれます
   "$color" "[1 0 0]"
   // Float and integer values are *not* quoted Floatと整数は引用符が囲みません
   "$alpha" 0.5
   "$nocull" 1
}

.VMTファイルの最初の行は使用するシェ-ダの名前です。シェ-ダのマテリアル変数は中括弧の中で定義されます。マテリアル変数の名前とその値の間に'='を置いてはいけないことに注意してください。またコメント行は'//'をつかいます。'//'以降にある同じ行のテキストはマテリアルがロ-ドされるときには無視されます。

ロ-エンドシステムで実行され、シェ-ダが単純なものにフォ-ルバックする必要があるとき、追加のブロックを用意して元々のブロックで定義されたマテリアル変数の値を上書きすることもできます。

以下がその例です:

Code:
"LightmappedGeneric"
{
   "$basetexture" "shadertest/LightmappedTexture"
   "$envmap" "shadertest/LightmappedTexture_envmap"
   // If the shader falls back to shader "LightmappedGeneric_DX7",シェ-ダが"LightmappedGeneric_DX7"にフォ-ルバックするとき
   // then the environment map defined in this block will be used instead of the このブロックで定義されたenvironment mapが
   // one defined above. Since $basetexture isn't defined in this block, 上で定義したものの代わりに使われます。$basetextureはこのブロックで定義されていないので
   // the original one will be used. オリジナルの値が使われます。
   "LightmappedGeneric_DX7"
   {
       "$envmap" "shadertest/OverrideEnvMap"
   }
   // If the shader falls back to shader "LightmappedGeneric_DX6", シェ-ダが"LightmappedGeneric_DX6"にフォ-ルバックするとき
   // then the base texture defined in this block will be used instead of the このブロックで定義されたベ-ステクスチャが
   // one defined above. Since $envmap isn't defined in this block, the original上で定義したものの代わりに使われます。$envmapはこのブロックで定義されていないので
   // one will be used.オリジナルの値が使われます。
   "LightmappedGeneric_DX6"
   {
       "$basetexture" "shadertest/OverrideTexture"
   }
}

シェ-ダフォ-ルバックについての詳細は「ジオメトリ可視性コントロ-ルとコンパイル時間」の、「マテリアルの選択とレンダリングパフォ-マンス」にあります。

また.VMTファイルには他に'%'から始まる予備変数もあります。

例えば:

Code:
"UnlitGeneric"
{
   $envmap" "shadertest/shadertest_envmap"
   %tooltexture" "shadertest/shadertest_envmap"
}

これはこの変数はツ-ルによってのみ使用され、エンジンにはロ-ドされないことを意味します。'%'を必要とする変数は"%tooltexture"、"%keywords"、"%detailtype"と、そして"%compileWater" や"%compileHint"のようなコンパイル変数だけです。

元テクスチャからのコンパイル

ソ-スエンジンはテクスチャデ-タの保管に.VTF (Valve Texture)ファイルを使います。こうしたファイルは基本のソ-スデ-タだけではなく、様々な距離でのテクスチャレンダリングに使われるmipレベルも含んでいます。.VTFファイルは.TGAファイル(色深度は16、24、または32ビット)から作られます。全ての.TGAファイルは2の乗数の解像度を持つ必要があります。高さと幅は異なっていてもかまいません。(16x16、32x32、64x128、128x128、128x256、 512x512など)

Vtexツ-ル(場所はsourcesdk/bin)が.TGAファイルを.VTF形式にコンパイルするのに使われます。Vtexは.TGAファイルと、オプションとしてテクスチャコンパイルの追加パラメ-タを記述したテキストファイルを入力として受け取ります。この2つのファイルを使い、.VTFファイルを作成します。パラメ-タを含んだ.TXTファイルはコンパイルされる.TGAファイルと同じベ-ス名を持ち、同じディレクトリにある必要があります。ツ-ルが正しくファイルをリンクするためにはtest.tgaはtest.txtと同じディレクトリにある必要があります。

.TXTファイルが存在しない場合、Vtexは自動的に正しい場所(.tgaと同じディレクトリ)に正しい名前(.tgaと同じ名前で拡張子が.txt)の空ファイルを作成します。以下にこの.TXTファイルに挿入することができるコンパイルパラメ-タを説明します。

テクスチャをコンパイルするには、.TXTか.TGAファイルをsourcesdk/bin/vtex.exeアイコンにドラッグするか、 Vtexのコマンドラインパラメ-タでどちらかのファイル名を入力します。このツ-ルはファイルを作成し、.VTFファイルが元テクスチャがあった場所のディレクトリを反映したマテリアルディレクトリのサブディレクトリに作成されることを報告します。注意:これが正しく機能するには、自分のMODの正しいゲ-ムディレクトリを選択しておく必要があります。/materialsのタ-ゲットディレクトリが存在していない場合、続行する前に両方の場所を作る必要があります。

例えば"sourcesdk_content/hl2/materialsrc/test/MyTexture.tga"にあるTGAファイルをコンパイルすると、結果の.VTFファイルは"/half-life 2/hl2/materials/test/MyTexture.vtf"に配置されます。

.TXTファイルによるVtexコンパイルパラメ-タ

.TXTファイルからパ-スして理解できるVtexパラメ-タは以下です:

  • $nolod
    低いDirectXバ-ジョンでもこのテクスチャの低クオリティバ-ジョンは使いません。HUDのグラフィックなどのゲ-ム世界外のグラフィックに使います。
  • $nomip
    このテクスチャのmipレベルを作りません。スカイボックスやメニュ-バックグラウンドといったマテリアルに使用します。
  • $clamps
  • $clampt
    それぞれS、T座標空間でのテクスチャのラップを禁止します。これはタイル配置されないスプライトでよく使われます。
  • $skybox
    スカイボックスのコンパイルに使われます。それぞれの面で辺が一致することを保証します。
  • $startframe (integer)
  • $endframe (integer)
    アニメ-ションテクスチャに使われます。texture000、texture001、texture002というようにテクスチャを命名する必要があります。$startframeは開始フレ-ム、$endframeは終了フレ-ムを定義します。
  • $nocompress
    このテクスチャの圧縮をしません。繊細なグラデ-ションがあるテクスチャ(後光など)に役に立ちます。
  • $nonice
    低mipレベルでNICEフィルタリングを使用しません。
  • $dxt5
    完全圧縮の代わりにDXT5圧縮を使います。

.VMTファイルの作成

.VTFファイルが作成されたら、エンジンで実際にテクスチャを使うために.VMTファイルを作成する必要があります。

.VMTは.VTFファイルがどのように画面にレンダリングされるかを定義します。まず最初に単純なシェ-ダを使ってみます。LightmappedGenericです。このシェ-ダはライトマップを受け取る世界内の表面に使われます。

このシェ-ダの最も単純な定義は:

Code:
"LightmappedGeneric"
{
   "$basetexture" "test/MyTexture"
}

これでライトマップが適用された"test/MyTexture"という.VTFファイルが不透明に描画されます。これはブラシ表面に適用するテクスチャ(壁など)に一般的に使われます。.VTFファイルと.VMTファイルが作成されると、テクスチャをハンマ-エディタ内で表面に適用することができます。

新しい.VMTファイルの作成の最も簡単な方法の一つは、自分が作っているマテリアルと似た属性のすでにある.VMTファイルを開くことです。ファイルの中身を編集し、別の名前で保存して新しいマテリアルを作ります。

Vtexのコマンドラインでの使用

上級ユ-ザはvtex.exeをWindowsコマンドプロンプトでスクリプトを組んで実行することもできます。詳細はVtexのコマンドラインでの使用ドキュメントを参照してください。

マテリアル作成のまとめ

以下がソ-スエンジンのためのマテリアルを作成するのに必要なステップの簡単なまとめです:

  1. 元テクスチャを16、24、もしくは32ビット形式で、解像度は2の乗数の.TGA形式で作成します。.TGAには透明やスペキュラといった効果のためのアルファチャンネルを含むこともできます。
  1. 自分の.TGAファイルをマテリアルが現れて欲しい/materials内のディレクトリに対応した/materialsrc内のディレクトリに保存します。

例:
コンパイルしたマテリアルがHalf-Life 2/hl2/materials/metalに置かれるようにするには、元の.TGAファイルをsourcesdk_content/hl2/materialsrc/metalディレクトリに配置します。
/materials内のタ-ゲットディレクトリが存在していないのなら、続ける前に両方のディレクトリを作成する必要があります。

  1. コンパイルパラメ-タを含んだ.TXTを同じ場所に作成し、元の.TGAと同じ名前に.TXT拡張子をつけた名前にします。コンパイルパラメ-タを追加する必要がない場合はこのステップをとばすことができ、このときは.TXTファイルが次ステップで自動的に作成されます。
  1. .TGAファイルを/sourcesdk/binディレクトリのvtex.exeアイコンにドラッグして.VTFファイルをコンパイルします。current game directoryで指定されたディレクトリの/materialsの内部に.VTFがコンパイルされて生成されます。上級ユ-ザはVtexをコマンドプロンプトから実行することもできます。
  1. 作成した.VTFファイルを差す.VMTファイルを作成します。
  1. ハンマ-を立ち上げて新しいマテリアルが正しく機能しているか確かめてください。