게임 스프라이트를 로컬 Wan 2.2로 뽑아봤다. (핑크팬더 5모션)
게임 스프라이트를 로컬 Wan 2.2로 뽑아봤다. (핑크팬더 5모션)
게임 스프라이트를 AI 영상으로 만든다는 얘기를 들었다. 모탈컴뱃 제작진이 실제로 쓴 방식이라고 한다. 영상 생성 모델을 배우로 쓰는 것이다. 배우에게 동작을 찍게 하고, 크로마키로 배경을 지우고, 키프레임을 뽑아 아틀라스로 묶는다. 옛날 제작진이 실제 배우를 찍어 스프라이트를 그렸다는 이야기가 화제가 됐었다. 그 자리를 영상 모델이 대체하는 셈이다.
트렌드시프트에서 그 워크플로우를 에이전트 스킬로 만든 걸 봤다. gary149/h3-game-sprites다. H3(Hailuo/MiniMax)로 모션 클립을 만들고 크로마키, 키프레임 추출, 아틀라스까지 전부 대신 해준다. Hermes 스킬로 설치하니 금방 돌았다. 흐름 자체는 깔끔해서, H3 클립만 뺄 수 있으면 그대로 쓸 수 있는 구조였다. 문제는 영상 생성이었다. H3는 오픈웨이트가 2026년 8월에 나왔지만 라이선스가 미국·EU·영국·한국을 빼놓았고, API는 유료라 당장 쓸 데가 없었다. 그때 OpenRouter에도 텍스트투비디오 H3가 없었고 MiniMax 키도 없었다.
로컬에 서빙 중인 딥시크나 qwen3.8 같은 LLM은 텍스트만 뱉는다. 대체가 안 된다. 오픈소스 영상 모델을 직접 돌리는 수밖에 없었고, 알리바바의 Wan 2.2 TI2V-5B가 후보가 됐다.
H3가 없어서 Wan으로
검토한 대안은 이랬다.
| 옵션 | 판정 |
|---|---|
| H3(미니맥스) | 오픈웨이트 2026년 8월 공개됐지만 라이선스가 미국·EU·영국·한국 제외, API는 클립당 $0.6 |
| 로컬 LLM 대체(딥시크/qwen3.8) | 텍스트만 뱉어 영상 생성 불가 |
| GB10 듀얼 | 딥시크 서빙으로 두 노드 다 약 92% 점유 |
| 로컬 2080 Ti(11GB) | Turing이라 fp8/bf16 텐서코어 없음, GGUF Q4 + 480p로 수 분~십수 분 |
| 워크스테이션(일회성) | 720p 5.1분/46GB로 검증 완료, 상시 구동은 안 되는 워크스테이션 |
| 리모트 서버의 L40 세 번째 GPU | Ada라 fp8 지원, 여유 17.6GB, GGUF 480p 실운영 후보(검토만) |
Apache-2.0이면서 5B 수준에서 도는 이미지투비디오가 마침 Wan이었다. TI2V는 텍스트와 이미지를 같이 받는 모델이다. 첫 프레임에 캐릭터 스틸을 고정하는 idle 핀 트릭이 그대로 성립한다. 모션이 끝나면 캐릭터가 자기 자리로 돌아오고, 화면 밖으로 이탈하지도 않는다. 격투게임 스프라이트에 이만한 성질이 없다.
결국 워크스테이션을 일회성으로 빌려 쓰는 게 답이었다. 검증은 그 길로 끝났고, 상시로 얹을 자리는 남은 숙제다.
VRAM은 5B bf16 로드가 24.2GB, 720p 생성 피크가 46GB다. 실험실의 워크스테이션(96GB)에 딱 맞았다.
돌리는 데까지가 절반
환경 꾸리기가 모델보다 힘들었다. 실행은 Slurm sbatch로만 제출했다. GPU1에 떠 있는 vLLM(qwen3.8-27b 서빙)은 건드리지 않고, 빈 GPU0을 골라 쓴다. 잡이 끝나면 GPU를 반납한다.
venv 함정이 하나 있었다. 기존 서빙 venv에는 python-venv가 없어서 venv --without-pip로 만들고 get-pip로 부트스트랩했다. torch cu130은 vLLM venv를 복제한 뒤 python -m pip으로 diffusers만 얹었다. pip 스크립트는 shebang이 원본 인터프리터를 가리켜서, 그냥 쓰면 기존 venv를 오염시킨다. python -m pip으로만 깔아야 깨끗하다. 이 방식이면 로드가 7초(warm cache) 만에 끝났다.
모델은 Wan-AI/Wan2.2-TI2V-5B-Diffusers 공식 포트를 받았다. 20GB 안팎이었다. diffusers 0.40의 WanImageToVideoPipeline으로 I2V를 로드했다. CLIP이 필요 없고 VAE first-frame 방식이라 간단했다. 출력이 (1, F, H, W, C) float32 numpy라는 데서 두 번 헛짚었다. uint8 변환과 인덱싱이 따로 필요했다. 환경을 세우는 시간이 생성 시간보다 길었다. 이 글은 그 삽질의 기록이다.
첫 검증, 720p 5.1분
레퍼런스 영상이 하나 떴다. 121프레임(5초), 50스텝이었다. 생성에 5.1분, peak VRAM 46GB. 키잉은 bg_purity 1.0에 magenta 누수 0px이었다. idle 핀도 통과했다. 이 스트립을 sprite_cut.py로 잘라 12키프레임 스프라이트가 나왔다.


첫 결과치고는 반듯했다. 스트립 배경이 마젠타로 남아 있는 게 보일 텐데, 크로마키 원판이라는 뜻이다. 키잉 품질이 곧 스프라이트 품질이다.
핑크팬더 5모션
캐릭터는 핑크팬더로 정했다. 나노바나나(Nano Banana)로 스틸을 3장 만들어, 픽셀 단위 QA로 최고 1장을 골랐다. 장당 7센트였다. 3장을 한참 들여다보다가 고른 건데, 픽셀 단위로 보면 차이가 제법 났다.

이 스틸을 첫 프레임으로 박고 모션 5종을 생성했다. 달리기, 춤추기, 앞으로 뛰어가기, 쪼그려앉기, 총쏘기다. 121프레임짜리는 5분 전후, 81프레임짜리는 3.1분이었다. 다 합치면 약 21분이다.
달리기부터 스트립과 애니메이션을 붙였다.


춤추기.


앞으로 뛰어가기.


쪼그려앉기.


총쏘기.


전부 sprite_cut.py로 잘랐고, bg_purity 1.0에 magenta 누수 0px이었다. 달리기·춤·앞뛰기는 --loop로 루프 시임까지 탐지했다. GIF를 보면 각 모션이 끝날 때 캐릭터가 제자리로 돌아온다. idle 핀이 딱 그 역할을 한다. 프레임을 넘겨가며 일일이 확인했다. 프레임 사이 캐릭터 일관성도 좋았고, 잘림이나 변형, 잔상이 없었다. 게임 애니메이션 자산으로 바로 쓸 수 있는 수준이다.
남은 숙제
결과물 전반은 만족스러웠다. 다만 손가락이나 모션이 조금 더 역동적이었으면 좋겠다는 평이 나왔다. 프롬프트로 어느 정도는 잡힐 걸로 본다. 추후 프롬프트 실험을 조금 더 해볼 생각이다. 성패와 상관없이 GPU 시간 몇 분이면 되는 실험이라 부담은 없다. 아직 확정은 아니고, 후속 테스트로 남겨뒀다.
파이프라인은 성립했다. 나노바나나가 스틸을 만들고, Wan 2.2 TI2V-5B가 모션을 만들고, sprite_cut이 키잉·키프레임을 맡는다. 클립당 60센트였을 작업이 GPU 시간 몇 분으로 줄었다. 외부 API 비용에 붙들리지 않아도 된다는 게 크다. 스킬은 MIT, Wan 2.2는 Apache-2.0이라 쓰는 데 거리낄 것도 없다. L40 세 번째 GPU는 여유가 나면 실운영 자리로 다시 볼 만하다. 다음엔 2080 Ti에 GGUF 480p로 얹어볼지도 모르겠다. 느리겠지만, 상시 돌릴 수 있다는 게 값이다. 모션을 더 뽑고 싶은 사람은 직접 돌려보자.