Version: 6000.3
语言: 中文
在自定义 URP 着色器中使用摄像机
在自定义URP着色器中使用间接光照

在自定义 URP 着色器中使用光照

在自定义通用中使用照明渲染管线(Render Pipeline) 获取场景内容并将其显示在屏幕上的一系列作。Unity 允许您从预构建的渲染管道中进行选择,或编写自己的渲染管道。更多信息
请参阅术语表
(URP)着色器在 GPU 上运行的程序。更多信息
请参阅术语表
,请按照下列步骤作:

  1. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"HLSLPROGRAM在着色器文件中。
  2. 使用以下部分中的任何方法。

获取轻量级数据

Lighting.hlsl文件导入RealtimeLights.hlsl文件,其中包含以下方法。

方法 语法 描述
GetMainLight Light GetMainLight() 返回场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表
.
GetAdditionalLight Light GetAdditionalLight(uint lightIndex, float3 positionInWorldSpace) 返回lightIndex影响positionWS.例如,如果lightIndex0,则此方法返回第一个附加光源。
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 表示未遮挡。

环境光遮挡一种近似环境光(不是来自特定方向的光)可以照射到表面上的某个点的量的方法。
请参阅术语表
了解更多信息。

结构体

环境光遮挡因子(AmbientOcclusionFactor)

使用GetScreenSpaceAmbientOcclusion方法返回此结构体。

描述
half indirectAmbientOcclusion 对象因对象阻挡间接光而导致的环境光遮挡而处于阴影中的量。
half directAmbientOcclusion 对象因对象阻挡直射光而导致的环境光遮挡而处于阴影中的量。

使用GetMainLightGetAdditionalLight返回此结构的方法。

描述
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
        }
    }
}

其他资源

在自定义 URP 着色器中使用摄像机
在自定义URP着色器中使用间接光照