메타 패스는 프로그레시브 라이트매퍼 또는 인라이튼(지원 중단 예정)에 알베도 및 이미션 값을 제공하는 셰이더 패스이며, 이를 통해 해당 게임 오브젝트에서 간접 조명을 정확하게 계산할 수 있습니다. 게임 오브젝트가 라이트매핑 또는 실시간 전역 조명(지원 중단 예정)에서 작동하려면 게임 오브젝트가 셰이더에 메타 패스가 있는 머티리얼을 사용해야 합니다.
메타 패스는 텍스처 공간의 알베도 및 이미션 값을 제공합니다. 이러한 값은 실시간 렌더링에서 사용되는 값과 별개입니다. 즉 메타 패스를 사용하면 런타임 시 해당 형상에 영향을 주지 않고 조명 베이크 시스템의 시점에서 게임 오브젝트가 보이는 모습을 제어할 수 있습니다. 이는 절벽의 녹색 이끼가 라이트맵에 과장된 녹색 간접광을 생성하도록 만들고 싶지만, 실시간 셰이더 패스에서 터레인의 컬러를 다시 지정하고 싶지 않은 경우에 유용할 수 있습니다.
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"
}
Unity의 모든 기본 메타 패스에서 조명 베이크 시스템은 메타 패스를 사용하여 디퓨즈 및 메탈릭 표면을 처리합니다. 라이트매퍼는 디퓨즈 전송을 처리하고 각 반사마다 표면 알베도를 사용합니다. 검정색이거나 거의 검정색인 알베도의 금속성 표면은 광원을 반사하지 않습니다. 알베도를 렌더링하는 메타 셰이더 패스는 금속 색조를 사용하여 알베도를 더 밝은 컬러로 편향시킵니다. 나무, 플라스틱, 돌, 콘크리트, 가죽, 피부와 같은 유전체는 흰색 스페큘러 반사율을 가집니다. 금속은 분광 스페큘러 반사율을 가집니다. 다른 동작을 원하는 경우 커스텀 메타 패스를 생성할 수 있습니다.
참고: 인라이튼을 사용하는 경우 플레이어의 메타 패스가 DynamicGI.SetEmissive만큼 빠르지는 않지만 단일 컬러로 제한되지 않으므로 더 유연합니다.