Version: 6000.3
语言: 中文
在内置渲染管线中创建表面着色器
优化表面着色器

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

在内置渲染管线(Render Pipeline) 获取场景内容并将其显示在屏幕上的一系列作。Unity 允许您从预构建的渲染管道中进行选择,或编写自己的渲染管道。更多信息
请参阅术语表
,写作时表面着色器:为内置渲染管线编写着色器的简化方法。更多信息
请参阅术语表
,您可以描述表面的属性(例如反照率颜色和法线),然后“照明模型”将计算照明交互。

有两种内置照明模型:Lambert用于漫反射照明,以及BlinnPhong用于镜面反射照明。Unity 中的 Lighting.cginc 文件定义了这些模型(Windows:<unity 安装路径>/Data/CGIncludes/Lighting.cginc;macOS:/Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc)。

有时您可能想要使用自定义照明模型。您可以使用 Surface 执行此作着色器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);延迟着色 内置渲染管线中的渲染路径,对可能影响游戏对象的光源数量没有限制。所有光源都是按像素计算的,这意味着它们都与法线贴图等正确交互。此外,所有光源都可以有饼干和阴影。更多信息
    请参阅术语表
    路径。

请注意,不需要声明所有函数。照明模型要么使用视图方向,要么不使用视图方向。同样,如果光照模型仅在正向渲染中工作,则不要声明_Deferred功能。这可确保使用它的着色器仅编译为转发渲染。

自定义地理标志

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

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

请注意,要解码标准 Unity 光照贴图和 SH 探针,您可以使用内置的DecodeLightmapShadeSHPerPixel函数,如UnityGI_Base在 Unity 内的 UnityGlobalIllumination.cginc 文件中(Windows:<unity 安装路径>/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"
  }

下面是有纹理和没有纹理的外观,在场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表
:

使用漫反射纹理的着色器。 没有漫反射纹理的着色器。

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