Rust와 WGPU를 이용해 시트콤 121개 에피소드에서 추출한 영상 클립 2만 9천 개로 모자이크를 실시간 렌더링하는 데모가 공개됐다. 제작자는 GPU 메모리에 모든 영상을 올리는 대신, 화면에 보이는 타일만 불러오고 캐시에 보관하는 방식으로 구현했다.
이 모자이크는 각 픽셀을 영상 클립 하나로 바꾼다. 평균 길이가 1.7초인 클립을 모두 합치면 약 14시간 분량이며, 제작자는 색차 서브샘플링을 적용해도 전부 저장하려면 GPU 메모리 1,750GB가 필요하다고 설명한다. 이에 운영체제의 가상 메모리에서 착안해, 실제 메모리에는 현재 필요한 타일만 두고 참조 텍스처를 통해 해당 타일의 위치를 찾도록 했다.
화면을 이동할 때는 새로 들어온 영역만 처리해 보이는 타일을 추적한다. 축소 상태에서는 낮은 해상도 버전을 불러오고, 확대하면 화면에 나타난 타일의 고해상도 버전을 요청한다. 화면 밖 타일은 CPU 메모리 캐시에 남겨뒀다가 공간이 부족할 때 여러 단계의 기준으로 제거한다. 영상 로딩은 작업 스레드에 맡기며, 로딩이 끝나기 전에는 타일의 색으로 대신 표시한다.
렌더링이 바뀌거나 새 타일이 로드되면 GPU의 아틀라스 텍스처와 참조용 페이지 테이블을 갱신한다. 전체 텍스처를 매번 복사하지 않고 사용 중인 부분만 GPU에 전송해 데이터 이동량을 줄인다. 영상은 FFMPEG Rust 바인딩으로 64×64 크기에서 처리하며, 프레임 평균 색을 기준으로 장면을 나누고 Kiddo의 k-d 트리로 모자이크 색과 가까운 클립을 찾는다.
제작자는 기존 Python 구현과 비교해 하드웨어 렌더링으로 화면 해상도에 따라 렌더링 속도가 30~80배 빨라졌다고 밝혔다. 다만 두 구현은 각각의 기술 방식을 탐구하는 실험이 목적이어서 공정한 성능 비교는 아니라고 덧붙였다. 데모 녹화본에서 보이는 끊김은 캡처 프로그램의 문제일 가능성이 있으며, 제작자는 화면 주사율과 녹화 주사율이 어긋난 탓일 수 있다고 추정했다.
이전 Python 구현은 Pysaic 프로젝트 글에서 확인할 수 있다. 렌더러는 wgpu, 스레드 작업은 Rayon, 영상 처리는 FFMPEG Rust 바인딩, 색상 검색은 Kiddo를 사용했다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요