包含此页的版本:
不含此页的版本:
在自定义通用中使用照明渲染管线(Render Pipeline) 获取场景内容并将其显示在屏幕上的一系列作。Unity 允许您从预构建的渲染管道中进行选择,或编写自己的渲染管道。更多信息
请参阅术语表(URP)着色器在 GPU 上运行的程序。更多信息
请参阅术语表,请按照下列步骤作:
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"在HLSLPROGRAM在着色器文件中。这Lighting.hlsl文件导入RealtimeLights.hlsl文件,其中包含以下方法。
| 方法 | 语法 | 描述 |
|---|---|---|
GetMainLight |
Light GetMainLight() |
返回场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息 请参阅术语表. |
GetAdditionalLight |
Light GetAdditionalLight(uint lightIndex, float3 positionInWorldSpace) |
返回lightIndex影响positionWS.例如,如果lightIndex是0,则此方法返回第一个附加光源。 |
GetAdditionalLightsCount |
int GetAdditionalLightsCount() |
返回附加灯的数量。注意:此函数始终在 Forward+ 中返回 0渲染路径渲染管道用于渲染图形的技术。选择不同的渲染路径会影响照明和着色的计算方式。某些渲染路径比其他路径更适合不同的平台和硬件。更多信息 请参阅术语表.有关更多信息,请参阅迭代 Forward+ 渲染路径中的其他光源。 |
有关可用于计算阴影的这些方法的版本的信息,请参阅在自定义 URP 着色器中使用阴影。
| 方法 | 语法 | 描述 |
|---|---|---|
LightingLambert |
half3 LightingLambert(half3 lightColor, half3 lightDirection, half3 surfaceNormal) |
返回使用朗伯模型计算的表面法线的漫反射光照。 |
LightingSpecular |
half3 LightingSpecular(half3 lightColor, half3 lightDirection, half3 surfaceNormal, half3 viewDirection, half4 specularAmount, half smoothnessAmount) |
使用简单着色返回表面法线的镜面反射光照。 |
这Lighting.hlsl文件导入AmbientOcclusion.hlsl文件,其中包含以下方法。
| 方法 | 语法 | 描述 |
|---|---|---|
SampleAmbientOcclusion |
half SampleAmbientOcclusion(float2 normalizedScreenSpaceUV) |
返回屏幕空间中位置的环境光遮挡值,其中 0 表示遮挡,1 表示未遮挡。 |
GetScreenSpaceAmbientOcclusion |
AmbientOcclusionFactor GetScreenSpaceAmbientOcclusion(float2 normalizedScreenSpaceUV) |
返回屏幕空间中位置的间接和直接环境光遮挡值,其中 0 表示遮挡,1 表示未遮挡。 |
指环境光遮挡一种近似环境光(不是来自特定方向的光)可以照射到表面上的某个点的量的方法。
请参阅术语表了解更多信息。
使用GetScreenSpaceAmbientOcclusion方法返回此结构体。
| 田 | 描述 |
|---|---|
half indirectAmbientOcclusion |
对象因对象阻挡间接光而导致的环境光遮挡而处于阴影中的量。 |
half directAmbientOcclusion |
对象因对象阻挡直射光而导致的环境光遮挡而处于阴影中的量。 |
使用GetMainLight和GetAdditionalLight返回此结构的方法。
| 田 | 描述 |
|---|---|
half3 direction |
光的方向。 |
half3 color |
灯光的颜色。 |
float distanceAttenuation |
光的强度,基于其与物体的距离。 |
half shadowAttenuation |
光线的强度,基于对象是否在阴影中。 |
uint layerMask |
这图层遮罩定义要从作(例如渲染、碰撞或您自己的代码)中包含或排除哪些图层的值。更多信息 请参阅术语表光的。 |
以下 URP 着色器使用对象表面从主定向光接收到的光量绘制对象表面。
Shader "Custom/LambertLighting"
{
SubShader
{
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
float2 uv: TEXCOORD0;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float2 uv: TEXCOORD0;
half3 lightAmount : TEXCOORD2;
};
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionCS = TransformObjectToHClip(IN.positionOS.xyz);
// Get the VertexNormalInputs of the vertex, which contains the normal in world space
VertexNormalInputs positions = GetVertexNormalInputs(IN.positionOS);
// Get the properties of the main light
Light light = GetMainLight();
// Calculate the amount of light the vertex receives
OUT.lightAmount = LightingLambert(light.color, light.direction, positions.normalWS.xyz);
return OUT;
}
half4 frag(Varyings IN) : SV_Target
{
// Set the fragment color to the interpolated amount of light
return float4(IN.lightAmount, 1);
}
ENDHLSL
}
}
}