유료 API 없이 픽셀아트 RPG 스프라이트 시트 자동 생성 — Pixel Art Sprite Diffusion + IPAdapter + OpenPose + Canny (AI RPG 3편)

2편에서 Gemini로 해결했는데, 왜 다시 로컬로?

2편에서 캐릭터 문제를 Gemini(Nano Banana Pro) 로 풀었습니다. 정면 하나만 잘 뽑고 나면 뒷모습·측면·배경 제거까지 알아서 해줬죠. 그런데 결론이 이랬어요.

“자동화하려면 유료 API. NPC 50명이면 API 호출 200번. 비용이 만만치 않다.”

그래서 이번 편의 질문은 이겁니다.

“유료 API 없이, 그리고 무거운 GPU 없이 스프라이트 시트를 양산할 수 있을까?”

결론부터 말하면 — 거의 됩니다. 뒷모습만 Gemini API 1회로 우회하는 하이브리드지만, 정면·측면은 로컬에서 다 돌아갑니다. 2편의 “캐릭터당 4회 API 호출”이 “1회”로 줄었어요.

최종 결과 — 4방향 스프라이트(정면·측면·후면·측면)

이 결과를 어떻게 만들었는지 순서대로 정리합니다.

광고를 클릭해주시면 블로그운영에 큰 힘이 됩니다.

픽셀아트 전용 모델부터 — Pixel Art Sprite Diffusion

일단 픽셀아트에 특화된 SD 계열 모델을 찾았습니다. Civitai에서 다운로드 5.4K, 좋아요 462인 Pixel Art Sprite Diffusion을 잡았어요.

Pixel Art Sprite Diffusion — Civitai 페이지, Safetensors 배포

이 모델의 장점은 처음부터 스프라이트 시트 형태로 결과가 나온다는 것. 별도 후처리 없이 4방향 정도가 한 이미지에 얹혀 나옵니다.

Pixel Art Sprite Diffusion — 4프레임 스프라이트 형태로 출력

하지만 한계가 있었습니다. 이 모델이 학습한 스타일이 한정적이라, 원하는 캐릭터 콘셉트를 자유롭게 뽑기 어려웠어요. 특정 서양 게임 스타일에 가까운 결과만 나오는 느낌이랄까요. 우리가 원하는 일본식 SD(Super Deformed) 픽셀아트 RPG 캐릭터로 가려면 다른 모델과 병행이 필요했습니다.

기본 모델로는 픽셀 감이 나는 캐주얼 모델을 선택

그래서 실제 기본 모델로는 다른 SD 계열 체크포인트를 썼습니다. 픽셀아트 뉘앙스는 있지만 좀 더 자유로운 스타일을 뽑을 수 있는 모델이었어요. 정확한 이름은 지금 다시 찾지 못했는데, 결과물의 느낌은 이런 식입니다.

기본 모델 결과 — 정면 캐릭터 1

기본 모델 결과 — 정면 캐릭터 2

정면 하나는 이 모델로 뽑을 수 있게 됐습니다. 문제는 여기서부터입니다.

캐릭터 일관성 — IPAdapter는 기대만큼은 아니었다

정면 하나가 나왔다고 끝이 아닙니다. 같은 프롬프트로 다시 뽑으면 얼굴이 바뀌고 옷이 바뀝니다. 후면·측면을 뽑으려고 하면 아예 다른 사람이 나옵니다. 2편에서 SD가 잘 안 됐던 그 문제 그대로예요.

이걸 해결하겠다고 IPAdapter(Image Prompt Adapter, IPA) 를 얹어봤습니다. 정면 기준 이미지 하나를 참조로 함께 넣어서 스타일을 강제하는 방식입니다. 원리는 좋아 보였는데, 결과는 기대만큼은 아니었어요. 스타일 힌트로는 어느 정도 작동하는데, “같은 캐릭터를 유지한다”는 확실한 잠금은 걸리지 않았습니다. 결국 IPA는 보조 수준으로 남기고, 진짜 통제는 다음 두 컨트롤넷으로 넘어갔습니다.

포즈는 OpenPose로 강제 — 그리고 결국 코드로

포즈를 제어하려면 OpenPose(오픈포즈) ControlNet을 얹어야 합니다. 스켈레톤(관절 위치)을 그림처럼 그려서 넣으면, 모델이 그 뼈대 위에 캐릭터를 얹어 그려주는 방식이에요.

처음엔 OpenPose 에디터 툴로 스켈레톤을 직접 만들었습니다. 3D 인체 모형을 돌려가며 관절을 잡고, 정면/측면/후면 4방향 스켈레톤을 뽑는 식이었어요.

OpenPose 에디터 — 3D 스켈레톤을 돌려가며 4방향 포즈 제작

한 캐릭터 뽑는 데 이걸 4번씩 해야 한다는 게 문제였습니다. NPC 50명이면 200번. API 비용 피하려다 노가다 지옥으로 들어가는 상황이었죠.

그래서 코드로 넘어갔습니다. OpenPose 스켈레톤은 결국 관절 좌표의 나열이에요. 정면·측면·후면·다른 측면의 관절 좌표 세트를 함수로 만들고, 파이썬으로 스켈레톤 이미지를 직접 렌더링했습니다. 툴로 하던 4번의 클릭 작업이 함수 호출 한 번으로 줄었어요.

OpenPose 컨트롤로 뽑은 측면 뷰 — 포즈는 잡히지만 실루엣 문제 발생

Canny Edge로 실루엣·윤곽 잡기

IPA로 스타일 잡고 OpenPose로 포즈 잡아도 한 가지가 더 흔들렸습니다. 캐릭터의 실루엣·의상의 굴곡·소품의 위치요. 예를 들어 망토 라인이 프레임마다 다르게 나오거나, 무기 위치가 어긋나거나.

그래서 세 번째 컨트롤넷으로 Canny Edge를 붙였습니다. 참조 이미지에서 엣지(윤곽선)를 추출해서 그걸 조건으로 강제하는 방식이에요.

Canny Edge 결과 — 참조 이미지에서 추출한 픽셀 단위 엣지

엣지 이미지 자체는 사람 눈엔 이상하게 보입니다. 픽셀아트에서 뽑은 Canny라 얇은 사각형 선들이 어지럽게 나와요. 그런데 모델은 이걸 잘 이해합니다. “이 실루엣 안에서 그려라”라는 강한 제약이 되니까요.

로컬 조합은 결국 이렇게 두 컨트롤넷 중심으로 굳어졌습니다:

컨트롤 역할
OpenPose 포즈(정면·측면·걷기 자세) 강제
Canny Edge 실루엣·의상 라인·소품 위치 유지
IPAdapter 스타일 힌트 정도, 결정적 도움은 못 됨

그런데 이 조합으로도 한 가지가 계속 안 풀렸습니다.

뒷모습만 유독 안 나왔다 — 결국 Gemini로 우회

정면·측면은 OpenPose + Canny로 그럭저럭 뽑혔습니다. 그런데 뒷모습만 유독 안 됐어요. 뒷모습은 얼굴 정보가 없어 모델이 참고할 게 머리카락·의상·망토뿐이라, 스켈레톤과 엣지를 넣어도 캐릭터의 정체성이 무너지는 경우가 잦았습니다.

여기서 절충안을 냈습니다. 로컬 파이프라인으로 안 되는 뒷모습만 Gemini(Nano Banana Pro)에 의뢰하는 방식이에요. 정면·측면은 로컬로 뽑고, 뒷모습 한 컷만 API로 채우는 하이브리드입니다.

Gemini에 지시 — "귀는 머리로 덮고, 몸과 다리는 망토로 완전히 덮은 뒷모습"

Gemini 결과 — 참조 이미지 스타일 유지된 뒷모습

캐릭터 하나당 API 호출 1회로 줄었습니다. NPC 50명이면 50번. 2편에서 걱정하던 “50명 × 4장 = 200번”의 4분의 1이에요. 이 정도면 비용이 견딜 만합니다.

이 편의 파이프라인 요약은 결국 이렇게 정리됩니다.

담당
정면 로컬(픽셀아트 모델 + OpenPose + Canny)
측면(좌·우) 로컬(같은 조합)
뒷모습 Gemini API 1회 (하이브리드 절충)

셋을 조합하면 이 편 처음에 봤던 4방향 스프라이트 시트가 나옵니다.

리터치는 최소한만

솔직히 100% 완벽하진 않습니다. 프레임마다 얼굴이 살짝 다르거나, 뒷모습에서 팔 길이가 어색하거나, 걷기 프레임 사이 연속성이 어긋나는 경우가 있어요.

그래서 최소한의 리터치가 여전히 들어갑니다. 마감 픽셀 몇 개 고치는 정도예요. 다만 이게 “AI가 뽑은 걸 사람이 처음부터 다시 그리는” 수준은 아닙니다. 틀만 잡히면 손볼 곳이 눈에 띄게 줄었다는 게 이번 편의 성과입니다.

리터치까지 자동화하려는 시도도 병행 중이에요. Claude Code로 픽셀 후처리 스크립트를 짜서 반복 노가다를 줄이는 방향입니다. 결국 “AI로 만든 걸 AI로 다듬는” 구조로 가고 있습니다.

다음은 LoRA — 진짜 양산 체제

여기까지가 오늘 도착한 지점입니다. 그런데 여전히 문제 하나가 남아요. 매번 IPAdapter 참조 이미지를 준비해야 한다는 것. 같은 캐릭터 하나 뽑는 건 되는데, “이 게임의 아트스타일” 자체를 학습시켜서 새 NPC를 프롬프트만으로 뽑고 싶어지죠.

그래서 다음 단계는 LoRA(Low-Rank Adaptation) 학습입니다. 지금까지 뽑아둔 캐릭터 결과물을 데이터셋으로 삼아, “우리 게임 스타일” LoRA를 하나 만드는 거예요. 성공하면 IPAdapter 없이도 스타일이 유지되고, 프롬프트만 바꿔서 새 NPC를 양산할 수 있게 됩니다.

이건 다음 편에서 다뤄보겠습니다.

정리 — 로컬 컨트롤넷 + 뒷모습만 Gemini 하이브리드

이번 편의 핵심을 다시 모으면:

  • 픽셀아트 전용 모델(Pixel Art Sprite Diffusion)은 처음부터 스프라이트 형태로 결과가 나오지만 스타일 제약이 있음. 기본 모델과 병행 필요.
  • IPAdapter는 기대만큼은 아니었음. 스타일 힌트 수준의 보조 역할에 그침. “같은 캐릭터 잠금”까지는 걸리지 않았음.
  • 포즈 통제는 OpenPose ControlNet. 툴로 시작해서 결국 파이썬으로 스켈레톤 좌표를 코드 생성.
  • 실루엣·라인 유지는 Canny Edge ControlNet.
  • 정면·측면은 로컬로 됨. 하지만 뒷모습은 유독 안 나옴 — 얼굴 정보가 없어 정체성이 무너짐.
  • 뒷모습만 Gemini(Nano Banana Pro) API 1회로 우회. 2편의 “50명 × 4장 = 200번”에서 “50명 × 1장 = 50번”으로 줄임. 하이브리드 절충.
  • 리터치는 여전히 필요하지만 대폭 줄었고, 그마저도 코드로 자동화 시도 중.
  • 다음 단계는 LoRA — 게임 아트스타일 자체를 학습시켜 프롬프트만으로 새 캐릭터 양산. 뒷모습까지 로컬로 잡히면 Gemini도 뺄 수 있을 것.

시리즈 흐름 정리

  • 1편: SDXL Turbo로 맵·SAM v3로 마스크. 캐릭터는 실패.
  • 2편: Gemini(Nano Banana Pro)로 캐릭터 일관성·후면/측면 뷰 해결. 자동화는 API 비용 문제.
  • 3편(이번): 로컬 스프라이트 파이프라인 완성. OpenPose + Canny로 정면·측면 처리, 뒷모습만 Gemini 하이브리드. 캐릭터당 API 호출 1회로 절감.
  • 4편(예고): LoRA로 게임 스타일 학습 → 뒷모습까지 로컬로 잡아 진짜 양산 체제로.
Share: Twitter Facebook
김민석's Picture

About 김민석

항상 공부가 부족한 개발자, 항상 시간이 부족한 딸바보, 항상 체력이 부족한 부족한남편, 그리고 고양이 집사

JungNangGu, Seoul, Korea Rep https://reddol18.pe.kr

Comments