유니티의 2D 라이트는 기존 2D 게임에서 "조명 효과"를 표현하기 어려웠던 한계를 극복하기 위해 도입되었다.
전통적인 2D 게임에서는 대부분의 라이트 효과처럼 보이는 스프라이트 자체를 그리거나, 쉐이더를 커스텀해서 구현하는데 이런 방식은 제작 효율이 낮고, 실시간으로 라이트가 변화하는 연출을 표현하기에는 상당히 많은 노력을 필요하게 된다.
URP의 2D 라이트 시스템은 3D 라이트와 유사하게, 씬의 라이트와 오브젝트가 서로 상호작용하며 실시간으로 빛과 그림자를 연산하는 구조이다.
빛의 세기(Intensity), 범위(Range), 색상(Color), 각도(Spot) 등 파라미터에 따라 픽셀별로 "얼마나 빛을 받는지" 계산한다.
라이트는 "라이트 버퍼(light buffer)"라는 텍스처에 먼저 계산된다.
각 오브젝트 렌더링 시, 머티리얼의 쉐이더가 라이트 버퍼 값을 참고해서 픽셀의 최종 컬러를 결정하게 된다.
결국 라이트를 받는 스프라이트면 전부 최종적으로 영향을 받게 한다고 생각하면된다.
2D 라이트도 그림자를 지원한다.
그림자를 만들고 싶은 스프라이트에 Shadow Caster 2D 컴포넌트 추가
그림자 형태는 폴리곤 형태로 지정 가능
라이트가 그림자 캐스터 오브젝트 뒤에 있을 때, 그림자 맵을 연산해 빛의 영향을 차단한다.
2D지만 원리는 3D와 비슷하게 "빛의 경로"에 따라 그림자를 만듦
여러 종류의 라이트가 섞여 있을 때, 특정 오브젝트에만 특정 라이트의 영향을 주고 싶으면 Light Layer 사용
예: "Player" Light Layer를 가진 캐릭터 전용 라이트
라이트와 스프라이트의 Light Layer 설정이 일치해야 빛이 적용된다.
라이트는 라이트 버퍼에 정보만 제공한다.
실제 "빛을 받는" 효과는 Sprite Renderer가 사용하는 머티리얼의 쉐이더가 구현한다.
Sprite-Lit-Default: 라이트의 영향을 받아 실시간 조명/그림자 표현
Sprite-Default: 라이트 무시, 항상 원본 색상 출력
라이트 수가 늘어나면 GPU 연산량이 많아져서 퍼포먼스 저하
너무 넓은 범위의 라이트, 중첩된 라이트는 피하는 게 좋다.
쉐이더나 라이트 버퍼 구조를 커스텀하려면 Shader Graph 등을 활용
실제 3D 라이트와 방식도 다르고 스프라이트 자체를 빛처럼 표현하는것과 비쥬얼적으로도 엄밀하게는
큰 차이는 없다고 볼 수 있지만
실제로 픽셀아트를 그리는 입장에서 생산성에 큰 차이를 보여준다. 결국 빛효과 이기 때문에 게임의 보여지는 것에 대해 지대한 영향을 미치게 되고 포스트프로세싱과 같이 조합해서 사용 할 수 있기에
픽셀아트 게임이더라도 확실히 현대적인 느낌을 많이 줄 수 있게 된다.
셰이더에 대해 무지할때 가장 기초적으로 셰이더에 대해 접근하기 좋은 방법이라고 생각한다.