メタパスはプログレッシブライトマッパーや 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 は単一の色に限定されるものではないので、より柔軟です。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.