라이트맵 베이킹 노이즈 AI 디노이징과 심(Seam) 아티팩트 자동 보정 가이드

Unity 2022.3 LTS와 Unreal Engine 5의 라이트맵 베이킹에서 생기는 몬테카를로 노이즈와 UV 심 아티팩트의 원인을 분석하고 HDR 보존, AI 디노이징, 차트 인식 보정, 자동 검증 파이프라인을 정리합니다.

✓ 복사 완료!
챕터라이팅 & 그림자
난이도중급
상태● 검토 완료
대상 엔진
Engine Agnostic
최종 업데이트
라이트맵 베이킹 노이즈 AI 디노이징과 심(Seam) 아티팩트 자동 보정 가이드

핵심 요약

라이트맵 베이킹 노이즈는 낮은 샘플 수와 간접광·글로시 반사의 높은 분산에서 발생하는 경우가 많습니다. AI 디노이저는 원본 HDR 라이트맵과 알베도·노멀·깊이 같은 가이드 패스를 함께 사용해 노이즈를 줄이되 UV 차트 경계를 넘는 필터링은 제한해야 합니다. 심 아티팩트는 단순 블러보다 UV 차트와 메시 인접 정보를 이용한 경계 검출, 토폴로지 기반 보간, 패딩 재생성 순서로 자동 보정하는 편이 안전합니다.

라이트맵 베이킹 노이즈와 심 아티팩트는 왜 발생하는가?

Unity 2022.3 LTS의 Progressive Lightmapper나 Unreal Engine 5의 GPU Lightmass로 라이트맵을 베이킹하면 결과물이 다음과 같은 문제를 보일 수 있습니다.

  • 넓은 벽면에 미세한 색상 알갱이가 남음
  • 간접광이 강한 모서리에서 얼룩이 발생함
  • UV 아일랜드 경계에 밝거나 어두운 선이 생김
  • 라이트맵 패딩 영역이 부족해 밉맵에서 검은 선이 나타남
  • 서로 다른 UV 차트의 색이 섞여 의도하지 않은 광원이 번짐

라이트맵은 일반적인 색상 텍스처와 달리 조명 에너지를 담습니다. 따라서 후처리 과정에서 색상 공간을 잘못 처리하거나 경계 정보를 무시하면 노이즈는 줄어도 광량과 그림자 경계가 망가질 수 있습니다.

증상주요 원인우선 확인할 항목
전체적으로 거친 표면베이킹 샘플 부족, 간접광 분산 증가샘플 수, 반사광, 노출
밝은 점과 어두운 점작은 광원, 글로시 반사, 미수렴 경로광원 크기, 러프니스, 수렴 여부
UV 경계의 밝은 선차트별 필터링 또는 패딩 부족UV 차트 ID, 패딩 픽셀 수
밉맵에서 검은 선패딩 영역에 미사용 텍셀이 포함됨텍스처 임포트, 밉맵, dilation
코너의 색 번짐인접하지 않은 차트가 필터링으로 혼합됨차트 마스크, 필터 커널

라이트맵 원본 노이즈와 AI 디노이징 및 심 보정 전후 비교

라이트맵 노이즈의 기술적 원리

경로 추적 기반 베이킹은 여러 광선 샘플의 평균으로 조명값을 추정합니다. 샘플 수를 N이라고 할 때 이상적인 조건에서 몬테카를로 추정량의 분산은 다음과 같이 감소합니다.

Var[LN]≈σ2/NVar[L_N] ≈ σ² / N

즉 샘플 수를 4배로 늘리면 분산은 대략 4분의 1로 줄어들지만 베이킹 시간이 증가합니다. 특히 작은 면적의 광원, 반사율이 높은 재질, 복잡한 간접광 경로에서는 σ² 자체가 커지므로 샘플 수를 많이 늘려도 노이즈가 남을 수 있습니다.

AI 디노이저는 일반적으로 다음 입력을 사용해 노이즈가 있는 픽셀의 신뢰도 높은 값을 추정합니다.

Ld=f(Lraw,A,N,D,C)L_d = f(L_raw, A, N, D, C)
  • L_raw: 베이킹된 원본 HDR 라이트맵
  • A: 알베도 또는 디퓨즈 가이드
  • N: 월드 또는 탄젠트 공간 노멀
  • D: 깊이, 거리 또는 위치 정보
  • C: UV 차트 ID와 같은 경계 조건
  • L_d: 디노이징된 조명값

여기서 중요한 점은 AI 모델이 없는 정보를 복원하는 것이 아니라 주변 패턴과 가이드 패스에서 통계적으로 그럴듯한 값을 추정한다는 사실입니다. 따라서 지나치게 낮은 샘플로 베이킹한 결과를 AI 디노이징만으로 완전히 복구할 수는 없습니다.

자동 보정 파이프라인은 어떻게 구성할까?

라이트맵 후처리는 다음 순서로 구성하는 것이 안정적입니다.

flowchart LR
 A[원본 HDR 라이트맵과 보조 패스 저장] --> B[선형 색 공간 정규화]
 B --> C[차트 마스크와 경계 검출]
 C --> D[가이드 기반 AI 디노이징]
 D --> E[토폴로지 기반 심 보정]
 E --> F[차트 내부 패딩과 dilation]
 F --> G[밉맵 및 엔진 임포트 검증]

각 단계의 출력물을 파일로 보관하면 아티팩트가 발생한 원인을 역추적하기 쉽습니다. 최소한 다음 패스를 함께 저장하는 것을 권장합니다.

패스포맷 및 조건용도
원본 라이트맵16비트 또는 32비트 선형 EXR디노이징 입력과 재처리
알베도선형 또는 명시적인 색상 변환 정보재질 경계 보존
노멀월드 공간 또는 탄젠트 공간표면 방향 차이 판별
차트 ID정수형 마스크서로 다른 UV 아일랜드 혼합 방지
샘플 수 또는 분산단일 채널 HDR 또는 정규화 마스크디노이징 강도 결정
유효 텍셀 마스크0과 1의 바이너리 마스크빈 영역 및 패딩 처리

1단계: 베이킹 원본을 디노이징에 적합하게 저장하기

AI 디노이징 전에 원본 데이터의 손실을 막아야 합니다.

  1. 라이트맵을 가능하면 선형 HDR EXR로 저장합니다.
  2. sRGB로 변환하거나 8비트 PNG로 압축하지 않습니다.
  3. 알베도와 노멀을 동일한 UV 기준으로 출력합니다.
  4. UV 차트 ID와 유효 텍셀 마스크를 생성합니다.
  5. 베이킹 노출값과 엔진의 라이트맵 스케일을 메타데이터로 기록합니다.

라이트맵을 먼저 sRGB로 변환하면 어두운 영역의 수치 분포가 달라져 디노이저가 실제 광량 대신 감마 보정된 색을 학습하거나 추정하게 됩니다. 디노이징은 선형 공간에서 수행하고 최종 엔진 임포트 단계에서만 프로젝트 규칙에 맞춰 색상 변환을 적용해야 합니다.

2단계: UV 차트 경계를 검출하고 마스크 만들기

심 보정의 핵심은 화면상으로 가까운 텍셀이 메시 표면에서도 실제로 이어지는지 판별하는 것입니다. 2D 텍스처 좌표에서 다음 조건 중 하나라도 만족하면 경계 후보로 분류할 수 있습니다.

  • 이웃 픽셀의 차트 ID가 다름
  • 유효 텍셀과 빈 텍셀이 맞닿음
  • 노멀 차이가 임계값보다 큼
  • 알베도 색상 차이가 임계값보다 큼
  • 메시의 UV 인접 정보가 존재하지만 라이트맵 값의 차이가 큼

단순히 차트 ID가 다르다는 이유만으로 모두 보정하면 안 됩니다. 서로 다른 표면이 실제로 만나는 모서리에는 의도적인 명암 차이가 있을 수 있기 때문입니다. 자동 보정 대상은 메시 인접 정보와 표면 연속성 검사를 통과한 경계로 제한해야 합니다.

UV 차트 ID와 라이트맵 심 보정 대상 영역을 겹쳐 표시한 예시

3단계: 가이드 기반 AI 디노이징 적용하기

AI 디노이징은 모델 종류보다 입력 데이터와 경계 처리 방식이 결과에 더 큰 영향을 줍니다. 실무에서는 다음 세 가지 접근을 비교할 수 있습니다.

접근 방식장점주의점
Open Image Denoise 계열HDR 렌더 결과에 적용하기 쉽고 CPU·GPU 경로 선택 가능라이트맵 특성에 맞는 가이드 입력과 경계 처리가 필요함
OptiX 계열 디노이저NVIDIA GPU에서 빠른 추론 가능플랫폼 종속성과 런타임 구성 확인 필요
커스텀 U-Net 또는 ONNX 모델라이트맵과 UV 차트 데이터에 맞춰 학습 가능학습 데이터, 검증 지표, 모델 배포 관리가 필요함

라이트맵에 적용할 때는 다음 원칙을 지키는 것이 좋습니다.

  • 타일 단위 추론 시 타일 사이에 충분한 오버랩을 둡니다.
  • 타일 경계를 차트 경계와 혼동하지 않도록 차트 마스크를 함께 전달합니다.
  • 알베도와 노멀을 가이드로 사용하되 조명값 자체를 과도하게 평탄화하지 않습니다.
  • 강한 그림자 경계에는 낮은 디노이징 강도를 적용합니다.
  • 샘플 수가 낮은 픽셀에만 디노이징 강도를 높이는 가중치를 사용합니다.

디노이징 결과를 원본과 완전히 교체하기보다 다음과 같이 혼합하면 과도한 광량 변화가 줄어듭니다.

Lout=(1−c)⋅Lraw+c⋅LdL_out = (1 - c) · L_raw + c · L_d

여기서 c는 픽셀별 신뢰도와 디노이징 강도를 결합한 값입니다. 예를 들어 샘플 수가 충분하고 분산이 낮은 픽셀은 c를 작게 유지하고 노이즈가 심한 픽셀은 c를 높입니다.

4단계: 심 아티팩트를 자동 보정하는 방법

심 보정은 세 종류로 나누면 구현과 검증이 쉬워집니다.

차트 내부 보정

빈 텍셀 또는 패딩 영역을 같은 UV 차트의 유효 텍셀로 확장합니다. 이때 차트 ID가 다른 픽셀을 후보로 사용하지 않도록 제한된 dilation을 적용합니다.

연결된 차트 사이의 보정

한 메시 엣지가 두 UV 차트로 분리된 경우에는 메시의 UV 인접 정보를 사용해 서로 대응하는 텍셀을 찾습니다. 대응점의 노멀과 알베도가 비슷하고 조명값 차이가 비정상적으로 크다면 두 값의 신뢰도 가중 평균으로 경계를 완화할 수 있습니다.

실제 불연속 경계 보존

벽과 바닥의 교차점처럼 표면 방향이 크게 달라지는 곳은 심처럼 보여도 보정하지 않을 수 있습니다. 노멀 차이가 크거나 메시 엣지에 의도적인 재질 분리가 표시된 경우에는 원본 명암을 보존해야 합니다.

가장 안전한 방법은 2D 주변 픽셀을 무작정 블러링하지 않고 메시 인접 정보를 통해 대응 텍셀을 직접 연결하는 것입니다. 다음 코드는 대응 텍셀 좌표와 연속성 신뢰도 맵이 준비되어 있다는 가정의 간단한 보정 예시입니다.

import numpy as np


def repair_seam(lightmap, border_mask, neighbor_xy, confidence, threshold=0.12):
    repaired = lightmap.copy()
    height, width, channels = lightmap.shape

    ys, xs = np.where(border_mask)
    for y, x in zip(ys, xs):
        if confidence[y, x] < threshold:
            continue

        ny, nx = neighbor_xy[y, x]
        if ny < 0 or nx < 0 or ny >= height or nx >= width:
            continue

        current = repaired[y, x]
        neighbor = lightmap[ny, nx]
        delta = np.linalg.norm(current - neighbor)

        if delta > threshold:
            weight = min(1.0, confidence[y, x])
            repaired[y, x] = current * (1.0 - weight * 0.5) + neighbor * (weight * 0.5)

    return repaired

이 예시의 neighbor_xy는 텍스처 공간에서 단순히 가까운 픽셀을 찾은 결과가 아니라 메시 엣지와 UV 좌표를 바탕으로 계산해야 합니다. 또한 실제 파이프라인에서는 RGB 값의 절대 차이보다 로그 광량 차이, 노멀 차이, 알베도 차이를 함께 평가하는 편이 안정적입니다.

디노이징과 심 보정의 파라미터는 어떻게 설정할까?

고정된 값 하나를 모든 에셋에 적용하면 작은 소품과 대형 건축물이 서로 다른 품질을 보입니다. 다음처럼 파라미터를 에셋 규모와 라이트맵 해상도에 따라 조정하는 것이 좋습니다.

파라미터시작값 예시조정 기준
AI 타일 오버랩16~32 px타일 경계가 보이면 증가
차트 패딩4~16 px목표 밉 레벨과 필터 크기에 맞춤
심 보정 폭1~3 px반복되는 경계선 폭에 맞춤
노멀 허용 차이10~25도실제 코너 보존 여부로 조정
광량 로그 차이에셋별 측정어두운 영역과 밝은 영역의 균형 확인
혼합 가중치 c0.2~0.8원본과 디노이징 결과의 에너지 차이로 조정

패딩은 단순히 텍스처 가장자리를 늘리는 작업이 아닙니다. 반드시 같은 UV 차트 내부의 유효 텍셀을 확장해야 합니다. 차트 ID를 무시한 dilation은 다른 표면의 조명을 끌어와 밉맵 단계에서 새로운 심을 만들 수 있습니다.

자동 검증은 어떤 기준으로 수행해야 할까?

시각적 확인만으로는 디노이징이 광량을 과도하게 바꿨는지 판단하기 어렵습니다. 다음 지표를 빌드 파이프라인에 포함하면 아티팩트를 수치로 추적할 수 있습니다.

  1. Raw와 Denoised의 평균 광량 차이
  2. 차트 내부의 경계 대비와 차트 간 경계 대비
  3. 보정 전후의 HDR 최대값 및 상위 백분위 값
  4. 유효 텍셀 밖의 색상 누출 비율
  5. 밉맵 생성 후 경계선 픽셀의 증가량
  6. 노멀 불연속 영역에서의 명암 보존 여부

전체 에너지 보존을 확인할 때는 다음과 같은 상대 오차를 사용할 수 있습니다.

E=∣mean(Lout)−mean(Lraw)∣/max(mean(Lraw),ε)E = |mean(L_out) - mean(L_raw)| / max(mean(L_raw), ε)

E가 지나치게 커지면 AI 디노이저가 어두운 영역을 밝히거나 그림자 영역을 평탄화했을 가능성이 있습니다. 다만 원본이 심하게 노이즈가 있는 경우에는 평균값만으로 품질을 판단할 수 없으므로 차트 내부와 경계 영역을 분리해 측정해야 합니다.

자주 발생하는 실패 사례

실패 사례잘못된 접근개선 방법
심은 사라졌지만 표면이 플라스틱처럼 보임전체 라이트맵에 강한 가우시안 블러 적용노멀 가이드와 차트 마스크를 사용하고 혼합 가중치 제한
밉맵에서 다시 검은 선 발생디노이징 후 패딩을 재생성하지 않음차트 제한 dilation을 디노이징 이후 수행
서로 다른 오브젝트의 조명이 섞임전체 텍스처를 하나의 이미지로 처리오브젝트 ID와 차트 ID를 추론 마스크에 포함
그림자 경계가 흐려짐경계 보호 없이 AI 모델 적용그림자·노멀 경계 마스크로 디노이징 강도 감소
재실행할 때 결과가 달라짐모델, 시드, 노출값을 기록하지 않음모델 해시와 파라미터를 빌드 로그에 저장

Unity와 Unreal Engine에 적용할 때의 차이

Unity 2022.3 LTS에서는 라이트맵 텍스처 임포트 설정과 색상 공간, 라이트맵 UV 생성 규칙을 먼저 확인해야 합니다. 후처리된 텍스처를 다시 임포트할 때는 프로젝트의 Color Space, 압축 포맷, 밉맵 설정이 원본 베이크 결과와 일치하는지 확인합니다.

Unreal Engine 5에서는 GPU Lightmass가 생성한 결과와 텍스처 스트리밍, 라이트맵 해상도, 패딩 설정의 상호작용을 확인해야 합니다. 엔진 내부에서 다시 압축하거나 스트리밍 밉을 생성하면 후처리 단계에서 보이지 않던 경계가 나타날 수 있으므로 최종 플랫폼 설정으로 검증해야 합니다.

두 엔진 모두 공통적으로 다음 원칙을 적용할 수 있습니다.

  • 원본 베이크 결과를 덮어쓰지 않고 버전별 산출물로 관리합니다.
  • 엔진 임포트 전 단계에서 HDR 디노이징과 심 보정을 완료합니다.
  • 최종 플랫폼의 텍스처 압축과 밉맵까지 포함해 검증합니다.
  • 반복 작업은 Python, OpenImageIO, ONNX Runtime 등의 배치 도구로 자동화합니다.

자주 묻는 질문 FAQ

AI 디노이징을 사용하면 라이트맵 샘플 수를 낮춰도 되나요?

일부 노이즈는 줄일 수 있지만 샘플 수를 지나치게 낮추면 광원 정보와 간접광 구조 자체가 손실됩니다. 먼저 최소 품질 샘플을 확보한 뒤 AI 디노이징을 후처리로 사용하는 것이 안전합니다.

심 아티팩트에 블러를 적용하면 안 되나요?

차트 내부의 작은 노이즈에는 제한적으로 사용할 수 있지만 전체 라이트맵 블러는 서로 다른 표면의 조명과 그림자 경계를 섞을 수 있습니다. UV 차트와 메시 인접 정보를 이용한 선택적 보정을 권장합니다.

라이트맵 디노이징에 알베도와 노멀 패스가 꼭 필요한가요?

항상 필수는 아니지만 경계 보존과 재질 변화 구분에 큰 도움이 됩니다. 특히 강한 그림자와 서로 다른 재질이 맞닿는 장면에서는 가이드 패스 없이 디노이징할 때 과도한 번짐이 생길 가능성이 커집니다.

정리

라이트맵 베이킹 결과물의 품질은 베이킹 샘플 수만으로 결정되지 않습니다. 원본 HDR 보존, 차트별 마스크, 알베도·노멀 가이드, 경계 인식 AI 디노이징, 메시 인접 기반 심 보정, 최종 밉맵 검증을 하나의 파이프라인으로 묶어야 안정적인 결과를 얻을 수 있습니다.

특히 심 아티팩트 자동 보정에서는 모든 경계를 평탄화하는 접근보다 실제로 연결된 메시 표면만 선택적으로 보간하는 것이 핵심입니다. 이렇게 구성하면 노이즈는 줄이고 그림자와 재질 경계는 보존하면서 반복적인 아트 후처리 작업도 빌드 단계에서 자동화할 수 있습니다.