在内置渲染管线一系列操作,用于获取场景的内容并在屏幕上显示它们。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"
}
以下是它在使用纹理和不使用纹理的情况下,以及在场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置环境、障碍物和装饰,本质上是分段设计和构建您的游戏。 更多信息
参见 术语表中存在一个方向光时的情况。