[Unity] 2D Light 정리

Lumos Velog·2025년 7월 15일
0

2D Light

유니티의 2D 라이트는 기존 2D 게임에서 "조명 효과"를 표현하기 어려웠던 한계를 극복하기 위해 도입되었다.
전통적인 2D 게임에서는 대부분의 라이트 효과처럼 보이는 스프라이트 자체를 그리거나, 쉐이더를 커스텀해서 구현하는데 이런 방식은 제작 효율이 낮고, 실시간으로 라이트가 변화하는 연출을 표현하기에는 상당히 많은 노력을 필요하게 된다.
URP의 2D 라이트 시스템은 3D 라이트와 유사하게, 씬의 라이트와 오브젝트가 서로 상호작용하며 실시간으로 빛과 그림자를 연산하는 구조이다.




핵심 구조

  • Light Component
    2D 라이트는 Light 2D 컴포넌트 부탁 한번으로 적용되고 이 컴포넌트의 파라미터를 통해 빛의 유형, 색상, 세기, 범위 등을 지정할 수 있다.

  • Renderer Pipeline
    2D 라이트 시스템은 Universal Render Pipeline(URP)의 2D Renderer를 기반으로 작동한다.
    여기서 렌더링 단계에서 각 픽셀마다 계산된다. 즉, 라이트가 씬에 존재하면, 그 빛의 영향 범위 안에 있는 스프라이트 픽셀마다 라이트 계산이 진행된다.

  • Material/Shader
    2D 라이트의 영향을 받으려면 Sprite Renderer의 머티리얼이 "Sprite-Lit-Default" 등 라이트 계산이 포함된 쉐이더를 사용해야 한다.
    이 쉐이더는 기본적으로 라이트 버퍼의 정보를 가져와서 각 픽셀별로 "얼마나 빛을 받는지" 연산하게 된다.



종류

  • Point Light 2D
    한 점에서 방사형으로 빛을 퍼뜨린다. 3D Point Light와 비슷하게, 원형의 빛 범위 내에서 스프라이트의 픽셀마다 밝기가 점차 줄어듦.

  • Global Light 2D
    씬 전체에 균일하게 빛을 뿌린다. 실제로는 라이트 버퍼 전체를 특정 컬러/강도로 채우는 역할을 한다.
    전체 조명의 기본값을 설정할 때 주로 사용하게 된다.

  • Spot Light 2D
    특정 방향, 각도로 제한된 빛을 퍼뜨린다. 원뿔 형태의 범위 안에서만 빛이 퍼지게 되는데 실제 게임안에서 횃불이라던지 게임적인 조명모양을 나타내기에 좋다.

  • Sprite Light 2D
    스프라이트 이미지를 직접 빛의 형태로 사용한다. 라이트의 모양, 그라데이션 등 복잡한 빛 효과를 만들고 싶을 때 활용할 수 있다.



연산 방식

  • 빛의 세기(Intensity), 범위(Range), 색상(Color), 각도(Spot) 등 파라미터에 따라 픽셀별로 "얼마나 빛을 받는지" 계산한다.

  • 라이트는 "라이트 버퍼(light buffer)"라는 텍스처에 먼저 계산된다.

  • 각 오브젝트 렌더링 시, 머티리얼의 쉐이더가 라이트 버퍼 값을 참고해서 픽셀의 최종 컬러를 결정하게 된다.

결국 라이트를 받는 스프라이트면 전부 최종적으로 영향을 받게 한다고 생각하면된다.




그림자

  • 2D 라이트도 그림자를 지원한다.

  • 그림자를 만들고 싶은 스프라이트에 Shadow Caster 2D 컴포넌트 추가

  • 그림자 형태는 폴리곤 형태로 지정 가능

  • 라이트가 그림자 캐스터 오브젝트 뒤에 있을 때, 그림자 맵을 연산해 빛의 영향을 차단한다.

  • 2D지만 원리는 3D와 비슷하게 "빛의 경로"에 따라 그림자를 만듦




Light Layer

  • 여러 종류의 라이트가 섞여 있을 때, 특정 오브젝트에만 특정 라이트의 영향을 주고 싶으면 Light Layer 사용

  • 예: "Player" Light Layer를 가진 캐릭터 전용 라이트

  • 라이트와 스프라이트의 Light Layer 설정이 일치해야 빛이 적용된다.




관계

  • 라이트는 라이트 버퍼에 정보만 제공한다.

  • 실제 "빛을 받는" 효과는 Sprite Renderer가 사용하는 머티리얼의 쉐이더가 구현한다.

  • Sprite-Lit-Default: 라이트의 영향을 받아 실시간 조명/그림자 표현

  • Sprite-Default: 라이트 무시, 항상 원본 색상 출력




최적화

  • 라이트 수가 늘어나면 GPU 연산량이 많아져서 퍼포먼스 저하

  • 너무 넓은 범위의 라이트, 중첩된 라이트는 피하는 게 좋다.

  • 쉐이더나 라이트 버퍼 구조를 커스텀하려면 Shader Graph 등을 활용




마무리

실제 3D 라이트와 방식도 다르고 스프라이트 자체를 빛처럼 표현하는것과 비쥬얼적으로도 엄밀하게는
큰 차이는 없다고 볼 수 있지만
실제로 픽셀아트를 그리는 입장에서 생산성에 큰 차이를 보여준다. 결국 빛효과 이기 때문에 게임의 보여지는 것에 대해 지대한 영향을 미치게 되고 포스트프로세싱과 같이 조합해서 사용 할 수 있기에
픽셀아트 게임이더라도 확실히 현대적인 느낌을 많이 줄 수 있게 된다.
셰이더에 대해 무지할때 가장 기초적으로 셰이더에 대해 접근하기 좋은 방법이라고 생각한다.

0개의 댓글