Version: Unity 6.0 (6000.0)
언어 : 한국어
커스텀 URP 셰이더에서 카메라 사용
Use indirect lighting in a custom URP shader

커스텀 URP 셰이더에서 조명 사용

커스텀 URP(유니버설 렌더 파이프라인) 셰이더에서 조명을 사용하려면 다음 과정을 따르십시오.

  1. 셰이더 파일의 HLSLPROGRAM 안에 #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"을 추가합니다.
  2. 다음 섹션의 메서드를 사용합니다.

조명 데이터 가져오기

Lighting.hlsl 파일은 다음 메서드가 포함된 RealtimeLights.hlsl 파일을 임포트합니다.

메서드 구문 설명
GetMainLight Light GetMainLight() 씬의 메인 조명을 반환합니다.
GetAdditionalLight Light GetAdditionalLight(uint lightIndex, float3 positionInWorldSpace) positionWS에 영향을 미치는 lightIndex 추가 조명을 반환합니다. 예를 들어 lightIndex0인 경우 이 메서드는 첫 번째 추가 조명을 반환합니다.
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은 가려지지 않음을 의미합니다.

자세한 내용은 앰비언트 오클루전을 참조하십시오.

구조체

AmbientOcclusionFactor

GetScreenSpaceAmbientOcclusion 메서드를 사용하여 이 구조체를 반환합니다.

필드 설명
half indirectAmbientOcclusion 간접광을 차단하는 오브젝트로 생긴 앰비언트 오클루전으로 인해 오브젝트가 그림자에 가려지는 정도입니다.
half directAmbientOcclusion 직접광을 차단하는 오브젝트로 생긴 앰비언트 오클루전으로 인해 오브젝트가 그림자에 가려지는 정도입니다.

Light

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 셰이더에서 카메라 사용
Use indirect lighting in a custom URP shader
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961