본문으로 건너뛰기

안동민 개발노트

본문 시작

조명과 그림자의 디버깅

그림자 깨짐·빛샘·과다 노출 같은 조명 문제를 뷰포트 시각화와 콘솔 명령으로 재현하고 원인을 좁힙니다.

광원, GI, 반사까지 적용했다면 이제 실제로 자주 마주치는 문제를 해결할 단계입니다.

조명 시스템은 설정 항목이 많아 작은 값 하나만 틀려도 그림자 깨짐, 빛샘, 과다 노출, 비정상 암부 같은 문제가 쉽게 발생합니다.

이 문제를 빠르게 진단하지 못하면 레벨 품질과 작업 속도가 동시에 떨어집니다.

이번 절에서는 조명/그림자 디버깅(Debugging) 절차를 단계적으로 다룹니다.

시각화 모드와 콘솔 명령어를 조합해 문제 원인을 빠르게 좁히는 것이 목표입니다.

조명과 그림자의 디버깅

광원, GI, 반사까지 적용한 뒤에는 자주 마주치는 문제를 재현하고 원인을 분리해야 합니다. 조명 시스템은 설정 항목이 많아 작은 값 하나만 틀려도 그림자 깨짐, 빛샘, 과다 노출, 비정상 암부 같은 문제가 쉽게 발생합니다.

  1. 조명 및 그림자 문제의 일반적인 유형

    조명과 그림자 문제는 과다 노출, 빛샘, 깨진 그림자, 비정상 암부로 나누어 재현 위치와 Mobility 설정을 함께 기록합니다.

  2. 뷰포트 시각화 모드 활용

    언리얼 에디터의 뷰포트는 Lighting Only, Lightmap Density, Shader Complexity로 조명 및 그림자 문제를 분리해 표시합니다.

  3. 콘솔 명령어 활용

    언리얼 엔진의 콘솔 명령어는 r.Shadow.*, ShowFlag.*, Stat GPU처럼 런타임 렌더링 상태를 좁혀 진단합니다.

  4. 조명과 그림자의 디버깅 기준

    정확성 조명/그림자 디버깅(Debugging)은 라이트맵 밀도, 그림자 품질, 런타임 콘솔 값을 순서대로 좁힙니다. 비용 라이트맵 문제: 검은 오브젝트나 검은 영역은 라이트맵 UV 겹침, 낮은 해상도, 빌드 누락을 차례로 확인합니다. 확장성 라이트맵 문제: 큰 레벨에서는 메시별 라이트맵 해상도를 필요한 곳에만 높이고 Lightmap Density 뷰로 밀도를 맞춥니다. 예외 조명 시스템은 설정 항목이 많아 작은 값 하나만 틀려도 그림자 깨짐, 빛샘, 과다 노출, 비정상 암부 같은 문제가 바로 드러납니다.

  5. 정확성 조명/그림자 디버깅(Debugging)

    라이트맵 밀도, 그림자 품질, 런타임 콘솔 값을 순서대로 좁힙니다.

  6. 비용 라이트맵 문제

    검은 오브젝트나 검은 영역은 라이트맵 UV 겹침, 낮은 해상도, 빌드 누락을 차례로 확인합니다.

  7. 확장성 라이트맵 문제

    큰 레벨에서는 메시별 라이트맵 해상도를 필요한 곳에만 높이고 Lightmap Density 뷰로 밀도를 맞춥니다.

  8. 예외 조명 시스템

    설정 항목이 많아 작은 값 하나만 틀려도 그림자 깨짐, 빛샘, 과다 노출, 비정상 암부 같은 문제가 바로 드러납니다.


조명 및 그림자 문제의 일반적인 유형

조명과 그림자 문제는 화면이 어둡거나 깨져 보이는 결과만 보고는 원인을 찾기 어렵습니다.

아래 다이어그램은 뷰 모드, 노출, 광원 설정을 차례로 확인하는 디버깅 흐름입니다.

조명 문제는 노출, 광원, 그림자, 반사 순서로 분리한다

화면이 어둡다는 결과만 보고 강도를 올리면 실제 원인을 가리기 쉽다.

  1. 1
    Exposure

    Auto Exposure와 Post Process가 밝기를 흔드는지 본다.

  2. 2
    Light Setup

    광원 방향, 세기, 모빌리티가 의도와 맞는지 확인한다.

  3. 3
    Shadow

    해상도, 거리, 바이어스로 깜빡임과 누락을 좁힌다.

  4. 4
    Reflection

    Capture, Lumen, SSR 설정이 재질과 맞는지 본다.

  5. 5
    Bake State

    라이트 빌드와 라이트맵 UV 문제를 확인한다.

기준판정
검은 표면라이트맵 UV, 빌드 실패, 노출 설정을 우선 확인
그림자 깜빡임Shadow bias, 거리, 동적 광원 수를 확인

조명과 그림자 관련 문제는 주로 다음과 같은 형태로 나타납니다.

  • 라이트맵 문제
    • 검은 오브젝트 / 검은 영역: 라이트맵 UV가 겹치거나, 라이트맵 해상도가 너무 낮거나, 라이트 빌드에 실패했을 때 발생할 수 있습니다.
    • 빛샘 (Light Leaks): 오브젝트 사이에 틈이 있거나, 라이트매스 샘플링이 부족할 때 빛이 새어 나옵니다.
    • 계단 현상 (Stair-stepping): 그림자가 매끄럽지 않고 계단처럼 끊겨 보이는 현상으로, 라이트맵 해상도나 그림자 설정 문제일 수 있습니다.
    • 그림자 깨짐 / 아티팩트: 라이트매스 설정이나 메시의 문제로 그림자가 부자연스럽게 깨져 보입니다.
  • 실시간 그림자 문제
    • 그림자 얼룩덜룩함 / 플리커링: 그림자 해상도가 낮거나, 그림자 맵 캐스케이드(CSM) 설정이 부적절할 때 발생합니다.
    • 피터 패닝 (Peter Panning): 오브젝트가 공중에 떠 있는 것처럼 그림자와 분리되어 보이는 현상으로, 그림자 바이어스(Bias) 설정이 원인입니다.
  • 간접광 문제
    • 과도한 간접광 / 부족한 간접광: Sky Light의 강도, Lightmass 설정 등이 부적절할 때 발생합니다.
    • 색 번짐 (Color Bleeding): 특정 색상의 오브젝트가 주변에 과도하게 색을 반사할 때 발생합니다.
  • 노출 문제
    • 장면이 너무 밝거나 어두움: 포스트 프로세스 볼륨의 노출(Exposure) 설정이 부적절하거나, 조명 강도가 잘못되었을 때 발생합니다.

뷰포트 시각화 모드 활용

언리얼 에디터의 뷰포트는 다양한 시각화 모드를 제공하여 조명 및 그림자 문제를 시각적으로 진단하는 데 큰 도움을 줍니다.

시각화 모드를 탐색해보겠습니다.

뷰포트 좌측 상단의 뷰 모드(View Mode) 드롭다운 메뉴를 클릭합니다. (기본적으로 Lit으로 설정되어 있습니다.)

Lighting Only (조명만)

  • 용도: 레벨의 순수한 조명 정보를 확인합니다. 재질의 색상이나 텍스처 없이, 빛과 그림자만으로 레벨이 어떻게 보이는지 확인할 수 있습니다.
  • 확인 사항: 특정 오브젝트가 예상보다 어둡거나 밝은지, 그림자가 올바르게 드리워지는지 등을 빠르게 파악할 수 있습니다.

Lit (기본)

  • 용도: 모든 조명, 재질, 텍스처, 후처리 효과가 적용된 최종 렌더링 화면을 보여줍니다.
  • 확인 사항: 일반적으로 가장 많이 사용하는 모드지만, 문제의 원인을 파악하기는 어렵습니다.

Detail Lighting (디테일 조명)

  • 용도: 조명 정보만을 재질의 디테일과 함께 보여줍니다. Lighting Only 모드보다 약간 더 재질의 질감을 살려 보여주지만, 재질의 기본 색상은 회색으로 통일됩니다.
  • 확인 사항: 오브젝트의 법선 맵(Normal Map)이 조명에 어떻게 반응하는지, 작은 그림자들이 잘 표현되는지 등을 확인하기 좋습니다.

Lightmap Density (라이트맵 밀도)

  • 용도: Static 조명 문제 진단에 매우 중요합니다. 오브젝트에 적용된 라이트맵의 밀도를 색상으로 시각화하여 보여줍니다.
  • 확인 사항
    • 초록색: 적절한 밀도 (최적).
    • 빨간색: 밀도가 너무 높음 (성능 저하).
    • 파란색: 밀도가 너무 낮음 (그림자 품질 저하, 계단 현상 발생 가능).
  • 해결책: 파란색으로 표시되는 오브젝트는 라이트맵 해상도(Lightmap Resolution) 값을 높여주거나, 라이트맵 UV가 적절한지 확인해야 합니다. 빨간색은 낮춥니다.
    • 스태틱 메시 에디터에서 조절: 에셋을 더블클릭하여 에디터를 열고, 디테일 패널의 Static Mesh Settings 섹션에서 Overridden Light Map Res 값을 조절합니다.

Optimizer View Modes (최적화 뷰 모드)

  • Light Complexity (조명 복잡도): 특정 픽셀에 영향을 미치는 동적 조명의 수를 색상으로 보여줍니다. (녹색: 낮음, 빨간색: 높음)
    • 확인 사항: 빨간색 영역이 많다면 해당 지역의 동적 조명(Stationary, Movable) 수를 줄이거나, Attenuation Radius를 조절해야 합니다.
  • Shader Complexity (셰이더 복잡도): 재질 셰이더의 복잡도를 색상으로 보여줍니다. (녹색: 낮음, 빨간색: 높음) 확인 사항: 빨간색 영역이 많다면 해당 재질의 셰이더 노드를 최적화하거나, 더 간단한 재질로 교체하는 것을 고려해야 합니다.

콘솔 명령어 활용

언리얼 엔진의 콘솔 명령어는 런타임에 다양한 렌더링 옵션을 조절하여 문제를 진단하는 데 매우 유용합니다.

콘솔 열기: 게임 플레이(PIE) 중이거나 에디터 뷰포트에서 ~ (틸드) 또는 ' (작은따옴표) 키를 눌러 콘솔을 엽니다.

그림자 관련 명령어

  • r.Shadow.DistanceScale [값]: 동적 그림자가 렌더링되는 최대 거리를 조절합니다. (기본값 1.0) 값을 줄이면 그림자가 더 가까운 거리에서 잘려나가 성능을 향상시키지만 시각적 품질이 저하될 수 있습니다.
  • r.Shadow.MaxCSMResolution [값]: 캐스케이드 그림자 맵(CSM)의 최대 해상도를 조절합니다. (기본값 2048) 값이 낮을수록 성능이 향상되지만 그림자 품질이 저하됩니다.
  • r.Shadow.CSM.MaxCascades [값]: 캐스케이드 그림자 맵의 캐스케이드 수를 조절합니다. (기본값 4) 수가 많을수록 먼 거리 그림자 품질이 좋지만 성능 부하가 큽니다.
  • r.Shadow.Bias [값]: 그림자 바이어스를 조절하여 피터 패닝(Peter Panning) 현상을 완화합니다. 값이 너무 낮으면 그림자가 오브젝트 내부로 파고들고, 너무 높으면 오브젝트에서 떨어져 보이는 현상이 발생합니다.

조명 관련 명령어

  • r.LightFunction [0/1]: 라이트 함수(Light Function)의 렌더링을 켜거나 끕니다. (예: 깜빡이는 조명, 투영되는 그림)
  • r.Exposure.Set [값]: 수동으로 노출을 조절하여 레벨의 밝기를 테스트합니다.
  • ShowFlag.AmbientOcclusion [0/1]: 앰비언트 오클루전 효과를 켜거나 끕니다.
  • ShowFlag.ReflectionEnvironment [0/1]: 반사 환경(Reflection Capture) 효과를 켜거나 끕니다.

일반 디버깅 명령어

  • Stat FPS: 현재 프레임 속도(FPS)를 표시합니다.
  • Stat Unit: CPU 및 GPU 시간 등 성능 통계를 표시합니다. 조명 관련 병목 현상을 파악하는 데 유용합니다.
  • ProfileGPU: GPU 프로파일러를 열어 GPU 렌더링 과정에서 어떤 부분이 시간을 많이 소요하는지 상세하게 분석할 수 있습니다.

문제 해결을 위한 단계별 접근

문제 진단
  • 어떤 유형의 문제인가? (라이트맵, 실시간 그림자, GI, 노출 등)
  • 문제는 특정 오브젝트에만 발생하는가, 아니면 레벨 전체에 걸쳐 발생하는가?
  • 문제는 Static 조명에서 발생하는가, Movable 조명에서 발생하는가?

시각화 모드 활용: 위에서 설명한 Lightmap Density, Light Complexity 등의 뷰 모드를 사용하여 문제의 원인을 시각적으로 확인합니다.

설정 조정
  • 라이트맵 문제: 해당 스태틱 메시의 Lightmap Resolution을 조정하고, 라이트맵 UV가 겹치지 않는지 확인합니다. World SettingsLightmass 품질 설정을 높여봅니다. 반드시 다시 라이트 빌드를 수행합니다.
  • 실시간 그림자 문제: 광원의 Dynamic Shadow Distance, Num Cascades, Shadow Bias 등을 조절합니다.
  • GI 문제: Sky LightIntensity, World SettingsLightmass 설정(Num Indirect Lighting Bounces, Quality)을 조정하고 라이트 빌드를 다시 수행합니다. (UE5의 Lumen 사용 시 Post Process Volume의 Lumen 설정 확인)
  • 노출 문제: Post Process VolumeExposure 설정을 조정합니다.

반복 및 테스트: 설정을 변경할 때마다 레벨을 플레이하거나 빌드하여 변경 사항이 문제 해결에 도움이 되었는지 확인합니다.

성능 변화도 함께 주시합니다.

콘솔 명령어 활용: 미세 조정이나 빠른 테스트를 위해 콘솔 명령어를 활용합니다.

디버깅은 한 번에 모든 값을 바꾸기보다 증상, 시각화, 설정, 성능 확인 순서로 좁히면 훨씬 안정적입니다.

조명 문제는 증상에서 원인 후보로 좁힌다

값을 여러 개 바꾸기 전에 같은 장면을 다른 보기 모드와 통계로 확인한다.

  1. 증상
    문제 형태 분류

    증상 검은 영역, 빛샘, 플리커링, 과다 노출 중 무엇인지 먼저 적는다.

  2. 보기
    시각화 모드 확인

    보기 Lighting Only, Lightmap Density, Light Complexity로 원인 범위를 줄인다.

  3. 설정
    한 값씩 조정

    설정 라이트맵 해상도, Shadow Bias, 노출, 반경을 하나씩 바꾸고 비교한다.

  4. GPU 비용
    성능 통계 확인

    GPU 비용 Stat Unit과 ProfileGPU로 화면 개선이 실제 비용을 넘지 않는지 본다.

문제가 반복될 때는 증상별로 가장 먼저 확인할 보기 모드와 설정값을 정해두면, 팀원이 바뀌어도 같은 기준으로 원인을 좁힐 수 있습니다.

증상별 첫 확인 지점

조명 문제는 화면 증상을 기준으로 보기 모드와 설정 후보를 먼저 고르면 수정 범위가 줄어듭니다.

  1. 검은 면과 계단 그림자

    Lightmap Lightmap Density와 UV 겹침을 확인하고 해상도를 한 단계씩 올립니다.

  2. 벽 틈의 빛샘

    Leak 메시 접합부, Lightmass 샘플, 두께가 부족한 구조물을 먼저 점검합니다.

  3. 그림자 분리와 깜빡임

    Shadow Shadow Bias, CSM 거리, 캐스케이드 수를 한 항목씩 비교합니다.

  4. 과다 노출과 암부

    Exposure Post Process의 노출 범위와 Sky Light 강도를 분리해서 테스트합니다.


조명과 그림자 문제는 뷰포트 시각화 모드, 콘솔 명령어, GPU 프로파일링으로 원인을 나누어 확인합니다.

밝기, 그림자 품질, 라이트맵, 동적 조명 비용을 함께 점검해야 합니다.

조명 문제 추적 절차

조명과 그림자 문제는 감으로 밝기를 올리기보다 문제 유형을 나누고 뷰포트 시각화, 콘솔 명령, 단계별 비교로 좁혀야 합니다.

  1. 문제 종류 분류

    Type 라이트맵, 실시간 그림자, 간접광, 노출 문제 중 어느 쪽인지 먼저 이름 붙입니다.

  2. 시각화 모드 전환

    View Mode Lighting Only, Lit, Unlit 같은 모드로 재질과 조명을 분리해 봅니다.

  3. 콘솔로 상태 확인

    Commands 필요한 렌더링 표시와 통계 명령을 사용해 화면 뒤의 값을 확인합니다.

  4. 한 번에 하나씩 변경

    Steps 여러 옵션을 동시에 바꾸지 말고 조명, 그림자, 노출을 순서대로 조정합니다.