荘東のTAノート(15) <特殊効果:流れ+撹乱>

荘東のTAノート(15) <特殊効果:流れ+撹乱>

結果を示す:

文章:

概要:

1. 拡張:

1. 並べ替え問題:

この問題の理由は、背景を取得する前に悪役の腕が透明であると見なされないため、コンパイル プロセスでは無視され、透明になります。

Detach Attach Zwrite Off は、透明ペーストの問題を解決します。(使い方についてはここでは触れません)

前方の物体が後方の物体を妨げているかどうかを確認します。そして、手前のオブジェクトが透明かどうか、Z深度ピクセルが手前にあるかどうかを判断します。

2. アルファ チャネルの事前乗算問題:

2 つの画像タイプ:

左側の図は事前乗算なしの状態です。

右側の画像は、事前に乗算されたテクスチャです。

前乗算とは何ですか?

つまり、色とRGB画像と透明シールを掛け合わせてRGBに入れます。

何に注意すればよいでしょうか?

書くときは、AB(事前乗算時)、One OneMinusSrcAlpha の混合メソッドを使用できます。

AD (事前乗算されていない場合) を記述するときは、SrcAlpha OneMinusSrcAlpha またはシェーダー内の乗算の混合方法を使用できます。

3. AB AD コードの改善:

ここで、実際には前の記事に記録されたメモと一致しています。AB と AD の違いは次のとおりです。

Blend One OneBlend One OneMinusSrcAlpha 。

2. UVフロー効果の実現:

1. デモゴーストフロー

制御パラメータ設計:(定義素材パネル)

1. ノイズテクスチャを追加_NoiseTex

2. ノイズ強度の制御_NoiseInt

3. 流速の制御_FlowSpeed

知識ポイント:

全体的に明暗(背景が明るくなるだけでなく暗くなる)の性能ですが、これが直感的な感覚であれば一般的にABと評価されます。

背景全体を明るくすると半分はADになります。

2. GhostFlow をコード化する

3. GhostFlow をコード化します。

frac (剰余をとるということは小数点をとることを意味し、そうでなければ整数だけをとると認識が変わりません。) 理由は、一部のローエンドマシンの場合、剰余をとらないと、深さでは、費やす理由はUnityのオープン以来無限に増え続けている時間で簡単にオーバーフローしますが、残りを取った後はオーバーフローしません。

例:

頂点シェーダー:

UV1 (ノイズ UV) をフローさせます。

1. TRANSFORM_TEX はテクスチャ スケーリングをサポートします

2. 時間とともに変化するオフセットを V 軸に追加して、流れを実現します。_Time.(X,Y,Z)は遅いものから速いものまで3段階に分かれており、2倍ずつ増加します。

ピクセルシェーダ:

1. サンプリング ノイズ マップ。単一チャネル R のみを取ります。

2. FinalRGB を取得します。

3. 不透明度透明ペーストを計算します。

1 を中間値として、ノイズ マップ (0 ~ 1 から 0 ~ 2 にマッピング) を再マップします。lerp(1,var_NoiseTex * 2 , _NoiseInt*2);

ノイズの負の値をカット

計算 不透明度 = 透明度 * 合計不透明度 * ノイズ マップ;

戻り値: float4 (FinalRGB、不透明度);

コード例:

Shader "Unlit/Sc014Flow01"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _NoiseTex ("_NoiseTex", 2D) = "gray" {}
        _NoiseInt ("噪波强度",Range(0,5))=1
        _FlowSpeed("流动速度",Range(-10,10))=5
        _Cutout("透贴",Range(0,1))=0.5
    }
    SubShader
    {
        Tags { 
                "Queue"="Transparent"
                "RenderType"="Transparent" 
                "ForceNoShadowCasting"="True"       // 关闭阴影投射
                "IgnoreProjector"="True"            // 不响应投射器
                
              }
        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 sampler2D _NoiseTex;uniform float4 _NoiseTex_ST;
            uniform float _Cutout;
            uniform float _NoiseInt;
            uniform float _FlowSpeed;

            //输入结构
            struct VertexInput
            {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
                
            };
            //顶点输出结构
            struct VertexOutput 
            {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;         //采样主贴图
                float2 uv1 : TEXCOORD1;         //采样噪波图
            };
            //输出结构>>>顶点shader>>>输出结构
            VertexOutput vert (VertexInput v) 
            {
                VertexOutput o = (VertexOutput)0;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv0 = v.uv0;
                o.uv1 = TRANSFORM_TEX(v.uv0,_NoiseTex);
                o.uv1.y = o.uv1.y + frac(_Time.x) * _FlowSpeed;
                return o ;
            }
            //色彩输出结构
            float4 frag(VertexOutput i) : COLOR 
            {
                float4 var_mainTex = tex2D(_MainTex,i.uv0);
                float var_noiseTex = tex2D(_NoiseTex,i.uv1).r;
                float noise = lerp(1,var_noiseTex * 2,_NoiseInt);         // var_noiseTex * 2 == 将 noise 的值域 扩大到 0 - 2 .   并用lerp,加以控制。
                noise = max(0,noise); // 赋值截断,取消负值,就没有花花绿绿的东西了。
                float3 finalRGB = var_mainTex;
                float opacity = var_mainTex.a * _Cutout * noise;
                
                return float4(finalRGB*opacity,opacity);//这里注意,最后FinalRGB乘了一个 透贴,是因为开始没有预乘,这里做了预乘。(预乘:指 吧透贴和色彩都放在RGB中)
                //return noise;//输出噪波图
                //return opacity;//输出透明噪波图
            }
            ENDCG
        }
    }
}

3. 紫外線妨害効果の実現:

1. ゴーストワープのデモンストレーション:

1. 外乱。フロー コード セグメントに基づいて歪みマップが追加されます。ノイズ マップは単一チャネル歪みマップは 3 チャネルです

2. 歪んでいるのは UV です UV にはいくつかの成分があり、2 つの成分があり、成分が異なれば方向も異なります。したがって、ディストーション マップにはディストーションの方向を制御する 2 つのチャネルがあります (ここでは、テクスチャ サンプリングの計算量を削減するために、ノイズ マップをディストーション マップにマージしています)。

RG = 歪んだグラフ

B = ノイズマップ

3. 追加の歪み強度

2.ワープテックスの準備:ワープマップの作り方

3. GhostWarp をコード化します。

ここで、図に示すように、ガンマとライナーの 2 つの色空間で摂動効果が異なるという問題に遭遇しました。

解決策は2つあります

方法 1: ガンマ色空間に切り替えます。

方法 2: ライナー色空間を維持し、使用する画像を選択し、sRGB のチェックを外します。

ここで私は友人のグループに、ガンマとライナーの異なる色空間では、なぜ異なる UV オフセットが存在するのかを尋ねました。

友人のグループが説明のリンクを提供してくれました。

Gamma校正 - LearnOpenGL CN

これはおそらく、ハードウェア アルゴリズムにより、エンジンとディスプレイで Pow2.2 の色の明るさに違いが生じることを意味します。この Pow2.2 は、直線性の違いを補い、合理的な観察効果。(まだ読み終わっていないので、私の理解は大きく異なる可能性があります)

参考例画像:

 

4. GhostWarp をコード化します。

4. 業務委託:

1. 宿題:

おすすめ

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