メタパスはプログレッシブライトマッパーや Enlighten (非推奨) にアルベドとエミッションの値を提供するシェーダーパスで、ゲームオブジェクトから間接ライティングを正しく計算することができます。ゲームオブジェクトに ライトマッピング や リアルタイムのグローバルイルミネーション (非推奨) を適用するには、ゲームオブジェクトはシェーダーにメタパスを持つマテリアルを使用する必要があります。
メタパスは、テクスチャ空間でアルベドとエミッションの値を提供します。これらの値は、リアルタイムレンダリングで使用される値とは別のものです。つまり、メタパスを使用して、ランタイムの外観に影響を与えずに、ゲームのオブジェクトをライティングのベイクシステムから制御することができます。例えば、崖の上の緑の苔でライトマップの誇張した緑の間接光を生成したいが、シェーダーのリアルタイムパスで Terrain (地形) の色を変更したくない場合に役立ちます。
Unity のすべてのビルトインマテリアルにはメタパスがあり、そしてスタンダードシェーダーは、メタパスが含まれています。これらを使用している場合は、メタパスを有効にするために何もする必要はありません。カスタムシェーダーを使用している場合は、独自のメタパスを追加できます。
下のシェーダーでは、ランタイムにマテリアルの外観に影響を与えることなく、ライティングのベイクシステムでのみ使用されるアルベド色とアルベドテクスチャを指定できます。この例では、放出は UV から取得されますが、それを制御するためにどんな値でも使用できます。
Shader "Custom/metaPassShader"{
Properties {
_Color ("Color", Color)=(1,1,1,1)
_MainTex ("Albedo (RGB)",2D)="white"{}
_Glossiness ("Smoothness", Range(0,1))=0.5
_Metallic ("Metallic", Range(0,1))=0.0
_GIAlbedoColor ("Color Albedo (GI)", Color)=(1,1,1,1)
_GIAlbedoTex ("Albedo (GI)",2D)="white"{}
}
SubShader {
// ------------------------------------------------------------------
// ライトマッピング、 GI (エミッション、アルベド、 ...) の情報を抽出
// このパスは通常のレンダリングの間には使用されません。
Pass
{
Name "META"
Tags {"LightMode"="Meta"}
Cull Off
CGPROGRAM
#include"UnityStandardMeta.cginc"
sampler2D _GIAlbedoTex;
fixed4 _GIAlbedoColor;
float4 frag_meta2 (v2f_meta i): SV_Target
{
// ディフューズ色とスペキュラー色と
// サーフェスの粗さで、最終的なアルベドを求めます。
FragmentCommonData data = UNITY_SETUP_BRDF_INPUT (i.uv);
UnityMetaInput o;
UNITY_INITIALIZE_OUTPUT(UnityMetaInput, o);
fixed4 c = tex2D (_GIAlbedoTex, i.uv);
o.Albedo = fixed3(c.rgb * _GIAlbedoColor.rgb);
o.Emission = Emission(i.uv.xy);
return UnityMetaFragment(o);
}
#pragma vertex vert_meta
#pragma fragment frag_meta2
#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature ___ _DETAIL_MULX2
ENDCG
}
Tags {"RenderType"="Opaque"}
LOD 200
CGPROGRAM
// 物理ベースの標準ライティングモデル。すべてのライトの種類で影は有効
#pragma surface surf Standard fullforwardshadows nometa
// 体裁のよいライティングを得るためにシェーダーモデル 3.0 target を使用。
#pragma target 3.0
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
void surf (Input IN,inout SurfaceOutputStandard o){
// カラーで色付けされたテクスチャからAlbedo を求める
fixed4 c = tex2D (_MainTex, IN.uv_MainTex)* _Color;
o.Albedo = c.rgb;
// Metallic と smoothness をスライダーの値から求める
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
Unity のデフォルトのメタパスすべてにおいて、ライティングのベイクシステムはメタパスを使用して、ディフューズとメタリックの両方のサーフェスのアルベドを処理します。ライトマッパーは拡散輸送を処理し、各反射でサーフェスアルベドを使用します。黒 (またはほぼ黒) のアルベドを持つメタリックなサーフェスは、ライトをまったく反射しません。アルベドをレンダリングするメタシェーダーパスは、アルベドをメタルの色相でより明るい色に見せかけます。誘電体 (木材、プラスチック、プラスチック、石、コンクリート、革、皮) は白い鏡面反射をします。メタルには、スペクトルの鏡面反射があります。別の動作が必要な場合は、カスタムのメタパスを作成できます。
ノート: Enlighten を使用する場合は、プレイヤーのメタパスは DynamicGI.SetEmissive ほど高速ではありません。ただし、Enlighten は単一の色に限定されるものではないので、より柔軟です。