Настройка того, как шейдеры вносят данные в Lightmap в встроенном Render Pipeline
Эта страница содержит информацию о том, как сделать шейдеры совместимыми с lightmappers Unity.
Мета-пасс
Meta Pass — это проход Shader, который предоставляет значения альбедо и эмиссии системе Global Illumination. Эти значения отличаются от тех, которые используются в рендеринге в реальном времени, то есть вы можете использовать Meta Pass для управления тем, как GameObject выглядит с точки зрения системы освещения, не влияя на его внешний вид во время выполнения.
Примером того, когда это было бы полезно, если вы хотели, чтобы зеленый мох на скале генерировал преувеличенный зеленый косвенный свет в ваших lightmaps, но вы не хотели перекрасить местность в реальном времени прохождения шейдера.
Все встроенные материалы Unity имеют Meta Pass, а Standard Shader содержит Meta pass. Если вы используете эти, вам не нужно делать ничего, чтобы включить Meta Pass. Если вы используете пользовательский Shader, вы можете добавить свой собственный Meta Pass.
Пример шейдера с мета-проходом
Приведенный ниже Shader позволяет указать цвет альбедо и текстуру альбедо, которые используются только системой освещения, не влияя на внешний вид Материала во время выполнения. В этом примере эмиссии взяты из UVs; но любое значение может быть использовано для управления ими.
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"
}
Техническая информация Meta Pass
Enlighten Realtime Global Illumination и lightmapping используют Meta Pass Unity для извлечения значений альбедо с поверхностей и обработки диффузного транспорта сами по себе, используя поверхностное альбедо на каждом отскоке.
Металлические поверхности с чёрным (или почти чёрным) альбедо отражают очень мало света диффузно. Поскольку lightmappers обрабатывают только диффузный транспорт света, это означает, что вы можете увидеть очень мало отраженного света от этих типов поверхностей. Unity встроенные Meta Passes учитывают это, предоставляя усиленный вариант цвета металлического оттенка вместо физически корректного альбедо. Это означает, что вы получаете некоторое отражение даже от металлических материалов. Если вы хотите другое поведение, вы можете создать пользовательский meta pass.
Встроенные мета-пропуски не обрабатывают спектральное зеркальное отражение.
Примечание: Если вы используете Enlighten Realtime Global Illumination, мета-проход в плеере не так быстр, как DynamicGI.SetEmissive, но он более гибкий, так как вы не ограничены одним цветом.
Пользовательские RGB прозрачность
По умолчанию шейдеры в Unity используют монохромную прозрачность. Это означает, что Unity использует альфа-канал цвета материала или текстуру альбедо для оценки пропускания света через материал.
Во время lightmapping, вы можете использовать пользовательскую прозрачность RGB вместо этого. Это означает, что Unity использует значения данной текстуры для оценки пропускания света через материал. Это полезно, когда вы хотите прозрачность на основе цвета, независимую от цвета материала или текстуры альбедо; например, если вы хотите запекание освещения, которое симулирует поведение света, проходящего через витраж.
Использовать пользовательские RGB прозрачности во время lightmapping, добавьте следующую строку к вашему ShaderLab код:
_TransparencyLM ("Transmissive Texture", 2D) = "white" {}
Это создает материальная собственность в материале Inspector с названием “Transmissive Texture”. Назначьте в этом поле желаемую текстуру.