커스텀 URP(유니버설 렌더 파이프라인) 셰이더에서 조명을 사용하려면 다음 과정을 따르십시오.
HLSLPROGRAM 안에 #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"을 추가합니다.
Lighting.hlsl 파일은 다음 메서드가 포함된 RealtimeLights.hlsl 파일을 임포트합니다.
| 메서드 | 구문 | 설명 |
|---|---|---|
GetMainLight |
Light GetMainLight() |
씬의 메인 조명을 반환합니다. |
GetAdditionalLight |
Light GetAdditionalLight(uint lightIndex, float3 positionInWorldSpace) |
positionWS에 영향을 미치는 lightIndex 추가 조명을 반환합니다. 예를 들어 lightIndex가 0인 경우 이 메서드는 첫 번째 추가 조명을 반환합니다. |
GetAdditionalLightsCount |
int GetAdditionalLightsCount() |
추가 조명 개수를 반환합니다. |
그림자를 계산하는 데 사용할 수 있는 이러한 메서드의 버전에 대한 내용은 커스텀 URP 셰이더에서 그림자 사용을 참조하십시오.
| 메서드 | 구문 | 설명 |
|---|---|---|
LightingLambert |
half3 LightingLambert(half3 lightColor, half3 lightDirection, half3 surfaceNormal) |
Lambert 모델을 사용하여 계산된 표면 노멀에 대한 분산광을 반환합니다. |
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
}
}
}