このページには、Unity のライトマッパーに対応するシェーダーの作成方法を記載しています。
メタパス (Meta Pass) とは、グローバルイルミネーションシステムにアルベド値とエミッション (発光) 値を提供するシェーダーパスのことです。これらの値はリアルタイムレンダリングで使用される値とは別のものです。つまり、メタパスを使用して、ランタイムでの見た目に影響を与えることなく、ライティングベイクシステムの視点からのゲームオブジェクトの見え方を制御することができます。
例えば、“崖の上にある緑の苔に、誇張した緑の間接光をライトマップ内で生成させたいが、シェーダーのリアルタイムパスで 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 {
// ------------------------------------------------------------------
// Extracts information for lightmapping, GI (emission, albedo, ...)
// This pass is not used during regular rendering.
Pass
{
Name "META"
Tags {"LightMode"="Meta"}
Cull Off
CGPROGRAM
#include"UnityStandardMeta.cginc"
sampler2D _GIAlbedoTex;
fixed4 _GIAlbedoColor;
float4 frag_meta2 (v2f_meta i): SV_Target
{
// We're interested in diffuse & specular colors
// and surface roughness to produce final albedo.
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
// Physically-based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows nometa
// Use Shader model 3.0 target, to get nicer looking lighting
#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 comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex)* _Color;
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
Enlighten リアルタイムグローバルイルミネーションとライトマッピングは、Unity のメタパスを使用してサーフェスからアルベド値を抽出し、各バウンスのサーフェスアルベドを使用して拡散輸送を自ら処理します。
黒色 (あるいはほぼ黒色) のアルベドを持つ金属サーフェスは、光をほとんど拡散反射させません。ライトマッパーは拡散光の輸送のみを扱うため、これは、このタイプのサーフェスから跳ね返される光は少ししか見えないことを意味します。Unity のビルトインのメタパスはこの点を考慮し、物理的に正しいアルベドではなく、ブーストされたバージョンの金属色相カラーを提供します。つまり、メタリックマテリアルからもある程度の反射が得られます。異なる動作が必要な場合は、カスタムのメタパスを作成することも可能です。
ビルトインのメタパスは、スペクトルの鏡面反射を扱えません。
ノート: Enlighten を使用している場合は、プレイヤー内のメタパスは DynamicGI.SetEmissive ほど高速ではありませんが、単一の色に制約されないため、より柔軟です。
デフォルトでは Unity のシェーダーはモノクロの透明度を使用します。つまり Unity は、マテリアルの光透過率の評価に、マテリアルの色またはアルベドテクスチャのアルファチャンネルを使用します。
ライトマッピング中に代替としてカスタムの RGB 透明度を使用することができます。これは、Unity が、指定のテクスチャの値を使用してマテリアルの光透過率を評価することを意味します。これは、マテリアルの色やアルベドテクスチャに依存しない色ベースの透明度が必要な場合 (例えば、ステンドグラスの窓から差し込む光の動作をシミュレートするライティングをベイクしたい場合など) に役立ちます。
ライトマッピング中にカスタム RGB 透明度を使用するには、以下の行を ShaderLab のコードに追加します。
_TransparencyLM ("Transmissive Texture", 2D) = "white" {}
これによって、マテリアルのインスペクターに “Transmissive Texture” という名前で表示される マテリアルプロパティ が作成されます。このフィールドに、任意のテクスチャを割り当ててください。