ESRGAN으로 Low-res SDR 게임 에셋을 HD로 업스케일링하는 실전 파이프라인

저해상도 SDR 텍스처와 스프라이트를 ESRGAN으로 HD화할 때 생기는 색공간, 알파 채널, 과선명화 문제를 줄이고 게임 엔진에 안전하게 반영하는 검수·압축·LOD 파이프라인을 정리합니다.

✓ 복사 완료!
챕터렌더링 파이프라인 & 배칭
난이도중급
상태● 검토 완료
대상 엔진
Engine Agnostic
최종 업데이트
ESRGAN으로 Low-res SDR 게임 에셋을 HD로 업스케일링하는 실전 파이프라인

핵심 요약

Low-res SDR 에셋을 ESRGAN으로 HD화할 때 핵심은 단순히 해상도를 4×4\times로 키우는 일이 아니다. sRGB 색공간과 알파 채널을 보존한 입력 준비, AI가 만든 디테일의 아트 검수, 게임 런타임용 압축·밉맵·LOD 재설정까지 한 파이프라인으로 다뤄야 한다.

ESRGAN(Enhanced Super-Resolution Generative Adversarial Networks)은 지각적 손실과 GAN 기반 판별기를 사용해 선명한 고주파 디테일을 복원한다. 다만 실제로는 존재하지 않던 정보도 생성하므로 UI 글자·픽셀 아트·반복 타일에는 원본 대비 검수가 필수다.

Low-res SDR 에셋 업스케일링에서 무엇이 문제인가?

원본이 512×512인 텍스처를 2배 업스케일하면 출력은 1024×1024이며 4배면 2048×2048이다.

Wout=sWin,Hout=sHinW_{out}=sW_{in},\qquad H_{out}=sH_{in}

여기서 ss는 업스케일 배율이다. 픽셀 수와 비압축 RGBA8 메모리는 배율의 제곱으로 증가한다.

Mout=s2MinM_{out}=s^2M_{in}

예를 들어 512×512 RGBA8 텍스처는 약 1 MiB지만 4배 출력인 2048×2048은 약 16 MiB다. 최종 빌드에서는 BC7, ASTC 같은 GPU 압축을 사용하더라도 다운로드 크기, VRAM, 스트리밍 예산을 함께 확인해야 한다.

항목단순 보간(Bicubic)ESRGAN 계열
경계 처리부드럽지만 흐려질 수 있음선명하지만 링잉이 생길 수 있음
미세 질감원본 정보 안에서 확대학습 기반 디테일을 합성할 수 있음
UI·텍스트비교적 예측 가능글자 형태가 변형될 수 있음
픽셀 아트부적합한 경우가 많음대체로 부적합, 전용 알고리즘 권장
아트 검수낮음높음

SDR(Standard Dynamic Range) 컬러 텍스처는 보통 sRGB로 저장한다. 반면 normal map, mask, roughness, metallic, ambient occlusion은 색 데이터가 아니라 선형 데이터다. 이 둘을 같은 ESRGAN 설정으로 처리하면 감마 오류나 재질 반응 오류가 발생할 수 있다.

sRGB 알베도 텍스처와 선형 마스크 텍스처를 구분해 업스케일링하는 게임 에셋 파이프라인

ESRGAN 파이프라인은 어떻게 구성할까?

아래 구성은 오프라인 빌드 단계에서 가장 다루기 쉽다. 원본 파일을 덮어쓰지 않고 생성 결과와 검수 결과를 분리하는 것이 중요하다.

flowchart LR
    A[원본 Low-res SDR] --> B[에셋 분류·백업]
    B --> C[색공간·알파 전처리]
    C --> D[ESRGAN 추론]
    D --> E[알파 복원·후처리]
    E --> F[아트 검수]
    F --> G[밉맵·GPU 압축]
    G --> H[엔진 임포트·성능 검증]

1. 에셋을 용도별로 분류한다

먼저 아래 기준으로 입력을 나눈다.

에셋 유형권장 처리주의점
알베도·배경 일러스트ESRGAN 적용 후보색 번짐, 가짜 디테일 검수
사진 기반 표면 텍스처ESRGAN 적용 후보타일 경계와 반복 패턴 확인
UI 아이콘·글자벡터 원본 또는 수작업 재제작 우선문자 왜곡 가능성
픽셀 아트nearest-neighbor 또는 전용 픽셀 아트 업스케일러ESRGAN의 안티앨리어싱 방지
Normal map원본 고해상도 재베이크 우선RGB 채널을 이미지로 해석하면 안 됨
Roughness·Mask필요한 경우 보간 후 수작업 보정값 분포가 바뀌지 않게 관리

특히 normal map은 ESRGAN으로 직접 업스케일하지 않는 편이 안전하다. 고해상도 메시가 있다면 normal을 다시 베이크하고 없다면 선형 보간한 뒤 노멀 벡터를 정규화하는 방법을 검토한다.

2. sRGB와 알파 채널을 안전하게 준비한다

많은 초해상도 모델은 RGB 이미지를 입력으로 받는다. 투명 PNG의 RGBA 데이터를 그대로 넣으면 알파 가장자리의 검은색 또는 흰색 프린지가 RGB에 섞일 수 있다. 따라서 RGB와 알파를 분리해 처리한다.

  • 알베도 RGB는 sRGB 텍스처임을 명시하고 사용하는 도구의 입력 디코딩 방식을 확인한다.
  • 알파는 일반적으로 Lanczos 또는 bicubic으로 별도 확대한다.
  • 프리멀티플라이드 알파를 사용했다면 RGB를 먼저 언프리멀티플라이한 뒤 모델에 넣고 합성 시 다시 적용한다.
  • 가장자리 색이 투명 영역에서 잘리는 경우에는 dilate 또는 padding을 적용해 블리딩을 줄인다.

Python과 Pillow를 이용한 알파 분리의 최소 예시는 다음과 같다. 실제 ESRGAN 추론 호출부는 사용하는 구현체의 API 또는 CLI에 맞춰 연결한다.

from PIL import Image

scale = 4
source = Image.open("input/leaf.png").convert("RGBA")
rgb = source.convert("RGB")
alpha = source.getchannel("A")

# esrgan_upscale_rgb()는 선택한 ESRGAN 구현체의 추론 함수로 대체한다.
rgb_hd = esrgan_upscale_rgb(rgb, scale=scale)
alpha_hd = alpha.resize(rgb_hd.size, Image.Resampling.LANCZOS)

result = rgb_hd.convert("RGBA")
result.putalpha(alpha_hd)
result.save("output/leaf_x4.png")

3. 타일과 배치 처리의 경계를 관리한다

4K 이상의 입력을 한 번에 추론하면 VRAM 부족이 발생할 수 있다. 이때 이미지를 겹치는 타일로 나눠 추론하고 중앙 영역만 합성한다. overlap이 없으면 타일 경계에서 색조와 질감이 끊어진다.

권장 시작점은 타일 크기 512~1024px, overlap 32~64px이며 GPU VRAM과 모델 구현에 따라 조정한다. 출력의 유효 영역은 입력 overlap에 업스케일 배율을 곱해 계산해야 한다.

타일 기반 ESRGAN 추론에서 겹침 영역을 두고 중앙 결과만 합성해 경계 이음새를 줄이는 예시

AI 업스케일 결과는 무엇을 검수해야 할까?

ESRGAN의 결과는 해상도가 높아 보여도 원본 의도를 보존하지 않을 수 있다. 아래 항목을 원본과 나란히 비교한다.

  1. 실루엣과 읽기성: 캐릭터 윤곽, 아이콘 의미, 원거리 식별성이 달라지지 않았는지 확인한다.
  2. 가짜 디테일: 벽돌, 나뭇잎, 피부, 글자 주변에 원본에 없던 반복 무늬나 얼룩이 생기지 않았는지 확인한다.
  3. 알파 경계: 스프라이트 외곽에 어두운 테두리와 밝은 halo가 생기지 않았는지 확인한다.
  4. 반복 타일: UV 타일 경계가 자연스럽게 이어지는지 확인한다.
  5. 재질 반응: 알베도만 교체했을 때 roughness, normal, AO와 결합한 최종 조명이 어색하지 않은지 확인한다.

아트 검수는 100% 확대뿐 아니라 실제 카메라 거리에서도 해야 한다. 플레이 화면에서 한두 픽셀만 차지하는 디테일은 텍스처 비용만 늘리고 시각적 이득이 없을 수 있다.

Unity와 Unreal Engine에 HD 텍스처를 어떻게 반영할까?

엔진 임포트 단계에서는 파일 해상도보다 텍스처 역할과 플랫폼 압축 설정이 더 중요하다.

설정알베도·UI 컬러Normal·Mask·Roughness
색공간sRGB 활성화sRGB 비활성화
밉맵3D 월드 텍스처는 활성화3D 월드 텍스처는 활성화
압축 예시PC: BC7, 모바일: ASTC데이터 정확도가 필요한 포맷 선택
최대 해상도플랫폼 예산에 맞게 제한원본보다 과도한 해상도 방지

Unity에서는 Texture Import Settings의 sRGB (Color Texture) 를 알베도에만 켠다. Unreal Engine에서는 컬러 텍스처의 sRGB를 켜고 normal map은 Normalmap 압축 설정과 sRGB 비활성화를 사용한다. 엔진과 플랫폼별 지원 포맷은 프로젝트의 타깃 하드웨어 기준으로 확인해야 한다.

밉맵이 왜 필요한가?

고해상도 텍스처를 멀리서 샘플링할 때 원본 최상위 밉만 사용하면 모아레와 깜빡임이 증가한다. 밉맵은 거리와 화면 점유율에 맞는 저해상도 레벨을 사용하게 해 샘플링 안정성을 높인다.

다만 AI가 매우 날카로운 미세 패턴을 추가한 경우, 밉맵 생성 후 노이즈가 더 두드러질 수 있다. 이때는 업스케일 결과를 약하게 디노이즈하거나 샤프닝 강도를 낮춘 모델·설정을 사용하고 밉 체인까지 포함해 다시 검수한다.

품질과 메모리를 함께 관리하는 기준

모든 에셋을 일괄 4배 업스케일하면 빌드와 VRAM 비용이 빠르게 늘어난다. 우선순위는 화면 점유율, 카메라 근접도, 아트 중요도로 정한다.

우선순위적용 대상권장 전략
높음주인공 얼굴, 대표 배경, 근접 소품ESRGAN 후 수작업 보정과 인게임 검수
중간반복 노출되는 환경 텍스처타일 경계 검수 후 해상도 상한 적용
낮음원거리 소품, 짧게 노출되는 에셋기존 해상도 유지 또는 2배만 적용

해상도 상한과 스트리밍 정책을 먼저 정하면 업스케일링이 단순한 파일 증가가 아니라 예산 안의 품질 개선 작업이 된다.

자주 묻는 질문 (FAQ)

ESRGAN은 픽셀 아트에도 사용할 수 있나?

대체로 권장하지 않는다. ESRGAN은 자연스러운 질감과 경계 생성을 목표로 하므로 픽셀의 계단형 윤곽과 제한된 팔레트를 바꿀 수 있다. 픽셀 아트는 nearest-neighbor 확대나 전용 알고리즘, 수작업 리터치가 더 적합하다.

알파 채널도 ESRGAN으로 업스케일해야 하나?

보통은 아니다. RGB만 ESRGAN으로 처리하고 알파는 별도 보간한 뒤 재결합하는 편이 예측 가능하다. 헤어카드나 연기처럼 알파 형태가 품질을 좌우하는 에셋은 결과를 수작업 보정해야 한다.

Normal map을 ESRGAN으로 확대하면 안 되는 이유는 무엇인가?

normal map의 RGB 값은 표면 방향 벡터를 인코딩한다. 이미지 질감을 복원하는 모델은 이 의미를 보장하지 못하므로 조명 반응이 틀어질 수 있다. 가능하면 고해상도 원본에서 재베이크한다.

마무리

ESRGAN은 저해상도 SDR 아트에서 빠르게 HD 후보를 만드는 유용한 도구지만 최종 에셋 제작을 완전히 대체하지는 않는다. RGB·알파·선형 데이터의 역할을 분리하고 AI 결과를 실제 게임 카메라와 압축된 런타임 텍스처 기준으로 검수하면 품질 향상과 메모리 예산을 함께 지킬 수 있다.