版本:Unity 6 (6000.0)
语言:English
在内置渲染管线中创建表面着色器
优化表面着色器

在内置渲染管线中的表面着色器中设置光照模型

在内置渲染管线一系列操作,用于获取场景的内容并在屏幕上显示它们。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 开头的常规函数组成。您可以在着色器文件的任何位置或包含文件之一中声明它们。这些函数是

  1. half4 Lighting<Name> (SurfaceOutput s, UnityGI gi); 在前向渲染路径渲染管线用于渲染图形的技术。选择不同的渲染路径会影响光照和阴影的计算方式。某些渲染路径比其他渲染路径更适合不同的平台和硬件。 更多信息
    参见 术语表
    中使用,用于**不**依赖于视角方向的光照模型。

  2. half4 Lighting<Name> (SurfaceOutput s, half3 viewDir, UnityGI gi);前向渲染一种渲染路径,根据影响对象的光源以一次或多次传递渲染每个对象。光源本身也会根据其设置和强度在前向渲染中以不同的方式处理。 更多信息
    参见 术语表
    路径中使用,用于**依赖于**视角方向的光照模型。

  3. half4 Lighting<Name>_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal);延迟着色内置渲染管线中的一种渲染路径,它对可以影响游戏对象的灯光数量没有限制。所有灯光都以每个像素的方式进行评估,这意味着它们都与法线贴图等正确交互。此外,所有灯光都可以具有 Cookie 和阴影。 更多信息
    参见 术语表
    路径中使用。

请注意,您不需要声明所有函数。光照模型要么使用视角方向,要么不使用。类似地,如果光照模型仅在前向渲染中有效,请勿声明 _Deferred 函数。这可以确保使用它的着色器仅编译到前向渲染。

自定义 GI

声明以下函数以自定义解码光照贴图预渲染的纹理,其中包含光源对场景中静态对象的影响。光照贴图覆盖在场景几何体上以创建光照效果。 更多信息
参见 术语表
数据和探针

  1. half4 Lighting<Name>_GI (SurfaceOutput s, UnityGIInput data, inout UnityGI gi);

请注意,要解码标准的 Unity 光照贴图和 SH 探针,您可以使用内置的 DecodeLightmapShadeSHPerPixel 函数,如 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"
  }

以下是它在使用纹理和不使用纹理的情况下,以及在场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置环境、障碍物和装饰,本质上是分段设计和构建您的游戏。 更多信息
参见 术语表
中存在一个方向光时的情况。

在内置渲染管线中创建表面着色器
优化表面着色器