荘東の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 OneとBlend 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 オフセットが存在するのかを尋ねました。
友人のグループが説明のリンクを提供してくれました。
これはおそらく、ハードウェア アルゴリズムにより、エンジンとディスプレイで Pow2.2 の色の明るさに違いが生じることを意味します。この Pow2.2 は、直線性の違いを補い、合理的な観察効果。(まだ読み終わっていないので、私の理解は大きく異なる可能性があります)
参考例画像: