Zhuang Dong の TA メモ (13) <特殊効果 - ブレンド モード: 4 つの主要な透明チャンネルの使用法AC、AB、AD、カスタム ブレンド>
結果を示す:
文章:
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層を例にSrcとDstの関係を説明します。
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
}
}
}