版本:Unity 6 (6000.0)
语言:英语
在内置渲染管线中创建光饼
在内置渲染管线中配置阴影分辨率

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

本页面包含有关如何使着色器在 GPU 上运行的程序。 更多信息
参见 术语表
与 Unity 的光照贴图器Unity 中用于根据场景中灯光和几何体的排列烘焙光照贴图的工具。 更多信息
参见 术语表
兼容的信息。

Meta Pass

Meta Pass 是一个着色器通道,它向全局光照一组模拟直接光和间接光以提供逼真光照效果的技术。
参见 术语表
系统提供漫反射色和自发光值。这些值与实时渲染中使用的值不同,这意味着您可以使用 Meta Pass 来控制游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、航点等等。游戏对象的功用由附加到它的组件来定义。 更多信息
参见 术语表
从光照烘焙系统角度看起来的样子,而不会影响其在运行时的外观。

一个有用的例子是,如果您希望悬崖上的绿色苔藓在您的光照贴图预渲染的纹理,包含光源对场景中静态对象的影响。光照贴图叠加在场景几何体上以创建光照效果。 更多信息
参见 术语表
中产生夸张的绿色间接光,但您又不想在着色器的实时通道中重新着色地形场景中的景观。地形游戏对象会向您的场景添加一个大的平面,您可以使用地形的检查器窗口来创建详细的景观。 更多信息
参见 术语表

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 不处理光谱镜面反射。

注意:如果您正在使用EnlightenGeomerics 在 Unity 中用于 Enlighten 实时全局光照的照明系统。 更多信息
参见 术语表
实时全局光照,播放器中的 Meta Pass 并不像DynamicGI.SetEmissive 那样快,但它更灵活,因为您不受限于单一颜色。

自定义 RGB 透明度

默认情况下,Unity 中的着色器使用单色透明度。这意味着 Unity 使用材质颜色或漫反射纹理的 alpha 通道来评估光线穿过材质的传输。

在光照贴图期间,您可以改为使用自定义 RGB 透明度。这意味着 Unity 使用给定纹理的值来评估光线穿过材质的传输。当您想要与材质颜色或漫反射纹理无关的基于颜色的透明度时,这很有用;例如,如果您想烘焙模拟光线穿过彩色玻璃窗行为的光照。

要在光照贴图期间使用自定义 RGB 透明度,请将以下行添加到您的ShaderLabUnity 用于定义着色器对象结构的语言。 更多信息
参见 术语表
代码中

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

这将创建一个材质属性,该属性将出现在材质检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。 更多信息
参见 术语表
中,名称为“Transmissive Texture”。将所需的纹理分配给此字段。

其他资源

在内置渲染管线中创建光饼
在内置渲染管线中配置阴影分辨率