게임 오브젝트는 프로그레시브 라이트매퍼나 인라이튼 베이크된 또는 실시간 전역 조명에 의해 계산된 조명을 받거나 기여하기 위해 셰이더에 메타 패스가 있는 머티리얼을 사용해야 합니다.
메타 패스는 전역 조명 시스템에 알베도 및 이미션 값을 제공하는 셰이더 패스입니다. 이 값은 실시간 렌더링에 사용되는 값과 별개입니다. 즉, 메타 패스를 사용하여 런타임 시 형상에 영향을 주지 않고 조명 베이킹 시스템의 시점에서 게임 오브젝트가 어떻게 보이는지 제어할 수 있습니다.
유용한 예를 들어 보면 절벽의 녹색 이끼가 라이트맵에서 과장된 녹색 간접광을 생성하기 원했지만 실시간 셰이더 패스에서 터레인을 다시 채색하고 싶지 않은 경우입니다.
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의 메타 패스를 사용하여 표면에서 알베도 값을 추출하고 각 바운스에서 표면 알베도를 사용하여 직접 디퓨즈 전송을 처리합니다.
검은색(또는 거의 검은색에 가까운) 알베도를 가진 메탈릭 표면은 매우 작은 산란광을 반사합니다. 라이트매퍼는 산란광 전송만 처리하기 때문에 이런 유형의 표면에서 반사광이 거의 보이지 않을 수 있습니다. Unity의 빌트인 메타 패스는 물리적으로 정확한 알베도 대신에 강화된 버전의 Metal 색상 컬러를 제공하여 이를 설명합니다. 이것은 메탈릭 머티리얼에서도 약간의 바운스를 얻을 수 있음을 의미합니다. 다른 동작을 원하면 커스텀 메타 패스를 만들 수 있습니다.
빌트인 메타 패스는 분광 스페큘러 반사율을 처리하지 않습니다.
참고: 인라이튼 실시간 전역 조명을 사용하는 경우 플레이어의 메타 패스는 DynamicGI.SetEmissive만큼 빠르지 않지만 단일 컬러로 제한되지 않기 때문에 더 유연합니다.