Version: Unity 6.0 (6000.0)
  • 受支持
  • 旧版
语言 : 中文
在内置渲染管线中创建剪影
内置渲染管线中的阴影

自定义着色器如何在内置渲染管线中贡献光照贴图数据

本页包含有关如何使着色器与 Unity 的光照贴图兼容的信息。

Meta Pass

Meta Pass 是为全局光照系统提供反照率和自发光值的着色器通道。这些值与实时渲染中使用的值是分开的,这意味着您可以使用 Meta Pass 来控制游戏对象从光照烘焙系统的角度观察的外观,而不会影响游戏对象在运行时的外观。

这方面的一个很有用的例子是,您希望让悬崖上的绿色苔藓在光照贴图中生成夸张的绿色间接光,但又不想在着色器的实时通道中为地形重新着色。

Unity 的所有内置材质都具有 Meta Pass,并且标准着色器也包含 Meta Pass。如果使用了它们,则无需执行任何操作便会启用 Meta Pass。如果使用的是自定义着色器,您可以添加自己的 Meta Pass。

具有 Meta pass 的示例着色器

通过下面的着色器,可以指定仅由光照烘焙系统使用的反照率颜色和反照率纹理,而不会影响运行时的材质外观。在这个例子中,自发光是从 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"
}

Meta Pass 技术信息

Enlighten 实时全局光照和光线映射使用 Unity 的 Meta Pass 从表面提取反照率值,并通过在每次反弹时使用表面反照率来处理漫射传输。

具有黑色(或几乎黑色)反射率贴图的金属表面漫射的光很少。由于光照贴图程序仅处理漫射光传输,这意味着您从这些类型的表面看到的反射光可能很少。Unity 的内置 Meta Pass 提供了金属色调颜色的增强版本而不是物理上正确的反照率,从而解决了此问题。这意味着即使在金属性材质上能获得一些光线反弹。如果想要改变行为,则可以创建自定义的 Meta Pass。

内置的 Meta Pass 不处理光谱镜面反射。

注意:如果使用的是__ Enlighten__Geomerics 出品的光照系统,在 Unity 中用于 Enlighten 实时全局光照。更多信息
See in Glossary
实时全局光照,则播放器中的 Meta Pass 不如 DynamicGI.SetEmissive 快,但更灵活,因为您可以使用多种颜色。

自定义 RGB 透明度

默认情况下,Unity 中的着色器使用单色透明度。这意味着 Unity 使用材质颜色或反照率纹理的 Alpha 通道来计算材质的透光率。

在光线映射期间,可以改用自定义 RGB 透明度。这意味着 Unity 使用给定纹理的值来计算材质的透光率。当您希望基于颜色的透明度独立于材质颜色或反照率纹理时,例如,您想烘焙光照以模拟穿过彩色玻璃窗的光线的行为,这将非常有用。

要在光线映射期间使用自定义 RGB 透明度,请在 ShaderLab 代码中添加以下行:

_TransparencyLM ("Transmissive Texture", 2D) = "white" {}

这将创建一个名为"透射纹理"的材质属性,显示在材质检视面板中。将所需的纹理分配给此字段。

其他资源

在内置渲染管线中创建剪影
内置渲染管线中的阴影
版权所有 ©2005-2025 Unity Technologies. All rights reserved. Built from 6000065f1 (f34bf41fecc5). Built on: 2025年12月15日.

AltStyle によって変換されたページ (->オリジナル) /