Version: Unity 6.0 (6000.0)
言語 : 日本語
ShaderLab: 古いアルファテスト
ShaderLab: 古い頂点データチャンネルマッピング

ShaderLab: 古いテクスチャ合成

ノート: このページの ShaderLab 機能は古いものであり、後方互換性のためだけに文書化されています。シェーダーのソースファイルに HLSL コードが含まれている場合、Unity はこれらのコマンドを完全に無視します。シェーダーのソースファイルに HLSL コードが含まれていない場合、Unity はインポート時にこれらのコマンドを通常のシェーダープログラムにコンパイルします。

レンダーパイプラインの互換性

機能名 ビルトインレンダーパイプライン ユニバーサルレンダーパイプライン (URP) HD レンダーパイプライン (HDRP) カスタム SRP
古いテクスチャ合成 はい いいえ いいえ いいえ

概要

基本的な頂点ライティングが計算された後、テクスチャが適用されます。ShaderLab では SetTexture コマンドを使用して実行します。

固定関数の Texturing は旧来の合成エフェクトを行う場所です。パスの中に複数の SetTexture コマンドを持つことができます。すべてのテクスチャは、ペイントアプリケーションのレイヤーのように、順番に適用されます。SetTexture コマンドは Pass の終わりに配置する必要があります。

構文

SetTexture [TextureName] {Texture Block}

テクスチャを割り当てます。TextureName はテクスチャプロパティとして定義する必要があります。テクスチャの適用方法は TextureBlock 内で定義されます。

テクスチャブロックはテクスチャを適用する方法を制御します。テクスチャブロックはコマンドを 2 つまで含むことができます。combineconstantColor です。

テクスチャブロック 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 プロパティは、previousconstantprimarytexture のいずれかです。

  • Previous は直前の SetTexture の結果です。
  • Primarylighting calculation の色か、bound である場合は頂点カラーです。
  • Texture は SetTexture 内で TextureName によって指定された色です。(上を参照してください。)
  • ConstantConstantColor で指定された色です。

修飾子:

  • 上で示した計算式は、次に任意で Double または Quad キーワードを指定することで、結果の色を 2 倍または 4 倍明るくできます。
  • lerp 引数を除くすべての src プロパティは、次に任意で one - を指定することで、結果の色をネゲートすることができます。
  • すべての src プロパティは、次に alpha を指定することで、アルファチャンネルのみを取得させることができます。

テクスチャブロック constantColor コマンド

ConstantColor color: 定数の色を定義し、combine コマンドで使用できるようにします。

Unity 5.0 で削除された機能

5.0 より前の Unity バージョンでは、テクスチャブロック内部での matrix コマンドを用いたテクスチャ座標変形がサポートされていました。現在この機能が必要であれば、代わりに プログラマブルシェーダーとしてシェーダーを書き直すことを検討し、頂点シェーダーで UV 変形を実行してください。

同様に、5.0 では符号付き加算 (a+-b)、乗算符号付き加算 (a*b+-c)、乗算減算 (a*b-c)、ドット積 (dot3dot3rgba) テクスチャ結合モードが削除されました。これらが必要な場合は、代わりにピクセルシェーダー内で計算してください。

詳細

フラグメントプログラムが存在する前、古いグラフィックスカードはテクスチャに対してレイヤーアプローチを使用していました。テクスチャは 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 つのテクスチャのアルファブレンディング

次の短い例では 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
            }
        }
    }
}
ShaderLab: 古いアルファテスト
ShaderLab: 古い頂点データチャンネルマッピング