このページでは、Unity のライトマッパーと互換性のあるシェーダーを作成する方法を説明します。
メタパスは、グローバルイルミネーションシステムにアルベドと発光の値を提供するシェーダーパスです。これらの値はリアルタイムレンダリングで使用される値とは別のものです。つまり、メタパスを使用すれば、ランタイムのゲームオブジェクトの外観に影響を与えずに、ライティングベイクシステムの視点からゲームオブジェクトの外観を制御できます。
これは例えば、崖の上にある緑の苔に誇張した緑の間接光をライトマップで生成したいが、シェーダーのリアルタイムパスで 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 のシェーダーはモノクロの透明度を使用します。つまり、マテリアルの色またはアルベドテクスチャのアルファチャンネルを使用して、マテリアルの光透過率を評価します。
ライトマッピングでは、代わりにカスタムの RGB 透明度を使用できます。つまり、指定されたテクスチャの値を使用して、マテリアルの光透過率を評価します。これは、マテリアルの色やアルベドテクスチャに依存しない色ベースの透明度が必要な場合に便利です。例えば、ステンドグラスの窓から差し込むライトの動作をシミュレートするライティングをベイクする場合などです。
ライトマッピングでカスタムの RGB 透明度を使用するには、以下の行を ShaderLab コードに追加します。
_TransparencyLM ("Transmissive Texture", 2D) = "white" {}
これにより、マテリアルの Inspector に “Transmissive Texture” という名前の マテリアルプロパティ が作成されます。このフィールドに任意のテクスチャを割り当てます。