AnyPortrait > スクリプト > カスタムシェーダー
AnyPortraitが提供するシェーダではなく、ユーザごとにシェーダを作成して使用する方法です。
カスタムシェーダの適用方法とベーキング方法については、関連ページを参照してください。
クリッピングマスクがあるかどうかによってシェーダコードを書く方法は2通りあります。
Shader "Custom Shader/Sample Transparent"
{
Properties
{
_Color("2X Color (RGBA Mul)", Color) = (0.5, 0.5, 0.5, 1.0)
_MainTex("Main Texture (RGBA)", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType" = "Transparent" "Queue" = "Transparent" "PreviewType" = "Plane" }
Blend SrcAlpha OneMinusSrcAlpha
LOD 200
CGPROGRAM
#pragma surface surf SimpleColor alpha
#pragma target 3.0
half4 LightingSimpleColor(SurfaceOutput s, half3 lightDir, half atten)
{
half4 c;
c.rgb = s.Albedo;
c.a = s.Alpha;
return c;
}
half4 _Color;
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
float4 color : COLOR;
};
void surf(Input IN, inout SurfaceOutput o)
{
half4 c = tex2D(_MainTex, IN.uv_MainTex);
c.rgb *= _Color.rgb * 2.0f;
o.Alpha = c.a * _Color.a;
o.Albedo = c.rgb;
}
ENDCG
}
}
1. Properties
_Color("2X Color (RGBA Mul)", Color) = (0.5, 0.5, 0.5, 1.0)
_MainTex("Main Texture (RGBA)", 2D) = "white" {}
: デフォルトでAnyPortraitは2つのプロパティーしか使用しません。
カラーアニメーションの 「_Color」プロパティとテクスチャを適用する 「_MainTex」プロパティを宣言します。
これらの2つのプロパティを外部的に制御すると、AnyPortraitのロジックと競合する可能性があります。
2. Blending
Blend SrcAlpha OneMinusSrcAlpha : Alpha Blend
Blend One One : Additive
Blend OneMinusDstColor One : Soft Additive
Blend DstColor SrcColor : Multiplicative
: AnyPortraitで使用される4つの「ブレンド (Blending)」メソッド。
上記のように記述したり、必要に応じて他のブレンド宣言を行うことができます。
3. Albedo, Alpha
half4 c = tex2D(_MainTex, IN.uv_MainTex);
c.rgb *= _Color.rgb * 2.0f;
o.Alpha = c.a * _Color.a;
o.Albedo = c.rgb;
: 色の計算は、デフォルトで「2X Multiply」を適用します。
RGBが2倍になり、アルファが乗算されて適用されます。
必要に応じて変更することはできますが、エディタのレンダリング結果と異なる場合があります。
Shader "Custom Shader/Sample Clipping Transparent"
{
Properties
{
_Color("2X Color (RGBA Mul)", Color) = (0.5, 0.5, 0.5, 1.0)
_MainTex("Base Texture (RGBA)", 2D) = "white" {}
_MaskTex("Mask Texture (A)", 2D) = "white" {}
_MaskScreenSpaceOffset("Mask Screen Space Offset (XY_Scale)", Vector) = (0, 0, 0, 1)
}
SubShader
{
Tags{ "RenderType" = "Transparent" "Queue" = "Transparent" "PreviewType" = "Plane"}
Blend SrcAlpha OneMinusSrcAlpha
LOD 200
CGPROGRAM
#pragma surface surf SimpleColor alpha
#pragma target 3.0
half4 LightingSimpleColor(SurfaceOutput s, half3 lightDir, half atten)
{
half4 c;
c.rgb = s.Albedo;
c.a = s.Alpha;
return c;
}
half4 _Color;
sampler2D _MainTex;
sampler2D _MaskTex;
float4 _MaskScreenSpaceOffset;
struct Input
{
float2 uv_MainTex;
float4 screenPos;
float4 color : COLOR;
};
void surf(Input IN, inout SurfaceOutput o)
{
half4 c = tex2D(_MainTex, IN.uv_MainTex);
c.rgb *= _Color.rgb * 2.0f;
float2 screenUV = IN.screenPos.xy / IN.screenPos.w;
screenUV -= float2(0.5f, 0.5f);
screenUV.x *= _MaskScreenSpaceOffset.z;
screenUV.y *= _MaskScreenSpaceOffset.w;
screenUV.x += _MaskScreenSpaceOffset.x * _MaskScreenSpaceOffset.z;
screenUV.y += _MaskScreenSpaceOffset.y * _MaskScreenSpaceOffset.w;
screenUV += float2(0.5f, 0.5f);
float mask = tex2D(_MaskTex, screenUV).r;
c.a *= mask;
o.Alpha = c.a * _Color.a;
o.Albedo = c.rgb;
}
ENDCG
}
}
1.Properties
_MaskTex("Mask Texture (A)", 2D) = "white" {}
_MaskScreenSpaceOffset("Mask Screen Space Offset (XY_Scale)", Vector) = (0, 0, 0, 1)
: クリッピングマスク処理のためにプロパティにマスクテクスチャを追加します。
AnyPortraitは自動的に上記のプロパティを追加してクリッピングレンダリングを処理します。
「_MaskScreenSpaceOffset」は、「Screen Space」に対してクリッピングマスクを適用するためのプロパティです
2. Screen Space Semantic
struct Input
{
float2 uv_MainTex;
float4 screenPos;
float4 color : COLOR;
};
: クリッピングマスクは「Screen Space」で処理されます。
したがって、Unityが使用する 「screenPos」変数を 「Fragment Shader」または 「Surface Shader」に渡す必要があります。
3. Mask
float2 screenUV = IN.screenPos.xy / IN.screenPos.w;
screenUV -= float2(0.5f, 0.5f);
screenUV.x *= _MaskScreenSpaceOffset.z;
screenUV.y *= _MaskScreenSpaceOffset.w;
screenUV.x += _MaskScreenSpaceOffset.x * _MaskScreenSpaceOffset.z;
screenUV.y += _MaskScreenSpaceOffset.y * _MaskScreenSpaceOffset.w;
screenUV += float2(0.5f, 0.5f);
float mask = tex2D(_MaskTex, screenUV).r;
c.a *= mask;
: クリッピングマスクを計算してアルファチャンネルに適用する式。
この式は、通常どおり処理するのと同じ方法で記述する必要があります。