ノート: このページの ShaderLab 機能は古いものであり、後方互換性のためだけに文書化されています。シェーダーのソースファイルに HLSL コードが含まれている場合、Unity はこれらのコマンドを完全に無視します。シェーダーのソースファイルに HLSL コードが含まれていない場合、Unity はインポート時にこれらのコマンドを通常のシェーダープログラムにコンパイルします。
| 機能名 | ビルトインレンダーパイプライン | ユニバーサルレンダーパイプライン (URP) | HD レンダーパイプライン (HDRP) | カスタム SRP |
|---|---|---|---|---|
| 古いテクスチャ合成 | はい | いいえ | いいえ | いいえ |
基本的な頂点ライティングが計算された後、テクスチャが適用されます。ShaderLab では SetTexture コマンドを使用して実行します。
固定関数の Texturing は旧来の合成エフェクトを行う場所です。パスの中に複数の SetTexture コマンドを持つことができます。すべてのテクスチャは、ペイントアプリケーションのレイヤーのように、順番に適用されます。SetTexture コマンドは Pass の終わりに配置する必要があります。
SetTexture [TextureName] {Texture Block}
テクスチャを割り当てます。TextureName はテクスチャプロパティとして定義する必要があります。テクスチャの適用方法は TextureBlock 内で定義されます。
テクスチャブロックはテクスチャを適用する方法を制御します。テクスチャブロックはコマンドを 2 つまで含むことができます。combine と constantColor です。
combine コマンド
combine src1 * src2: src1 と src2 を乗算します。結果はどちらの入力よりも暗くなります。
combine src1 + src2: src1 と src2 を加算します。結果はどちらの入力よりも明るくなります。
combine src1 - src2: src2 を src1 より減算します。
combine src1 lerp (src2) src3: src2 のアルファを用いて src3 と src1 を補間します。補間は逆向きであることに注意してください。アルファが 1 のときは src1 が使用され、アルファが 0 のときは src3 が使用されます。
combine src1 * src2 + src3: src1 を src2 のアルファコンポーネントで乗算し、src3 を加算します。
すべての src プロパティは、previous、constant、primary、texture のいずれかです。
修飾子:
lerp 引数を除くすべての src プロパティは、次に任意で one - を指定することで、結果の色をネゲートすることができます。constantColor コマンドConstantColor color: 定数の色を定義し、combine コマンドで使用できるようにします。
5.0 より前の Unity バージョンでは、テクスチャブロック内部での matrix コマンドを用いたテクスチャ座標変形がサポートされていました。現在この機能が必要であれば、代わりに プログラマブルシェーダーとしてシェーダーを書き直すことを検討し、頂点シェーダーで UV 変形を実行してください。
同様に、5.0 では符号付き加算 (a+-b)、乗算符号付き加算 (a*b+-c)、乗算減算 (a*b-c)、ドット積 (dot3、dot3rgba) テクスチャ結合モードが削除されました。これらが必要な場合は、代わりにピクセルシェーダー内で計算してください。
フラグメントプログラムが存在する前、古いグラフィックスカードはテクスチャに対してレイヤーアプローチを使用していました。テクスチャは 1 つずつ適用され、画面に描画される色が修正されて、通常は各テクスチャごとに、テクスチャが直前の処理の結果と合成されていました。今はフラグメントプログラムを使用することをお勧めしています。
各テクスチャステージの値は、プラットフォームに応じて 0 から 1 の範囲に狭められている場合があることに注意してください。これは 1.0 より大きな値を生成できる SetTexture のステージに影響を与える可能性があります。
デフォルトでは、合成の計算式は色の RGB とアルファコンポーネントの計算に使用されます。オプションで、アルファの計算に別の計算式を指定できます。これは以下のようになります。
SetTexture [_MainTex] { combine previous * texture, previous + texture }
ここでは、RGB を乗算して、アルファを加算します。
デフォルトでは、primary のカラーは、拡散、環境光、鏡面カラーの合計です (Lighting calculation で定義したとおり)。もし SeparateSpecular On をパスのオプションで指定した場合、鏡面カラーは、合成計算の前ではなく、_後に_加算されます。これはビルトイン頂点ライティングシェーダーのデフォルト動作です。
現在のフラグメントシェーダーをサポートするグラフィックスカード (デスクトップ向けは “シェーダーモデル 2.0”) は、いずれも SetTexture モードとテクスチャステージを少なくとも 4 つ (多くの場合は 8 つ)、サポートします。本当に古いハードウェアで実行する場合 (PC で 2003 年以前に製造、モバイル向けでは iPhone 3GS より前)、2 テクスチャステージしかサポートしていない場合があります。シェーダーの作者は、サポートするカード向けに SubShader を別に記述すべきです。
次の短い例では 2 つのテクスチャを使います。最初に、1 つめの合成で _MainTex を取得し、次に _BlendTex のアルファチャンネルを使用して _BlendTex の RGB カラーをフェードインします。
Shader "Examples/2 Alpha Blended Textures" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_BlendTex ("Alpha Blended (RGBA) ", 2D) = "white" {}
}
SubShader {
Pass {
// Apply base texture
SetTexture [_MainTex] {
combine texture
}
// Blend in the alpha texture using the lerp operator
SetTexture [_BlendTex] {
combine texture lerp (texture) previous
}
}
}
}
このシェーダーは _MainTex のアルファコンポーネントを使用して、ライティングの適用場所を決定します。これを実現するために、テクスチャを 2 ステージで適用します。最初のステージでは、テクスチャのアルファ値を使用して頂点色と不透明な白色をブレンドします。2 番目のステージでは、テクスチャの RGB 値が乗算されます。
Shader "Examples/Self-Illumination" {
Properties {
_MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
}
SubShader {
Pass {
// Set up basic white vertex lighting
Material {
Diffuse (1,1,1,1)
Ambient (1,1,1,1)
}
Lighting On
// Use texture alpha to blend up to white (= full illumination)
SetTexture [_MainTex] {
constantColor (1,1,1,1)
combine constant lerp(texture) previous
}
// Multiply in texture
SetTexture [_MainTex] {
combine previous * texture
}
}
}
}
ここでさらにコストをかけずに工夫できることとして、不透明な白色にブレンドするのでなく、自己照明の色を追加して、この色にブレンドできます。ここでは、_SolidColor をプロパティから取得してテクスチャブレンディングに活用する ConstantColor の使用方法に注意してください。
Shader "Examples/Self-Illumination 2" {
Properties {
_IlluminCol ("Self-Illumination color (RGB)", Color) = (1,1,1,1)
_MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
}
SubShader {
Pass {
// Set up basic white vertex lighting
Material {
Diffuse (1,1,1,1)
Ambient (1,1,1,1)
}
Lighting On
// Use texture alpha to blend up to white (= full illumination)
SetTexture [_MainTex] {
// Pull the color property into this blender
constantColor [_IlluminCol]
// And use the texture's alpha to blend between it and
// vertex color
combine constant lerp(texture) previous
}
// Multiply in texture
SetTexture [_MainTex] {
combine previous * texture
}
}
}
}
最終的に、頂点シェーダーのすべてのライティングプロパティを取得して、活用します。
Shader "Examples/Self-Illumination 3" {
Properties {
_IlluminCol ("Self-Illumination color (RGB)", Color) = (1,1,1,1)
_Color ("Main Color", Color) = (1,1,1,0)
_SpecColor ("Spec Color", Color) = (1,1,1,1)
_Emission ("Emmisive Color", Color) = (0,0,0,0)
_Shininess ("Shininess", Range (0.01, 1)) = 0.7
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Pass {
// Set up basic vertex lighting
Material {
Diffuse [_Color]
Ambient [_Color]
Shininess [_Shininess]
Specular [_SpecColor]
Emission [_Emission]
}
Lighting On
// Use texture alpha to blend up to white (= full illumination)
SetTexture [_MainTex] {
constantColor [_IlluminCol]
combine constant lerp(texture) previous
}
// Multiply in texture
SetTexture [_MainTex] {
combine previous * texture
}
}
}
}