Version: 2021.3
언어: 한국어
라이트맵 경계 부분 꿰매기
인라이튼을 사용한 실시간 전역 조명

커스텀 폴오프

현실에서 광원은 거리가 멀어질수록 희미해지며, 희미한 광원은 밝은 광원보다 범위가 작습니다. “폴오프(fall-off)”는 광원이 희미해지는 속도를 나타냅니다. Unity의 기본 폴오프 조명 동작과 함께 커스텀 폴오프 설정을 사용할 수도 있습니다.

프로그레시브 라이트매퍼는 스크립트를 통해 구현할 수 있는 커스텀 폴오프 프리셋을 제공합니다. 테이블 아래 이미지에서 시각적으로 설명된 동작 방식을 확인하고, 이미지 아래의 코드 샘플을 통해 이 기능의 사용 사례를 살펴보십시오.

프로퍼티 기능
InverseSquared 역제곱 거리 폴오프 모델을 적용합니다. 즉, 빛 강도가 현재 위치에서 광원까지 거리의 제곱에 반비례하여 약해집니다. 자세한 내용은 ’Wikipedia: 역제곱 법칙’을 참조하십시오. 이 옵션이 물리적으로 가장 정확합니다.
InverseSquaredNoRangeAttenuation 부드러운 범위 감쇠가 제외된 역제곱 거리 폴오프 모델을 적용합니다. InverseSquared와 같은 방식으로 동작하지만, 조명 시스템에서 점 모양 광원(점 광원 및 스폿 광원)의 범위 파라미터 감쇠가 고려되지 않습니다.
Legacy 2차 폴오프 모델을 적용합니다. 이 모델의 경우 광원 감쇠가 광원 범위에 기반하여 이루어집니다. 광원이 소스에서 멀어질수록 강도가 감소하지만, 감쇠 도중 매우 급격하고 비정상적인 하락이 발생하고 시각 효과가 비현실적으로 보입니다.
Linear 리니어 폴오프 모델을 적용합니다. 이 모델에서 감쇠는 광원으로부터의 거리에 반비례하며, 소스에서부터 멀어질수록 일정 비율로 폴오프가 감소합니다.
각 커스텀 폴오프 프리셋의 시각 효과 예
각 커스텀 폴오프 프리셋의 시각 효과 예

참고: 아래 코드 예시는 베이크된 또는 혼합 광원을 사용할 때 프로그레시브 라이트매퍼에서만 작동합니다. 실시간 광원과 함께 코드 예시를 사용하려면 인라이튼 실시간 전역 조명을 사용합니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Experimental.GlobalIllumination;
using UnityEngine.SceneManagement;
[ExecuteInEditMode]
public class ExtractFalloff : MonoBehaviour
{
    public void OnEnable()
    {
        Lightmapping.RequestLightsDelegate testDel = (Light[] requests, Unity.Collections.NativeArray<LightDataGI> lightsOutput) =>
        {
            DirectionalLight dLight = new DirectionalLight();
            PointLight point = new PointLight();
            SpotLight spot = new SpotLight();
            RectangleLight rect = new RectangleLight();
            DiscLight disc = new DiscLight();
            Cookie cookie = new Cookie();
            LightDataGI ld = new LightDataGI();
            
            for (int i = 0; i < requests.Length; i++)
            {
                Light l = requests[i];
                switch (l.type)
                {
                    case UnityEngine.LightType.Directional: LightmapperUtils.Extract(l, ref dLight); LightmapperUtils.Extract(l, out cookie); ld.Init(ref dLight, ref cookie); break;
                    case UnityEngine.LightType.Point: LightmapperUtils.Extract(l, ref point); LightmapperUtils.Extract(l, out cookie); ld.Init(ref point, ref cookie); break;
                    case UnityEngine.LightType.Spot: LightmapperUtils.Extract(l, ref spot); LightmapperUtils.Extract(l, out cookie); ld.Init(ref spot, ref cookie); break;
                    case UnityEngine.LightType.Area: LightmapperUtils.Extract(l, ref rect); LightmapperUtils.Extract(l, out cookie); ld.Init(ref rect, ref cookie); break;
                    case UnityEngine.LightType.Disc: LightmapperUtils.Extract(l, ref disc); LightmapperUtils.Extract(l, out cookie); ld.Init(ref disc, ref cookie); break;
                    default: ld.InitNoBake(l.GetInstanceID()); break;
                }
                ld.cookieID = l.cookie?.GetInstanceID() ?? 0;
                ld.falloff = FalloffType.InverseSquared;
                lightsOutput[i] = ld;
            }
        };
        Lightmapping.SetDelegate(testDel);
    }
    void OnDisable()
    {
        Lightmapping.ResetDelegate();
    }
}

참고: 커스텀 감쇠가 작동하기 위해서는 위의 예시에 있는 모든 코드가 필요합니다. 그러나 ld.falloff = FalloffType.InverseSquared; 행에서 InverseSquared를 변경하여 위에서 설명한 사전 설정 중 하나를 사용할 수 있습니다.


2018.1에서 프로그레시브 라이트매퍼 추가됨 NewIn20181

2018–03–28 페이지 게시됨

라이트맵 경계 부분 꿰매기
인라이튼을 사용한 실시간 전역 조명