Unity에서 빛에 대해선 크게 관심을 두진 않았다.
그런데 기본으로 설정한 real-time이 맵이 클수록 많은 연산량을 요구한다는 것을 알게 되었다.
이 외에도 빛을 이용하여 연출하면 퀄리티가 높아지고 하니 빛에 대해 조사해 보려고 한다.
먼저 Unity에서 Light는 현실 세계의 빛을 시뮬레이션한 것이다.

| (출처 - https://youtu.be/5rxMdiCkQGk?si=igKmdRebRLx5lAC_) |
|---|
위 영상은 빛이 어떤 방식으로 반사되어 우리 눈에 인식되는지를 표현한 영상이다.
그래서 빛에 대해 간단하게 특징을 정리하면 다음과 같다.
- 광원(Source): 빛의 발산 지점과 형태(모양)
- 방향(Direction): 빛의 이동 경로
- 강도(Intensity): 빛의 밝기(세기)와 거리
- 색상(Color): 빛이 발산하는 색
Unity에서 조명을 설정하기 전, Direct 방식과 Indirect 방식의 차이를 이해하는 것이 중요하다.
영상에서 해바라기는 햇빛을 직접적으로 받아 표면에 부딪힌 후 눈에 반사된다. 이것이 직접광(Direct Light)이다.
반면, 잔디는 해바라기에서 반사된 빛을 흡수한 후 눈으로 반사되는데, 이렇게 광원이 아닌 다른 표면에서 여러 번 반사된 빛은 간접광(Indirect Light)이라 한다.
Global Illumination(GI)은 Unity에서 빛의 영향을 더 사실적으로 구현하는 기술이다. GI는 직접광과 간접광 모두를 시뮬레이션하며, Baked GI와 Realtime GI로 나뉜다.
Baked 방식은 조명 데이터를 미리 계산하여 성능 최적화를 가능하게 한다.
- Lightmapping : 정적인 오브젝트의 표면 밝기를 미리 계산하여 결과를 lightmap이라는 곳에 텍스처형태로 저장하는 방식이다.
매번 연산하지 않아도 되지만, 메모리를 많이 사용한다.- Light Probes : 동적 물체가 정적 lightmap 환경에 들어왔을 때, 빛의 영향을 정확히 표현한다.
- Reflection Probes : 물, 금속, 유리처럼 반사 효과가 필요한 표면에 사용한다.
실시간으로 조명을 계산하며, 동적 환경에서의 빛 반사를 구현한다.
Unity에서 현재 Scene에 있는 모든 광원(Light 컴포넌트가 부착된 GameObject)를 나타낸다. Light Explorer에서는 광원에 대한 다양한 정보가 나열돼 있으며 직접 수정할 수 있다.

Unity에서 씬을 처음 만들고 나면 생기는 Light GameObject이다. 이는 게임에서 태양이나 달 같은 역할을 수행한다.
보이는 화면처럼 방향을 회전하여 밤낮 기능도 구현이 가능하다.

Skybox는 큐브 형태로 씬의 배경을 구성하는 텍스처이다. 주로 하늘이나 환경을 표현하는 데 사용된다.
- SkyBox 만드는 방법
- Create -> Material로 재질을 생성
- 해당 Material의 Shader를 Skybox -> Procedural로 설정
- Lighting -> Enviroment -> Skybox Material에 만든 Skybox를 드래그 앤 드랍
이렇게 하면 Skybox를 직접 만들 수 있고 다음은 Skybox에 설정에 대한 간단한 정리이다.
Unity는 모든 랜더링 파이프라인(3차원 모델을 2차원에 투영하는 렌더링 과정)에서 Linear(선형) 및 감마(Gamma) 색상 공간을 위한 기술이다.
Gamma Color Space
Linear Color Space
기본적으로 3D 템플릿의 색상 공간은 감마이며 URP 템플릿을 사용하는 경우에는 선형 색상 공간을 사용한다.

(출처 - https://docs.unity3d.com/Manual/differences-linear-gamma-color-space.html)
위 사진처럼 선형과 감마에 따라 빛에 대한 색 처리 방식이 다름을 볼 수 있다. 이처럼 색상 공간은 빛과 아주 관련성이 있고 감마는 빛에 색 처리가 너무 극적이라 우리는 감마 방식이 아닌 선형 방식을 채택해야 한다.
그림자는 빛의 핵심 요소 중 하나로, 실행 환경은 URP(Universal Render Pipeline) 기준으로 정리하였다.
카메라로부터 그림자가 렌더링 되는 최대 거리를 설정한다.

그림자 표현 문제(Shadow Acne)를 해결하는 데 사용된다.
| 처리전 | 처리후 |
|---|---|
![]() | ![]() |
해상도를 높이지 않고도 그림자의 퀄리티를 높일 수 있다. Cascade Count는 오직 Directional의 Light에서만 동작하며 개수를 설정하여 그림자의 퀄리티를 높일 수 있다.

순서대로 A-1,B-2,C-3,D-4로 Cascade Count를 설정한 예시이다.
기본적으로 빛에 대하여 별다른 설정을 한 적이 없다면 대부분 realtime 방식으로 빛을 처리할 것이다. 이렇게 될 경우 맵의 크기 및 다양한 동적 오브젝트 등이 배치된다면, 연산량이 증가하여 성능 저하를 유발할 수 있다. 이럴 때 정적 오브젝트에 대해 빛을 미리 계산하여 성능을 최적화하는 기능이다.
빛을 굽기 위해선 앞으로 움직이지 않을 오브젝트를 미리 static으로 고정해줘야한다.

정적 오브젝트 설정을 마쳤다면 이제 lightmap을 bake한다.
- windwo -> Rendering -> Lighting
- Scene -> Lighting Settings -> Lighting Settings Asset에서 New를 눌러 새로운 Light Setting을 생성
- 필요한 설정을 마친 후 Generate Lighting을 눌러 bake를 실행한다.
위 작업을 마쳤다면 Baked Lightmaps를 통해 빛이 texture로 구워졌음을 알 수 있다.


Generate Lighting을 실행했지만 Light의 Mode가 Baked상태라면 저렇게 빛이 나오는데도 영향을 못 받는 문제점이 발생한다. 이 부분을 해결할 수 있는 부분이 바로 Light Probe다.
Light Probe는 Light Probe Group으로 구성되어 있어 게임 오브젝트에 Light Probe Group을 추가하여 사용할 수 있다.

이렇게 Light Probe설정을 끝내고 다시 Generate Lighting을 실행하면 빛의 영향을 받는다.