Zhuang Dong の TA メモ (13) <特殊効果 - ミキシング モード: 4 つの主要なトランスペアレント チャンネルの使用法 AC、AB、AD、カスタム ミキシング>

Zhuang Dong の TA メモ (13) <特殊効果 - ブレンド モード: 4 つの主要な透明チャンネルの使用法ACABADカスタム ブレンド>

結果を示す:

文章:

1. 特殊効果の概要:

1. 特殊効果と透明性

2. 特殊効果とモーション

3. 特殊効果と反射

2.特殊効果:AC:アルファカット。

1. アルファカットアウト AC

2.コード・AC:

1. シェーダでのACの使用について: キーコード >> Clip(alpha - _Cutoff)

_MainTex ("RGBA: RGB: カラー マップ、A: 透明ペースト"、2d)="グレー"{}

_Cutoff("カットオフ", range(0,1))=0.5

クリップ(var_mainTex.a - _Cutoff);

これで透明ペーストが完成します。この知識は、レッスン 12 の dota2 シェーダーの実践で使用されます。

2. SubshaderTagsを変更する意味について:

サブシェーダの下には 2 つのタグがあり、1 つはサブシェーダタグと呼ばれ、もう 1 つはパスタグと呼ばれます

これら 2 つのタグの下では、異なる宣言内容が互換性があります。

スクリプト内には複数のサブシェーダを含めることができ、異なるサブシェーダタグに対して異なるRenderType (レンダリング タイプ)を変更できます。

このセクションでは、サブシェーダータグのコンテンツのみを紹介します。

1. RenderType:対応するデフォルトのTransparentCutout を覚えておいてください。

透明または不透明。特殊効果フィルムはほとんどが透明であるため、ここでは透明に設定します。

2. ForceNoShadowCasting : Trueの投影をオフにします

特撮では影は基本的に使われない、もしくはほとんど使われないので消費量が増えるからです。

3.ignoreProjectoro : プロジェクターに応答せず、True として閉じます。

プロジェクトの応答を閉じます(ここではあまり説明がありません。最初に理解させてください。後で連絡するときに感覚的に理解できます)

3.特殊効果はティリングオフセットを有効にする必要があります

uniform sampler2D _MainTex;  uniform float4 _MainTex_ST;

コードスニペット:

Shader "Unlit/Sc013_AC02"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Cutout("透贴",Range(0,1))=0.5
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
         Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing
            #include "UnityCG.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #pragma target 3.0
            UNITY_INSTANCING_BUFFER_START( Props )
               // UNITY_DEFINE_INSTANCED_PROP( float4, _Color)
            UNITY_INSTANCING_BUFFER_END( Props )
            
            uniform sampler2D _MainTex;uniform float4 _MainTex_ST;
            uniform float _Cutout;
            //输入结构
            struct VertexInput
            {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
            };
            //顶点输出结构
            struct VertexOutput 
            {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
            };
            //输出结构>>>顶点shader>>>输出结构
            VertexOutput vert (VertexInput v) 
            {
                VertexOutput o = (VertexOutput)0;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv0 = TRANSFORM_TEX (v.uv0,_MainTex);
                return o ;
            }
            //色彩输出结构
            float4 frag(VertexOutput i) : COLOR 
            {
                float4 var_mainTex = tex2D(_MainTex,i.uv0);
                clip(var_mainTex.a - _Cutout);
                return float4(var_mainTex);//输出最终颜色
            }
            ENDCG
        }
    }
}

3. 特殊効果: AB: アルファ ブレンド:

1. アルファブレンド AB:

2.コード・AB:

サブシェーダタグ下 :

1. RenderType:対応するデフォルトのTransparentCutout を覚えておいてください。

2. ForceNoShadowCasting : Trueの投影をオフにします

3.ignoreProjectoro : プロジェクターに応答せず、True として閉じます。

4.新しく追加されたキュー:対応するTransparentCutoutに変更されたレンダリング キュー

1. レンダリングの順序とレンダリングのタイミングを制御します。

2.不透明なオブジェクトをレンダリングする場合は、前から後ろにレンダリングを実行し、透明なオブジェクトをレンダリングする場合は、後ろから前にレンダリングします

3.透明なオブジェクトをレンダリングする前に、不透明なオブジェクトにレンダリングする前に、透明なオブジェクトの背後に何があるのか​​を知る必要があるためです

前後の順序を制御するにはどうすればよいですか? レンダリング使用する必要があります

4、キュー: = "透明"

パスタグ混在:

1、ブレンド ワン / srcAlpha OneMinusSrcAlpha;

src はソースの アルファ透明度チャネルを表し、 oneMinus 1- srcAlpha はソースの透明度チャネルを表します。

翻訳は次のようになります。1 - ソース透明ペースト

(ここには多くの説明はありません。最初に Zhuang に理解してもらい、後でそれに触れるときに知覚的に理解できるようになります)。

混合方法1:Blend One OneMinusSrcAlpha // 修改混合方式One/SrcAlpha OneMinusSrcAlpha
混合方法2:Blend SrcAlpha OneMinusSrcAlpha // 修改混合方式One/SrcAlpha OneMinusSrcAlpha

Blend One OneMinusScrAlpha == 伝統的な書き方。

Blend SrcAlpha OneMinusSrcAlpha == 事前乗算書き込み。

コードスニペット:

Shader "Unlit/Sc013_AB02"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Cutout("透贴",Range(0,1))=0.5
    }
    SubShader
    {
        Tags { 
             "Queue"="Transparent"
             "RenderType"="Transparent" 

             }
        LOD 100
         Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }

            Blend One OneMinusSrcAlpha

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing
            #include "UnityCG.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #pragma target 3.0
            UNITY_INSTANCING_BUFFER_START( Props )
               // UNITY_DEFINE_INSTANCED_PROP( float4, _Color)
            UNITY_INSTANCING_BUFFER_END( Props )
            
            uniform sampler2D _MainTex;uniform float4 _MainTex_ST;
            uniform float _Cutout;
            //输入结构
            struct VertexInput
            {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
            };
            //顶点输出结构
            struct VertexOutput 
            {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
            };
            //输出结构>>>顶点shader>>>输出结构
            VertexOutput vert (VertexInput v) 
            {
                VertexOutput o = (VertexOutput)0;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv0 = TRANSFORM_TEX (v.uv0,_MainTex);
                return o ;
            }
            //色彩输出结构
            float4 frag(VertexOutput i) : COLOR 
            {
                float4 var_mainTex = tex2D(_MainTex,i.uv0);
                float opacity = var_mainTex.a * _Cutout;
                float3 finalRGB = var_mainTex * opacity;
                return float4(finalRGB,opacity);//输出最终颜色
            }
            ENDCG
        }
    }
}

4.特殊効果:AD:アルファ追加

1. 添加剤AD:

2. コード・AD:

AB と AD の間に大きな違いはありません。唯一の違いは、パス タグ、Blend One One の下にあります。

コードスニペット:

Shader "Unlit/Sc013_AD02"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Cutout("透贴",Range(0,1))=0.5

    }
    SubShader
    {
        Tags { 
                "Queue"="Transparent"
                "RenderType"="Transparent" 

              }
        LOD 100
         Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }

            Blend One One

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing
            #include "UnityCG.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #pragma target 3.0
            UNITY_INSTANCING_BUFFER_START( Props )
               // UNITY_DEFINE_INSTANCED_PROP( float4, _Color)
            UNITY_INSTANCING_BUFFER_END( Props )
            
            uniform sampler2D _MainTex;uniform float4 _MainTex_ST;
            uniform float _Cutout;
            //输入结构
            struct VertexInput
            {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
            };
            //顶点输出结构
            struct VertexOutput 
            {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
            };
            //输出结构>>>顶点shader>>>输出结构
            VertexOutput vert (VertexInput v) 
            {
                VertexOutput o = (VertexOutput)0;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv0 = TRANSFORM_TEX (v.uv0,_MainTex);
                return o ;
            }
            //色彩输出结构
            float4 frag(VertexOutput i) : COLOR 
            {
                float4 var_mainTex = tex2D(_MainTex,i.uv0);
                float opacity = var_mainTex.a * _Cutout;
                float3 finalRGB = var_mainTex * opacity;
                return float4(finalRGB,opacity);//输出最终颜色
            }
            ENDCG
        }
    }
}

5.エフェクト:ツール・ブレンドモード:

1. より多くの混合モード:

2. 混合原理:

ここではPS層を例にSrcDstの関係を説明します。

Src :ソース 上のレイヤーのコード名が Src.、またはオブジェクトの本体がソースです。

Dst :スタックされるターゲットの下のレイヤー、コード名 Dst、またはその背後にある背景がターゲットです。

SrcFactor :ソース乗数、さまざまな形式が上の図にリストされています。

DstFactor :ターゲット乗数、さまざまな形式が上図にリストされています。

Op : 加算、減算、乗算、除算の混合演算子にはさまざまな形式がリストされています。

例: Src * SrcFactor op Dst * DstFactor。

ソース*ソース乗数 加算、 減算、乗算および除算デスティネーション*デスティネーション乗数。

3. アートカスタムミキシングパネル:

1. 2 つの操作パネル:

パッケージなし、完全露出。プレパッケージはオプションです。

パッケージ、限定品。固定の選択は後で決定されます。

4. カプセル化なし、完全に公開されたコード実装: (このレッスンではこれのみを紹介します。カプセル化については後で紹介します)

5. 一般的に使用されるモード:

コードスニペット:

Shader "Unlit/Sc013_Blend02"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Cutout("透贴",Range(0,1))=0.5

        [Enum(UnityEngine.Rendering.BlendMode)]
        _BlendSrc("混合源乘子",int)=0
        [Enum(UnityEngine.Rendering.BlendMode)]
        _BlendDst("混合目标乘子",int)=0
        [Enum(UnityEngine.Rendering.BlendOp)]
        _BlendOp("混合运算符",int)=0
    }
    SubShader
    {
        Tags { 
                "Queue"="Transparent"
                "RenderType"="Transparent" 

              }
        LOD 100
         Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }

            BlendOp [_BlendOp]
            Blend [_BlendSrc] [_BlendDst]
            

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing
            #include "UnityCG.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #pragma target 3.0
            UNITY_INSTANCING_BUFFER_START( Props )
               // UNITY_DEFINE_INSTANCED_PROP( float4, _Color)
            UNITY_INSTANCING_BUFFER_END( Props )
            
            uniform sampler2D _MainTex;uniform float4 _MainTex_ST;
            uniform float _Cutout;
            //输入结构
            struct VertexInput
            {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
            };
            //顶点输出结构
            struct VertexOutput 
            {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
            };
            //输出结构>>>顶点shader>>>输出结构
            VertexOutput vert (VertexInput v) 
            {
                VertexOutput o = (VertexOutput)0;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv0 = TRANSFORM_TEX (v.uv0,_MainTex);
                return o ;
            }
            //色彩输出结构
            float4 frag(VertexOutput i) : COLOR 
            {
                float4 var_mainTex = tex2D(_MainTex,i.uv0);
                float opacity = var_mainTex.a * _Cutout;
                float3 finalRGB = var_mainTex * opacity;
                return float4(finalRGB,opacity);//输出最终颜色
                //return opacity;
            }
            ENDCG
        }
    }
}

6. 業務委託:

1. 宿題:

おすすめ

転載: blog.csdn.net/Allen7474/article/details/130205472