在内置渲染管线一系列操作,用于获取场景的内容并在屏幕上显示它们。Unity 允许您选择预构建的渲染管线,或编写您自己的渲染管线。 更多信息
参见 术语表中,当编写表面着色器一种简化的方法,用于为内置渲染管线编写着色器。 更多信息
参见 术语表时,您描述了表面的属性(例如反照率颜色和法线),而**光照模型**则计算光照交互。
有两个内置光照模型:Lambert 用于漫反射光照,BlinnPhong 用于镜面反射光照。Unity 内部的 Lighting.cginc 文件定义了这些模型(Windows:<unity install path>/Data/CGIncludes/Lighting.cginc;macOS:/Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc)。
有时您可能希望使用自定义光照模型。您可以使用表面着色器在 GPU 上运行的程序。 更多信息
参见 术语表来实现。光照模型仅仅是几个符合某些约定的 Cg/HLSL 函数。
| 功能名称 | 通用渲染管线 (URP) | 高清渲染管线 (HDRP) | 自定义 SRP | 内置渲染管线 | 
|---|---|---|---|---|
| 表面着色器 | 否 有关在 URP 中创建着色器对象的简化方法,请参见着色器图。 | 否 有关在 HDRP 中创建着色器对象的简化方法,请参见着色器图。 | 否 | 是 | 
光照模型由名称以 Lighting 开头的常规函数组成。您可以在着色器文件的任何位置或包含文件之一中声明它们。这些函数是
half4 Lighting<Name> (SurfaceOutput s, UnityGI gi); 在前向渲染路径渲染管线用于渲染图形的技术。选择不同的渲染路径会影响光照和阴影的计算方式。某些渲染路径比其他渲染路径更适合不同的平台和硬件。 更多信息
参见 术语表中使用,用于**不**依赖于视角方向的光照模型。
half4 Lighting<Name> (SurfaceOutput s, half3 viewDir, UnityGI gi); 在前向渲染一种渲染路径,根据影响对象的光源以一次或多次传递渲染每个对象。光源本身也会根据其设置和强度在前向渲染中以不同的方式处理。 更多信息
参见 术语表路径中使用,用于**依赖于**视角方向的光照模型。
half4 Lighting<Name>_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal); 在延迟着色内置渲染管线中的一种渲染路径,它对可以影响游戏对象的灯光数量没有限制。所有灯光都以每个像素的方式进行评估,这意味着它们都与法线贴图等正确交互。此外,所有灯光都可以具有 Cookie 和阴影。 更多信息
参见 术语表路径中使用。
请注意,您不需要声明所有函数。光照模型要么使用视角方向,要么不使用。类似地,如果光照模型仅在前向渲染中有效,请勿声明 _Deferred 函数。这可以确保使用它的着色器仅编译到前向渲染。
声明以下函数以自定义解码光照贴图预渲染的纹理,其中包含光源对场景中静态对象的影响。光照贴图覆盖在场景几何体上以创建光照效果。 更多信息
参见 术语表数据和探针
half4 Lighting<Name>_GI (SurfaceOutput s, UnityGIInput data, inout UnityGI gi);请注意,要解码标准的 Unity 光照贴图和 SH 探针,您可以使用内置的 DecodeLightmap 和 ShadeSHPerPixel 函数,如 Unity 内部的 UnityGlobalIllumination.cginc 文件中的 UnityGI_Base 所示(Windows:<unity install path>/Data/CGIncludes/UnityGlobalIllumination.cginc;macOS:/Applications/Unity/Unity.app/Contents/CGIncludes/UnityGlobalIllumination.cginc_)。
以下是一个使用内置 Lambert 光照模型的着色器示例
  Shader "Example/Diffuse Texture" {
    Properties {
      _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert
      
      struct Input {
          float2 uv_MainTex;
      };
      
      sampler2D _MainTex;
      
      void surf (Input IN, inout SurfaceOutput o) {
          o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
      }
      ENDCG
    }
    Fallback "Diffuse"
  }
以下是它在使用纹理和不使用纹理的情况下,以及在场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置环境、障碍物和装饰,本质上是分段设计和构建您的游戏。 更多信息
参见 术语表中存在一个方向光时的情况。
 
