Version: 6000.3
语言: 中文
在内置渲染管线中创建 cookie
内置渲染管线中的阴影

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

此页面包含有关如何制作的信息着色器在 GPU 上运行的程序。更多信息
请参阅术语表
与 Unity 的光照贴图器Unity 中的一种工具,可根据场景中光源和几何体的排列来烘焙光照贴图。更多信息
请参阅术语表
.

元通行证

元通道是一种着色器通道,它为反射率和发射值提供全局光照 一组对直接和间接光照进行建模以提供逼真的光照结果的技术。
请参阅术语表
系统。 这些值与实时渲染中使用的值是分开的,这意味着你可以使用 元通道(Meta Pass) 来控制游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
请参阅术语表
从光照烘焙系统的角度查看,而不会影响其在运行时的外观。

这很有用的一个示例是,如果您希望悬崖上的绿色苔藓在光照贴图一种预渲染的纹理,包含光源对场景中静态对象的效果。光照贴图覆盖在场景几何体之上以创建光照效果。更多信息
请参阅术语表
,但您不想重新着色地形场景中的地形。地形游戏对象会向场景添加一个大型平面,你可以使用地形的“检查器”窗口创建详细的地形。更多信息
请参阅术语表
在着色器的实时传递中。

Unity的所有内置材质都有一个Meta Pass,标准着色器包含一个Meta通道。如果你正在使用这些材质,则无需执行任何作即可启用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 Realtime Global Illumination 和光照贴图使用 Unity 的 Meta Pass 从表面提取反照率值,并通过在每次反弹时使用表面反照率来处理漫反射传输本身。

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

内置的元通道不处理光谱镜面反射率。

注意:如果您正在使用EnlightenGeomerics 的照明系统,用于 Unity 中用于 Enlighten 实时全局照明。更多信息
请参阅术语表
实时全局光照,播放器中的元通道不如 DynamicGI.SetEmissive 快,但它更灵活,因为你不局限于单一颜色。

自定义 RGB 透明度

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

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

要在光照贴图期间使用自定义 RGB 透明度,请将以下行添加到ShaderLabUnity 用于定义 Shader 对象结构的语言。更多信息
请参阅术语表
法典:

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

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

其他资源

在内置渲染管线中创建 cookie
内置渲染管线中的阴影