뭐라도 쓰겠지
25.04.18 / 조명(Light), 그림자(Shadow), 쉐이딩 모델(Shading) 본문
조명은 게임 오브젝트(메시, 머터리얼 등)과 함께 씬(Scene)의 최종 시각적 퀄리티를 결정하는 핵심 요소이다. 유니티에서는 Light 컴포넌트를 통해 다양한 형태의 빛을 설정할 수 있으며, 각 라이트는 씬 내 조명 계산과 쉐이더에서 색상∙명암 등에 반영된다.
유니티의 기본 조명 유형은 크게 아래와 같다.
Directional Light
- 특징:
- 무한히 멀리 있는 광원(태양빛 등)을 표현
- 씬 전체에 걸쳐 평행광이 비추는 형태
- 위치(Transform Position)는 의미가 없고, 방향(Transform Rotation)만 중요
- 대규모 야외 씬에서 메인 조명으로 많이 사용
- 장점:
- 씬 전체에 균일하게 빛을 줄 수 있어 태양광이나 달빛 표현에 적합
- 그림자도 원거리 광원과 유사하게 생성
- 단점:
- 방향성만 제공하므로, 빛의 감쇠(Falloff) 개념이 없음
- 실내나 국소적인 조명 표현에는 적합하지 않음
Point Light
- 특징:
- 특정 점에서 사방으로 퍼져나가는 광원
- 전구처럼 구 형태로 빛이 확산되는 느낌
- Range(빛이 닿는 거리)에 따라 감쇠가 발생
- 장점:
- 근접 영역을 둥글게 비추는 표현에 적합(예: 전등, 촛불 등)
- 단점:
- 원거리까지 효과를 크게 주기엔 비효율적 (Range가 커지면 성능 부담)
Spot Light
- 특징:
- 한 점에서 원뿔 형태로 빛이 퍼지는 광원
- 플래시라이트나 스테이지 조명과 같이 집중된 빛 표현 가능
- Spot Angle, Range 등의 파라미터로 범위와 넓이를 조정
- 장점:
- 특정 방향으로 집중 조명이 필요한 경우 적합
- Light Cookie 등을 이용하면 다양한 형태의 빔 표현 가능
- 단점:
- 범위가 제한적이므로, 광역 조명보다는 국소적∙효과적인 연출에 사용
Light Mode: Realtiem, Mixed, Baked
유니티에서 조명은 Light Mode에 따라 빛이 계산되는 시점과 방식이 달라진다.
Realtime
- 게임 실행 중(런타임)에 모든 조명 계산이 즉시 이루어짐
- 동적인 오브젝트와 상호 작용(움직이거나 색이 변하는 등) 가능
- CPU/GPU 성능 부담이 커질 수 있음
- 실시간 그림자도 매 프레임마다 업데이트
Mixed
- 정적(Static) 오브젝트는 베이크(간접광)를 이용해 최적화하고, 동적(Dynamic) 오브젝트나 실시간 그림자는 필요한 부분만 실시간으로 계산
- 씬의 베이스 라이트를 미리 구워 두고(Indirect, GI 등), 일부만 Realtime 처리
- 정적∙동적 오브젝트가 혼합되어 있는 씬에서 효과적
Baked
- 모든 조명 계산(직접광+간접광)을 베이크하여 Lightmap(텍스처)에 굽기
- 게임 실행 중엔 라이트맵 텍스처를 직접 불러와 표현하므로 실시간 조명 부담이 거의 없음
- 빛의 반사, 간접광(GI) 등이 사실적으로 표현됨
- 오브젝트나 라이트가 움직이면 베이크를 다시 해야 하므로, 동적인 조명 표현에는 부적합
Shadow (그림자)
유니티 라이트가 생성하는 그림자는 라이트와 오브젝트, 그리고 카메라 사이의 상호 관계로 계산된다.
실시간 그림자
- Realtime 라이트에서 GPU 연산으로 Shadow Map을 생성해 픽셀별로 가려짐 계산
- Shadow Type (Hard/Soft Shadows) 및 Shadow Resolution 등을 통해 퀄리와 성능을 트레이드오프 가능
- 씬 뷰나 품질 설정에서 Shadow Distance, Cascades 등으로 그림자 범위와 정확도를 조절
베이크된 그림자
- Baked / Mixed Light 모드에서 Lightmap에 그림자가 굽혀져서 저장
- 정적인 씬 요소에 대해 미리 계산하므로 런타임 계산 부담 감소
- 동적인 오브젝트 그림자는 실시간 계산이 필요하거나, 또는 그림자가 없어질 수도 있음
Projection (투영)
유니티에서 Projection이라는 용어는 주로 다음과 관련해 쓰인다.
Shadow Projection
- 그림자를 렌더링할 때, 이를 어떤 방식으로 투영해서 Shadow Map을 계산할지를 결정
- (Built-in Pipeline 기준) Close Fit 혹은 Stable Fit 등 옵션이 존재해, 그림자 왜곡/품질에 영향을 미침
Texture Projectionm (Light Cookie)
- 스포트라이트에 Cookie 텍스처를 씌워 특정 패턴이 투영되게 하는 방식
- 로고나 특수한 조명 효과를 표현할 때 사용
Camera Projection
- 카메라가 장면을 투영하는 방식을 Orthographic / Perspective로 구분
- 조명보다는 카메라 뷰 관련 개념이지만, 투영 방식에 따라 조명 시각적 표현이 달라질 수 있음
쉐이딩(Shading) 모델
유니티 표준 쉐이더(또는 그래픽 파이프라인)에서는 "PBR(Physically Based Rendering)" 모델이 기본이지만, 3D 그래픽스 이론적으로는 아래와 같은 전통적 쉐이딩 모델이 있다.
Flat Shading
- 삼각형 폴리곤 당 하나의 법선 벡터(Normal)를 사용하여 면 단위로 균일한 색상
- 면의 경계가 뚜렷하게 보이고, 각 폴리곤마다 명암이 불연속적으로 표현됨
- 계산이 단순하지만, 저폴리곤 모델에서 거친 느낌을 줄 수 있음
Gouraud Shading
- 정점(Vertex) 단위로 조명 계산(정점별 노멀 사용) 후 픽셀에 보간(Interpolation)
- 성능이 비교적 좋으며, 면보다는 부드러운 표현이 가능
- 정점 수가 적으면 하이라이트(조명 스팟 등)의 디테일이 부정확해질 수 있음
Phong Shading
- 픽셀(또는 프래그먼트) 단위로 노멀 벡터를 보간 후 조명 계산
- Gouraud보다 섬세하고 부드러운 하이라이트 표현 가능
- 연산이 조금 더 무겁지만, 시각적 퀄리티가 개선됨
PBR(Physically Based Rendering)
- 물리 기반 쉐이딩으로 실제 물리적 성질(금속성, 거칠기, 반사도 등)에 가깝게 조명 계산
- 유니티 표준 머터리얼(URP, HDRP 등)에서 기본 채택
- 환경맵(Reflection Probe), 에너지 보존 법칙 등을 고려해 사실적인 광원 표현
조명 효과(조명 성분)
고전적인 램버트∙폰 쉐이딩 등에서 빛을 구성하는 주요 성분을 살펴보면, 다음과 같은 요소로 요약된다.
Diffuse (확산광)
- 표면이 빛을 받아 사방으로 퍼지는(확산 반사) 성분
- 물체 표면의 기울기(노멀)에 따라 강도가 달라지며, 빛의 방향에 비례(Lambert 법칙)
- 물체 색(Color)은 주로 Diffuse 성분에서 결정
Specular (반사광)
- 물체 표면에서 빛이 정반사로 반짝이는(하이라이트) 성분
- 표면이 매끄러울수록 강한 하이라이트, 거칠수록 넓게 퍼짐
- (PBR의 경우) 금속성(Metallic)이나 거칠기(Roughness) 등을 통해 조절
Ambient (주변광)
- 씬 전체적으로 깔려 있는 균일한 빛
- 사실적인 표현에서는 환경광(Environment Lighting) 혹은 전역 조명(GI)으로 대체
- 유니티에서는 Environment Lighting(Skybox 기반) 또는 Ambient Color 설정을 통해 표현 가능
Emission (방출광)
- 표면 자체에서 빛을 방출하는 성분
- 유니티 머터리얼의 Emission 속성을 사용해, 네온사인처럼 빛나는 효과 가능
- 실제로 주변을 밝히지는 않지만, Global Illumination 옵션을 사용하면 간접광으로 계산 가능
정리하자면,
- 씬 전체 조명 구성 시에는 주로 Directional Light가 메인 광원 역할을 하고, 필요에 따라 Point/Spot Light를 배치해 포인트 조명이나 분위기를 더한다.
- 실시간(Realtime) 조명은 자유도가 높으나 성능 부담이 크므로, 건물 내부나 움직이지 않는 오브젝트 등은 되도록 Baked(Lightmap)로 처리해 최적화하는 것이 좋다.
- Mixed 모드는 정적/동적 요소가 섞인 씬에서 밸런스를 맞추는 데 유리하다.
- 그림자(Shadow)는 라이트마다 품질과 거리, 종류를 적절히 설정해 성능을 관리해야 한다.
- 쉐이딩 모델은 유니티 최신 파이프라인에서 PBR 방식을 주로 쓰지만, 내부 계산은 크게 보면 Diffuse+Specular+Ambient 구조를 따른다.
- 조명 베이크 시에는 라이트맵 해상도, UV 배치, Light Probes, Reflection Probes 등을 함께 고려해 높은 퀄리티와 성능을 양립할 수 있도록 작업하는 것이 중요하다.
이상으로 유니티에서 다뤄지는 조명 유형과 라이트 모드, 그림자, 쉐이딩 모델, 그리고 핵심 조명 성분 등에 대해 살펴보아싿. 프로젝트 규모와 목표 퀄리티에 따라 적절한 설정을 병행하면, 원하는 분위기와 성능을 모두 만족하는 조명 환경을 구축할 수 있겠다.
'프로그래밍 > 게임 개발' 카테고리의 다른 글
25.04.18 / Ray Tracing vs Radiosity (0) | 2025.04.18 |
---|---|
25.04.18 / 버텍스(Vertex, 정점), 폴리곤의 기본 단위가 삼각형인 이유 (0) | 2025.04.18 |
25.04.18 / 컬링(Culling)을 통한 최적화 (0) | 2025.04.18 |
25.04.15 / 스페이스(Space), 좌표 공간 (0) | 2025.04.15 |
25.04.11 / Picking, Ray, Raycast (0) | 2025.04.11 |