シェーダーは次のような構造をしています。
シェーダー名 { グローバル宣言 ・・・ { ブロック1 ・・・ } { ブロック2 ・・・ } ・・・ }
一番最初にシェーダー名を宣言します。
全体が{と}で挟まれたブロック構造をしています。
グローバル宣言にはそのシェーダー全体の設定をつらつらと書き連ねます。
それに続く各ブロックに画像ファイルの情報を書いていきます。
複雑なシェーダーになると、何枚もの画像を重ね合わせてブレンドして1枚のシェーダーに仕上げます。
例えば空の作り方を見ると、青空、遠くの雲、近くの雲、太陽などなど幾枚もの画像を重ねて処理しているのがわかります。
一般的なテクスチャでは、画像ファイルとライトマップ(-lightオプションでコンパイルして計算された画像)との合成が行われます。 下の画像を見てください。
画像のみ (BSP -metaコンパイル) |
|
---|---|
ライトマップのみ (/r_lightmap 1) |
|
画像+ライトマップ |
|
こういうわけで、一般的なテクスチャのシェーダーには2つブロックを記述します。
カスタムテクスチャのページで紹介したshaderをもう一度見てみます。
textures/test/kincho { qer_editorimage textures/test/kincho.tga surfaceparm metalsteps { map $lightmap // ライトマップ rgbGen identity } { map textures/test/kincho.tga // 画像ファイル blendFunc GL_DST_COLOR GL_ZERO rgbGen identity } }
このようにライトマップに関するブロックと画像ファイルのブロックが書かれているのがわかります。
それぞれの画像を合成するしかたは blendFunc という命令で制御しています。
blendFunc については空の作り方のブレンドについてのページを読んでください。
rgbGen という命令はカラーの計算方法を指定します。
rgbGen identity を指定すると白を基準にカラー計算を行います。(デフォルト)
しかし、あまり重要じゃないので気にしないで下さい。
あとはもう、変なテクスチャを見つけたらそのシェーダー記述を探し出して弄ってみるしかないと思います。
シェーダー命令の詳細は Q3Map2 Shader Manual を読んでください。