要在自定义通用渲染管线一系列操作,它们会获取场景的内容并将其显示在屏幕上。Unity 允许您选择预先构建的渲染管线,或自己编写。 更多信息
参见 术语表 (URP) 着色器在 GPU 上运行的程序。 更多信息
参见 术语表中使用阴影,请按照以下步骤操作
HLSLPROGRAM
中添加 #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
。Core.hlsl
文件会导入 Shadows.hlsl
和 RealtimeLights.hlsl
文件。使用这些方法将位置转换成阴影贴图位置。
方法 | 语法 | 说明 |
---|---|---|
GetShadowCoord |
float4 GetShadowCoord(VertexPositionInputs vertexInputs) |
将顶点位置转换成阴影空间。有关 VertexPositionInputs 结构的信息,请参阅 在自定义 URP 着色器中变换位置。 |
TransformWorldToShadowCoord |
float4 TransformWorldToShadowCoord(float3 positionInWorldSpace) |
将世界空间中的位置转换成阴影空间。 |
以下方法会使用阴影贴图计算阴影。若要使用这些方法,请首先按照以下步骤操作
ShadowCaster
着色器通道的对象,例如使用 Universal Render Pipeline/Lit
着色器对象。#pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN
,以使它能够访问主光源的阴影贴图。#pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS
,以使它能够访问附加光源的阴影贴图。方法 | 语法 | 说明 |
---|---|---|
GetMainLight |
Light GetMainLight(float4 shadowCoordinates) |
返回场景中的主光源,其中 shadowAttenuation 值基于阴影坐标处的方位是否在影子里。 |
ComputeCascadeIndex |
half ComputeCascadeIndex(float3 positionInWorldSpace) |
返回世界空间中某方位的阴影级联的索引。有关更多信息,请参考 阴影级联。 |
MainLightRealtimeShadow |
half MainLightRealtimeShadow(float4 shadowCoordinates) |
返回坐标处主阴影贴图中的阴影值。有关更多信息,请参考 阴影映射。 |
AdditionalLightRealtimeShadow |
half AdditionalLightRealtimeShadow(int lightIndex, float3 positionInWorldSpace) |
返回世界空间中某方位的附加光源阴影贴图中的阴影值。 |
GetMainLightShadowFade |
half GetMainLightShadowFade(float3 positionInWorldSpace) |
返回主光源的阴影淡化量,它基于方位与 摄像机一种组件,可以在场景中创建特定视点的图像。输出要么绘制到屏幕,要么被捕获为纹理。 更多信息 参见 术语表 之间的距离。 |
GetAdditionalLightShadowFade |
half GetAdditionalLightShadowFade(float3 positionInWorldSpace) |
返回附加光源的阴影淡化量,它基于方位与摄像机之间的距离。 |
ApplyShadowBias |
float3 ApplyShadowBias(float3 positionInWorldSpace, float3 normalWS, float3 lightDirection) |
为世界空间中的方位添加阴影偏差。有关更多信息,请参考 阴影故障排除。 |
以下 URP 着色器在表面上绘制简单的阴影。
为了生成阴影,请确保场景中有带有 ShadowCaster
着色器通道的对象,例如使用 Universal Render Pipeline/Lit
着色器的对象。
Shader "Custom/SimpleShadows"
{
SubShader
{
Tags { "RenderType" = "AlphaTest" "RenderPipeline" = "UniversalPipeline" }
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float4 shadowCoords : TEXCOORD3;
};
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionCS = TransformObjectToHClip(IN.positionOS.xyz);
// Get the VertexPositionInputs for the vertex position
VertexPositionInputs positions = GetVertexPositionInputs(IN.positionOS.xyz);
// Convert the vertex position to a position on the shadow map
float4 shadowCoordinates = GetShadowCoord(positions);
// Pass the shadow coordinates to the fragment shader
OUT.shadowCoords = shadowCoordinates;
return OUT;
}
half4 frag(Varyings IN) : SV_Target
{
// Get the value from the shadow map at the shadow coordinates
half shadowAmount = MainLightRealtimeShadow(IN.shadowCoords);
// Set the fragment color to the shadow value
return shadowAmount;
}
ENDHLSL
}
}
}