커스텀 URP(유니버설 렌더 파이프라인) 셰이더에서 그림자를 사용하려면 다음 과정을 따르십시오.
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
}
}
}