Lighting 일부

PKH·2025년 1월 14일

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

1. Unity Light

Light 정의

먼저 Unity에서 Light는 현실 세계의 빛을 시뮬레이션한 것이다.

(출처 - https://youtu.be/5rxMdiCkQGk?si=igKmdRebRLx5lAC_)

위 영상은 빛이 어떤 방식으로 반사되어 우리 눈에 인식되는지를 표현한 영상이다.
그래서 빛에 대해 간단하게 특징을 정리하면 다음과 같다.

  • 광원(Source): 빛의 발산 지점과 형태(모양)
  • 방향(Direction): 빛의 이동 경로
  • 강도(Intensity): 빛의 밝기(세기)와 거리
  • 색상(Color): 빛이 발산하는 색

Direct와 Indirect의 차이

Unity에서 조명을 설정하기 전, Direct 방식과 Indirect 방식의 차이를 이해하는 것이 중요하다.
영상에서 해바라기는 햇빛을 직접적으로 받아 표면에 부딪힌 후 눈에 반사된다. 이것이 직접광(Direct Light)이다.
반면, 잔디는 해바라기에서 반사된 빛을 흡수한 후 눈으로 반사되는데, 이렇게 광원이 아닌 다른 표면에서 여러 번 반사된 빛은 간접광(Indirect Light)이라 한다.


Global Illumination

Global Illumination(GI)은 Unity에서 빛의 영향을 더 사실적으로 구현하는 기술이다. GI는 직접광과 간접광 모두를 시뮬레이션하며, Baked GI와 Realtime GI로 나뉜다.

  • Baked Global Illumination
  • Realtime Global Illumination

1. Baked Global Illumination

Baked 방식은 조명 데이터를 미리 계산하여 성능 최적화를 가능하게 한다.

  1. Lightmapping : 정적인 오브젝트의 표면 밝기를 미리 계산하여 결과를 lightmap이라는 곳에 텍스처형태로 저장하는 방식이다.
    매번 연산하지 않아도 되지만, 메모리를 많이 사용한다.
  2. Light Probes : 동적 물체가 정적 lightmap 환경에 들어왔을 때, 빛의 영향을 정확히 표현한다.
  3. Reflection Probes : 물, 금속, 유리처럼 반사 효과가 필요한 표면에 사용한다.

2. Realtime Global Illumination

실시간으로 조명을 계산하며, 동적 환경에서의 빛 반사를 구현한다.


Light Explorer

Unity에서 현재 Scene에 있는 모든 광원(Light 컴포넌트가 부착된 GameObject)를 나타낸다. Light Explorer에서는 광원에 대한 다양한 정보가 나열돼 있으며 직접 수정할 수 있다.

  • Windows > Rendering > Light Explorer

2. Directional Light

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


3. Skybox

Skybox는 큐브 형태로 씬의 배경을 구성하는 텍스처이다. 주로 하늘이나 환경을 표현하는 데 사용된다.

  • SkyBox 만드는 방법
  1. Create -> Material로 재질을 생성
  2. 해당 Material의 Shader를 Skybox -> Procedural로 설정
  3. Lighting -> Enviroment -> Skybox Material에 만든 Skybox를 드래그 앤 드랍

이렇게 하면 Skybox를 직접 만들 수 있고 다음은 Skybox에 설정에 대한 간단한 정리이다.

  • Sun : Unity에서 태양면을 설정할 때 사용하는 방식
  • Sun Size : 태양의 크기를 설정.
  • Atmosphere Thickness : 대기의 밀도. 밀도가 높으면 더 많은 빛이 흡수된다.
  • Sky Tint : 하늘의 색
  • Ground : 지면(수평선 아래 영역)의 컬러
  • Exposure : 하늘의 노출을 조정한다. 값이 클수록 스카이박스가 더 밝게 보인다.

4. Space Color

Unity는 모든 랜더링 파이프라인(3차원 모델을 2차원에 투영하는 렌더링 과정)에서 Linear(선형)감마(Gamma) 색상 공간을 위한 기술이다.
Gamma Color Space

  • 전통적인 색 처리 방식

Linear Color Space

  • 사람 눈에 맞게끔 더 색을 쉽게 보여주는 방식

기본적으로 3D 템플릿의 색상 공간은 감마이며 URP 템플릿을 사용하는 경우에는 선형 색상 공간을 사용한다.

(출처 - https://docs.unity3d.com/Manual/differences-linear-gamma-color-space.html)

위 사진처럼 선형과 감마에 따라 빛에 대한 색 처리 방식이 다름을 볼 수 있다. 이처럼 색상 공간은 빛과 아주 관련성이 있고 감마는 빛에 색 처리가 너무 극적이라 우리는 감마 방식이 아닌 선형 방식을 채택해야 한다.


5. Shadows

그림자는 빛의 핵심 요소 중 하나로, 실행 환경은 URP(Universal Render Pipeline) 기준으로 정리하였다.

Max Distance

카메라로부터 그림자가 렌더링 되는 최대 거리를 설정한다.

  • 설정된 URP Asset -> Shadows -> Max Distance

Depth Bias와 Normal Bias

그림자 표현 문제(Shadow Acne)를 해결하는 데 사용된다.

처리전처리후

Cascade Count

해상도를 높이지 않고도 그림자의 퀄리티를 높일 수 있다. Cascade Count는 오직 Directional의 Light에서만 동작하며 개수를 설정하여 그림자의 퀄리티를 높일 수 있다.

순서대로 A-1,B-2,C-3,D-4로 Cascade Count를 설정한 예시이다.


6. Baked Lighting

기본적으로 빛에 대하여 별다른 설정을 한 적이 없다면 대부분 realtime 방식으로 빛을 처리할 것이다. 이렇게 될 경우 맵의 크기 및 다양한 동적 오브젝트 등이 배치된다면, 연산량이 증가하여 성능 저하를 유발할 수 있다. 이럴 때 정적 오브젝트에 대해 빛을 미리 계산하여 성능을 최적화하는 기능이다.

Object Static

빛을 굽기 위해선 앞으로 움직이지 않을 오브젝트를 미리 static으로 고정해줘야한다.

Bake a Lightmap

정적 오브젝트 설정을 마쳤다면 이제 lightmap을 bake한다.

  1. windwo -> Rendering -> Lighting
  2. Scene -> Lighting Settings -> Lighting Settings Asset에서 New를 눌러 새로운 Light Setting을 생성
  3. 필요한 설정을 마친 후 Generate Lighting을 눌러 bake를 실행한다.

위 작업을 마쳤다면 Baked Lightmaps를 통해 빛이 texture로 구워졌음을 알 수 있다.


7. Light Probe

Generate Lighting을 실행했지만 Light의 Mode가 Baked상태라면 저렇게 빛이 나오는데도 영향을 못 받는 문제점이 발생한다. 이 부분을 해결할 수 있는 부분이 바로 Light Probe다.

Light Probe Group

Light Probe는 Light Probe Group으로 구성되어 있어 게임 오브젝트에 Light Probe Group을 추가하여 사용할 수 있다.

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

0개의 댓글