초해상도

편집 역사 토론

1. 개요[편집]

초해상도
Super-Resolution / Upscaling
목적저해상도로 렌더하고 고해상도로 복원 → 프레임 확보
양대 계열공간적(단일 프레임) / 시간적(다중 프레임 누적)
핵심 재료서브픽셀 지터 + 모션 벡터 + 히스토리 버퍼
대표 구현DLSS, FSR, XeSS, TSR, MetalFX
주적고스팅, 디스오클루전, 시간적 불안정

픽셀을 다 그리기엔 시간이 없다. 그러면 덜 그리고, 나머지는 추측하면 된다.

초해상도(super-resolution)는 낮은 해상도로 얻은 영상에서 그보다 높은 해상도의 영상을 복원하는 기법의 총칭이다. 실시간 렌더링 문맥에서는 특히 렌더 해상도를 목표 해상도보다 낮게 잡아 GPU 부하를 줄이고, 업스케일 단계에서 화질을 되찾아 프레임을 버는 기술을 가리킨다. 4K 출력을 1440p로 렌더하면 픽셀 수가 대략 44%로 줄어드니, 픽셀 셰이딩이 지배적인 워크로드에서는 그대로 두 배 가까운 프레임이 나온다.

정보 이론적으로 보면 이건 공짜가 아니다. 없는 정보를 만들어내는 것은 불가능하고, 초해상도가 실제로 하는 일은 다른 데서 정보를 빌려오는 것이다. 빌려오는 곳이 어디냐로 계열이 갈린다. 이웃 픽셀에서 빌려오면 공간적 방법, 지난 프레임들에서 빌려오면 시간적 방법, 대규모 데이터에서 학습한 사전지식에서 빌려오면 학습 기반 방법이다. 오늘날 실전에서 쓸 만한 것은 사실상 두 번째와 세 번째의 결합이다.

표본화 관점의 기초 — 왜 계단이 생기고 왜 저역통과가 필요한가 — 는 안티앨리어싱에, 텍스처 축소 쪽의 대응물은 밉맵에, 지오메트리 쪽의 대응물은 레벨 오브 디테일에 있다. 이 문서는 화면 해상도 자체를 낮췄다가 되살리는 부분만 다룬다.

2. 왜 이득인가[편집]

실시간 렌더링의 프레임 예산은 60 fps 기준 16.6 ms다. 이 예산 안에서 가장 잘 늘어나는 항목이 픽셀 수에 선형으로 비례하는 부분 — 픽셀 셰이딩, 라이팅, 레이 트레이싱의 픽셀당 광선 — 이다. 렌더 해상도를 각 축 ss배로 줄이면 이 비용은 s2s^2배가 된다.

Cpixel(s)Cpixel(1)=s2,s=0.670.44\frac{C_{\text{pixel}}(s)}{C_{\text{pixel}}(1)} = s^{2}, \qquad s = 0.67 \Rightarrow 0.44

반면 정점 처리, 그림자 맵 생성, CPU 드로콜 같은 해상도 비의존 비용은 그대로 남는다. 그래서 초해상도의 실측 이득은 이론값보다 늘 작고, 장면이 CPU 바운드면 아무 효과도 없다. “DLSS 켰는데 프레임이 그대로예요”라는 제보의 대다수가 여기에 해당한다.1

3. 공간적 방법 — 한 장으로 버티기[편집]

한 프레임만 보고 확대하는 방법. 가장 단순한 것은 쌍선형·바이큐빅 보간과 근사지만, 이들은 모서리를 함께 뭉개서 흐릿한 그림을 준다.

FSR 1.0(AMD, 2021)이 이 계열의 대표다. 두 단계로 나뉘는데, 먼저 EASU(Edge Adaptive Spatial Upsampling)가 1212탭 이웃에서 국소 기울기를 추정해 모서리 방향으로는 길게, 수직 방향으로는 좁게 커널을 눕힌 램차즈(Lanczos) 유사 필터를 적용하고, 이어 RCAS가 대비 적응 샤프닝으로 잃은 고주파를 되살린다. 히스토리도 모션 벡터도 필요 없어서 어떤 엔진에도 몇 시간이면 붙일 수 있고, 오래된 게임이나 에뮬레이터에도 후처리로 얹힌다.

한계는 명확하다. 없는 표본을 만들어내지는 못한다. 저해상도 렌더 단계에서 이미 사라진 얇은 철망, 머리카락, 원거리 디테일은 어떤 필터로도 복원되지 않는다. 계단을 매끄럽게 다듬을 수는 있어도 잃어버린 표본을 되돌릴 수는 없다는 것이 공간적 방법의 천장이다.

4. 시간적 초해상도 — 프레임을 가로질러 표본을 모은다[편집]

직접 구현한 미니 래스터라이저로 회전하는 큐브를 그리면서 픽셀당 4개 서브표본을 실제로 찍어 평균 낸다 — 진짜 4× 슈퍼샘플링이다. 시간적 초해상도가 하는 일도 결국 같은 적분이고, 다만 이 4개 표본을 한 프레임에 몰아 찍는 대신 프레임 4장에 나눠 찍고 모션 벡터로 되끌어와 합친다는 점만 다르다. 이 커널은 어디까지나 공간 슈퍼샘플링이라 서브픽셀 지터·모션 벡터 재투영·히스토리 클램핑은 들어 있지 않다는 점은 밝혀둔다.

현대 초해상도의 본체다. 아이디어는 한 줄로 요약된다 — 한 프레임에 표본을 NN개 찍는 대신, 프레임 NN장에 걸쳐 서로 다른 위치에 1개씩 찍고 모아라. 위 시뮬레이션이 한 프레임 안에서 하는 4× 슈퍼샘플링을, 시간축으로 펼쳐서 공짜로 하겠다는 발상이다. 필요한 재료는 셋이다.

  • 서브픽셀 지터 — 매 프레임 투영행렬을 픽셀의 일부만큼 흔들어 표본 위치를 옮긴다. 흔드는 순서는 균등하게 퍼져야 뭉치지 않으므로, 할톤(Halton) 수열이나 소볼 수열 같은 저불일치(low-discrepancy) 수열을 쓴다. 몬테카를로 방법에서 준난수를 쓰는 이유와 정확히 같은 이유다.
  • 모션 벡터 — 이번 프레임의 픽셀이 지난 프레임 화면 어디에 있었는지를 담은 화면 공간 벡터장. 카메라 이동은 행렬로 계산되지만 물체 이동과 스켈레탈 애니메이션 변형은 엔진이 직접 기록해줘야 한다. 이게 초해상도 통합 작업의 실질적 대부분이다.
  • 히스토리 버퍼 — 누적된 고해상도 결과. 재투영해서 가져온 히스토리와 이번 프레임 표본을 지수 이동평균으로 섞는다.
Ct=αCnew+(1α)Chist(pvt),α0.050.15C_t = \alpha\, C_{\text{new}} + (1-\alpha)\, C_{\text{hist}}(\mathbf{p} - \mathbf{v}_t), \qquad \alpha \approx 0.05 \sim 0.15

α=0.1\alpha = 0.1이면 유효 누적 창이 약 10프레임이니, 정지 화면에서는 사실상 10×10\times 슈퍼샘플링에 해당하는 표본을 모으게 된다. 이 방식이 안티앨리어싱의 TAA와 같은 기계 위에 서 있다는 점이 중요하다 — 출력 해상도를 렌더 해상도보다 크게 잡으면 그게 곧 TAAU(temporal AA upsampling)이고, 언리얼의 TSR, AMD FSR 2 이상, 인텔 XeSS, NVIDIA DLSS가 모두 이 골격을 공유한다.

5. 실패 모드 — 고스팅, 디스오클루전, 클램핑[편집]

시간적 방법의 전제는 “지난 프레임의 그 픽셀과 지금 이 픽셀이 같은 표면”이라는 것이다. 이 전제가 깨지는 곳마다 아티팩트가 생긴다.

  • 고스팅(ghosting) — 히스토리가 유효하지 않은데 계속 섞이면 움직이는 물체 뒤에 잔상이 끌린다. 그림자, 반사, 반투명처럼 모션 벡터가 표면과 다르게 움직이는 성분이 특히 취약하다.
  • 디스오클루전(disocclusion) — 앞 물체가 비켜서면서 드러난 배경은 히스토리가 아예 없다. 깊이 버퍼 차이나 모션 벡터 불일치로 감지해 히스토리를 버려야 하는데, 그 순간 그 영역만 표본 1개짜리 저해상도로 돌아가 지글거린다.
  • 이웃 클램핑(neighborhood clamping) — 표준 처방. 현재 프레임에서 그 픽셀의 3×33\times3 이웃 색이 이루는 AABB(축 정렬 경계상자)를 YCoCg 색공간에서 구하고, 재투영한 히스토리 색을 그 상자 안으로 잘라 넣는다. 히스토리가 현재 장면과 너무 동떨어져 있으면 강제로 끌어당기는 셈이라 고스팅은 확실히 줄지만, 그만큼 누적된 진짜 디테일도 함께 깎여 흐려진다. 선명함과 안정성 사이의 다이얼이고, 어느 위치가 정답인지는 장면마다 다르다.2

6. 학습 기반, 프레임 생성, 그리고 평가[편집]

DLSS 2 이상과 XeSS는 위의 휴리스틱(클램핑 규칙, 블렌드 가중치, 히스토리 폐기 판정) 자리에 학습된 심층 학습 신경망을 앉힌 것이다. 입력은 여전히 저해상도 컬러 + 깊이 + 모션 벡터 + 지터 오프셋이고, 물리적으로 하는 일도 여전히 시간적 누적이다. 다른 것은 “언제 히스토리를 믿을지”를 손으로 짜지 않고 대량의 고해상도 참조 프레임으로 학습했다는 점, 그리고 그 추론을 전용 행렬 연산 유닛에서 돌린다는 점뿐이다. 마법이 아니라 더 잘 튜닝된 클램핑에 가깝다.

프레임 생성과는 반드시 구분해야 한다. 초해상도는 렌더된 프레임 하나를 더 크게 만드는 공간적 조작이고, 프레임 생성은 렌더된 두 프레임 사이에 없던 프레임을 보간해 끼워 넣는 시간적 조작이다. 전자는 지연시간을 줄이지만(프레임이 실제로 빨리 나오므로), 후자는 표시 지연을 오히려 늘린다 — 다음 프레임이 나올 때까지 기다려야 사이를 보간할 수 있기 때문이다. 프레임레이트 숫자만 보고 둘을 같은 것으로 취급하면 체감 반응성에서 배신당한다.

화질 평가도 만만치 않다. PSNR과 SSIM은 정지 프레임 대 참조 프레임의 차이만 보므로, 시간적 불안정(플리커, 크롤링)을 거의 벌하지 못한다. 프레임별로는 참조에 가까운데 연속 재생하면 눈이 아픈 결과가 얼마든지 나온다. 그래서 실무 평가에는 프레임 간 차분 에너지, 정지 상태 수렴 속도, 디스오클루전 회복 프레임 수 같은 지표가 함께 쓰인다. 결국 참조와의 거리보다 시간축 일관성이 더 중요한 품질이라는, 오프라인 영상 처리와는 다른 판단 기준이 필요하다.3

여기서 과학·의료 영상 초해상도와의 차이도 분명해진다. 현미경·MRI·위성 영상의 초해상도는 참값을 모르는 측정을 복원하는 역문제이고(역문제 참고), 학습된 사전지식이 없던 구조를 그럴듯하게 만들어내는 환각(hallucination)은 곧 오진과 오판이라 치명적이다. 반면 게임 초해상도는 참값이 존재한다 — 그냥 풀해상도로 렌더하면 나온다. 목적도 정보 복원이 아니라 “풀해상도와 구분 안 되게 보이면서 더 싼 그림”이다. 그래서 여기서는 없는 디테일을 그럴듯하게 지어내는 것이 죄가 아니라 오히려 기능이다.4

7. 관련 문서[편집]

8. Footnotes[편집]

  1. 초해상도 옵션 이름이 화질 프리셋처럼 붙어 있는 것도 혼란의 원인이다. “품질/균형/성능/울트라 성능”은 사실 렌더 해상도 배율 s=0.67/0.58/0.5/0.33s = 0.67 / 0.58 / 0.5 / 0.33의 다른 이름일 뿐이다. 울트라 성능은 4K 출력에 720p로 렌더한다는 뜻인데, 이걸 켜놓고 화질을 논하는 것은 좀 곤란하다.

  2. 클램핑 강도를 올리면 고스팅이 사라지는 대신 화면이 흐려지고, 내리면 선명해지는 대신 잔상이 끌린다. 커뮤니티에서 “TAA 때문에 게임이 다 뿌옇다”는 불평과 “TAA 끄니까 지글거려서 못 보겠다”는 불평이 동시에 나오는 이유가 이 다이얼 하나다. 둘 다 맞는 말이라 더 슬프다.

  3. 이건 검증 및 확인이 늘 하는 이야기와 같다 — 오차 노름 하나로 요약한 수치는 그 노름이 안 보는 방향의 실패를 절대 잡아내지 못한다. 정지 프레임 PSNR은 시간축을 안 본다.

  4. 물론 e스포츠 판에서는 이 관대함이 사라진다. 초해상도가 만들어낸 원거리 실루엣이 실제 적의 위치와 미묘하게 다르면 그건 화질 문제가 아니라 경쟁 공정성 문제가 되기 때문. 그래서 대회 규정에서 업스케일러를 통일하거나 금지하는 경우가 있다.