무료 변환기 · 파일이 기기를 벗어나지 않습니다

GIF를 스프라이트 시트로 변환 — 무료, 브라우저 내 실행, 업로드 없음

나만의 gif to sprite sheet 만들기

GIF를 넣으면 게임에 바로 쓸 수 있는 스프라이트 시트가 나옵니다 — 열, 행, FPS를 선택하고 투명도를 유지한 채 PNG atlas를 다운로드하세요. 브라우저에서 실행되며 파일이 기기를 벗어나지 않습니다.

✦스프라이트
만들기 gif to sprite sheet

GIF를 스프라이트 시트로 변환하는 일은 직접 해보기 전까지는 사소해 보입니다. GIF는 이미 팔레트와 프레임별 지연 시간을 가진 전체 프레임의 연속이므로, 실제로 필요한 것은 각 프레임을 디코딩하고 투명도를 올바르게 합성한 뒤 그 프레임들을 텍스처 좌표로 지정할 수 있는 그리드 형태로 하나의 PNG에 배치하는 도구입니다. Neta Studio의 변환기는 이 디코딩 단계를 canvas 요소에서 로컬로 수행하므로 파일이 브라우저에 남아 있고 서버에 닿지 않습니다. GIF를 넣고 열, 행, FPS를 선택한 뒤 하나의 PNG atlas를 다운로드하면 됩니다.

어려운 부분은 그리기가 아닙니다. 팔레트, 타이밍, 그리드 계산입니다. GIF는 투명도를 색상 테이블의 인덱스로 저장하므로, 이미지 뷰어에서 깔끔해 보이던 프레임이 합성된 뒤에는 canvas에서 검정 또는 흰색 매트와 함께 도착할 수 있습니다. GIF의 프레임 지연은 100분의 1초 단위이며 프레임마다 다른 경우가 많아, 단순한 내보내기는 끊기는 시트를 만들어냅니다. 이 페이지에서는 중요한 설정과 도구를 만들면서 마주친 실패 유형을 다룹니다.

GIF를 스프라이트 시트로 변환

변환기는 페이지 맨 위에 있습니다. 드롭 영역, 프레임 미리보기 스트립, 그리고 열, 행, FPS, 알파 채널 유지 토글의 네 가지 컨트롤이 있습니다. 파일을 넣으면 브라우저가 GIF 디코더를 통해 프레임마다 ImageBitmap을 만들고, 각 프레임을 원본 크기의 오프스크린 canvas에 그린 뒤 계산된 셀 위치에 맞춰 atlas canvas로 블릿합니다. 원본 파일은 File API로 읽어 메모리에 보관합니다. GIF를 전송하는 네트워크 요청은 발생하지 않습니다.

출력은 항상 PNG입니다. PNG는 8비트 알파 채널을 제공하며, 이는 캐릭터 작업에 필요합니다. JPEG였다면 모든 부드러운 가장자리가 매트로 뭉개졌을 것입니다. GIF에 투명도가 없어도 atlas는 여전히 RGBA이며 사용되지 않는 알파 바이트는 파일 크기만 차지합니다. GIF가 투명도를 사용한다면, 디코더는 부분 업데이트가 아니라 전체 프레임과 disposal을 요청해야 합니다. 그렇지 않으면 움직이는 요소가 시트 전체에 번집니다.

시트는 파일 브라우저에서 보이는 모습이 아니라 엔진이 샘플링하는 방식에 맞춰 만드세요. 64x64 프레임의 4x4 그리드는 256x256 텍스처이며, 프레임 n은 열 n mod 4, 행 floor(n / 4)에 위치합니다. 대상 엔진이나 셰이더 atlas가 2의 거듭제곱을 요구한다면 시트 크기를 2의 거듭제곱으로 유지하세요. 320x320 시트는 일부 경로에서 패딩되거나 리샘플링되어 스프라이트 가장자리가 흐려집니다.

1

01

GIF를 변환기에 넣으세요. 설정을 바꾸기 전에 프레임 수와 원본 크기가 표시됩니다.

2

02

원하는 그리드에 맞게 열과 행을 설정하세요. 24프레임 애니메이션이라면 6x4가 일반적인 선택이며, 한 행만 사용하는 방식도 작동하며 VRChat에 필요한 형태입니다.

3

03

FPS를 게임에서 사용할 재생 속도로 설정하세요. 이는 시트에 기록되는 명목상의 프레임 타이밍을 결정합니다. 출력은 정지 PNG이므로 실제 속도는 엔진이 구동합니다.

4

04

알파를 지원하지 않는 포맷을 대상으로 하는 경우가 아니라면 알파를 켜 두세요. 미리보기에서 GIF에 검은 배경이 보인다면 원본에 투명 인덱스가 없고 검은색이 실제 색상입니다.

5

05

PNG를 다운로드하고 크기를 목표에 맞춰 확인하세요. 너비는 열 곱하기 프레임 너비, 높이는 행 곱하기 프레임 높이입니다.

A 6-frame knight walk cycle strip, transparent background
실제 출력: 한 행에 6프레임, 투명.

VRChat용 GIF to 스프라이트 시트

VRChat의 flipbook 셰이더는 텍스처를 그리드가 아니라 하나의 가로 스트립으로 읽습니다. 6x4 시트를 넘기면 첫 번째 행이 반복된 스트립이 나옵니다. UV 계산이 모든 프레임이 같은 행에 있다고 가정하고 프레임 인덱스가 U 축으로만 증가하기 때문입니다. 열을 프레임 수로, 행을 1로 설정하세요. 24프레임 애니메이션은 24x1 시트가 됩니다.

스트립의 전체 너비를 2의 거듭제곱으로 만드세요. 64픽셀 프레임 24개짜리 스트립은 너비가 1536픽셀이며 이는 2의 거듭제곱이 아닙니다. 64픽셀로 깔끔하게 나뉘는 다음 크기는 2048이며 32프레임을 담을 수 있습니다. 사용하지 않는 셀은 투명 픽셀이나 마지막 프레임의 복제본으로 채울 수 있습니다. 2의 거듭제곱이 중요한 이유는 업로드 경로에서 밉맵 생성이나 압축을 거치는 비 PoT 텍스처가 샘플링을 반 텍셀만큼 이동시킬 수 있고, 너비가 1픽셀인 스프라이트는 그 차이를 드러내기 때문입니다.

알파는 셰이더가 아니라 여기 시트에서 처리하세요. 셰이더의 컷아웃 또는 알파 테스트 경로는 거친 도구입니다. GIF의 안티앨리어싱된 외곽선에서 나온 부드러운 가장자리는 임계값에 따라 살아남거나 사라지며, 그 임계값을 아바타마다 조정하는 것은 바람직하지 않습니다. 실제 알파와 프리멀티플라이드에 안전한 가장자리로 PNG를 내보내면 셰이더는 그저 샘플링만 합니다. 루프 속도를 일정하게 유지하세요. VRChat의 flipbook은 고정 시간 단계로 진행되므로, 원본 GIF의 프레임별 지연이 불규칙했다면 내보내기 전에 균일하게 맞추지 않으면 애니메이션이 원본 타이밍과 맞지 않는 일정한 속도로 실행됩니다.

전체 파라미터 목록과 텍스처 설정은 flipbook texture guide를 참고하세요.

GIF를 프레임 그리드("스프레드시트")로

gif to spreadsheet를 검색하는 사람들은 거의 .xlsx를 의미하지 않습니다. 그들은 프레임 그리드를 의미합니다. 각 프레임이 인덱스로 지정될 수 있도록 행과 열로 배치된 프레임 말입니다. 이 단어가 쓰이는 이유는 그리드가 언뜻 보기에 스프레드시트처럼 보이기 때문입니다. 이 도구는 그 그리드를 만들며, 그리드는 스프라이트 시트와 같은 것입니다. 차이는 무엇이라 부르느냐뿐입니다. 중요한 것은 레이아웃이 규칙적이라는 점입니다. 고정된 셀 크기, 고정된 열, 왼쪽에서 오른쪽, 위에서 아래로 진행하는 프레임 순서입니다.

사람들이 때때로 시도하는 대안은 픽셀 아트 편집기에서 프레임을 하나씩 그리며 애니메이션이 맞을 때까지 onion skin을 겹쳐 쌓는 것입니다. 그 작업 흐름은 직접 제작하는 캐릭터에는 좋지만 이미 가진 GIF에는 최악입니다. 픽셀 편집기는 GIF의 프레임별 지연을 읽지 못하며, 24프레임을 손으로 24개 레이어에 가져오면 타이밍이 완전히 사라집니다. 원본이 이미 애니메이션이라면 그리드를 변환하는 쪽이 더 짧은 경로입니다. 픽셀 아트 도구는 트랜스코딩이 아니라 직접 제작할 때 쓸 만합니다.

손으로 그리는 프레임 작업은 pixel art 페이지에서 그리기와 팔레트 부분을 다룹니다.

프레임 크기, 그리드, 투명 배경

대부분의 변환을 망가뜨리는 네 가지가 있습니다. 각각 구체적인 증상이 있습니다.

GIF 투명도가 팔레트에서 죽습니다. GIF는 최대 256색을 사용할 수 있으며 투명도를 팔레트 인덱스로 표시합니다. 프레임이 disposal method 2로 디코딩되면 한 프레임에서 투명했던 영역이 이전 프레임의 배경색으로 복원될 수 있습니다. 해결책은 모든 프레임을 흰색이 아니라 투명 버퍼에 대해 합성하는 것입니다. 미리보기에서 스프라이트 주위에 검정이나 회색 형태가 보인다면 그것은 팔레트의 배경 인덱스이며, 이제 실제 픽셀입니다.

마지막 행이 부분적입니다. 프레임 수가 23이고 6열을 선택하면 온전한 행 세 개와 5개 셀짜리 마지막 행이 나옵니다, 6개가 아닙니다. atlas 높이는 여전히 전체 행 높이로 올림됩니다. 엔진의 flipbook 계산이 온전한 그리드를 가정하고 전체 프레임을 열로 나누어 프레임 인덱스를 도출한다면 루프 끝에서 빈 셀을 읽습니다. 시트를 투명 셀로 채워 온전한 사각형으로 만들거나, 개수가 균등하게 나뉘도록 열을 줄이세요.

프레임 크기는 시트를 나누어야 합니다. 너비 320 시트에서 너비 64의 하위 사각형을 추출하면 정확히 5열이 나옵니다. 너비 330 시트에서는 5열과 프레임이 아닌 10픽셀 나머지가 나옵니다. 시트 크기를 프레임 크기 곱하기 열로 유지하고, 두 축 모두 그렇게 하세요.

원점의 오프바이원. 텍스처 UV 좌표는 보통 왼쪽 아래에서 시작하는 반면 프레임 그리드는 왼쪽 위에서 배치됩니다. 프레임 0이 마지막 프레임으로 렌더링된다면 엔진이 V를 반전하고 있는 것입니다. 열 c, 행 r의 스프라이트 셀은 이미지 공간에서 x = c * width, y = r * height에 있으며, 이를 뒤집힌 UV로 변환하는 것은 1에서 빼는 한 번의 연산입니다.

  • 그리드 컨트롤열, 행, FPS는 명시적 입력입니다. atlas 크기는 프레임 크기 곱하기 그리드로 계산되며 절대 추측되지 않습니다.
  • 알파 유지내보내기는 RGBA PNG입니다. 부분적인 마지막 행의 패딩 셀을 포함해 투명 영역은 투명하게 유지됩니다.
  • 로컬 디코딩GIF는 브라우저에서 디코딩됩니다. 업로드 단계도, 서버 측 대기열도, 왕복을 기다릴 필요도 없습니다.

시트가 다음으로 가는 곳

내보내기는 모든 경우에 같은 PNG입니다. 엔진마다 텍스처를 어떻게 잘라야 하는지, 알파를 어떻게 처리하는지가 다릅니다. 다음을 간단한 참고로 사용하세요.

각 대상에 대해, 커스텀 셰이더 없이 읽을 수 있는 그리드로 시트를 하나씩 내보내세요. 두 대상을 지원한다면 시트를 두 개 내보내세요. VRChat용 가로 스트립과 엔진용 그리드입니다. 같은 GIF에서 다시 내보내는 것이 둘을 맞추기 위해 UV 계산을 작성하는 것보다 시간이 덜 걸립니다.

대상내보내기
Unity그리드 시트, 2의 거듭제곱 텍스처, Sprite Mode를 Multiple로 설정하고 셀 크기로 그리드 슬라이싱; 픽셀 아트에는 필터 모드 Point, 부드러운 이미지에는 Bilinear. 임포터에서 Alpha Is Transparency를 활성화하세요.
Godot그리드 또는 스트립, AtlasTexture로 로드하거나 AnimatedSprite2D의 SpriteFrames 리소스로 슬라이싱. 픽셀 작업에는 필터를 Nearest로 설정하세요. 프레임 타이밍은 PNG가 아니라 SpriteFrames 시트에서 옵니다.
GameMaker그리드 시트, 프레임 크기를 셀 크기로 설정하여 스프라이트로 가져옵니다. 프레임 수는 시트와 정확히 일치해야 합니다. GameMaker는 부분적인 마지막 행을 대신 잘라주지 않습니다.
VRChat단일 가로 스트립, 2의 거듭제곱 전체 너비, 열은 프레임 수와 동일, 행은 1. 알파는 PNG에 처리, 균일한 루프 속도.

3D에서 시트가 애니메이션되는 모습 보기

대부분의 변환기는 PNG에서 멈추고 결과 확인은 다른 곳에서 하도록 남겨둡니다. 3D 게임 빌더는 계속 나아갑니다. 시트를 빌보드 평면에 로드해 실제 장면에서 애니메이션되는 모습을 볼 수 있으며, 이것이 그리드와 타이밍이 맞는지 답해주는 유일한 테스트입니다. Agent Sprite Forge는 스프라이트가 컨트롤러를 가진 캐릭터가 되는 곳입니다. 스프라이트가 캐릭터이고, 3D 세계는 그것이 사는 곳입니다.

The Cyclops' Island는 그 아이디어의 플레이 가능한 데모입니다. 브라우저에서 제작된, 돌아다닐 수 있는 작은 3D 장면이며 스프라이트를 캐릭터로 사용합니다. 자신의 시트를 넣으면 데모 프레임을 구동하는 동일한 리그가 여러분의 atlas를 샘플링합니다. 프레임 순서가 틀렸다면 즉시 보입니다. 캐릭터가 뒤로 걷거나 루프 끝에서 빈 셀로 튀는 것입니다. 알파가 틀렸다면 몸 주위에 딱딱한 사각형이 보입니다. 이는 엔진에서 마주칠 것과 같은 실패이며 약 5초 만에 눈에 보입니다.

플레이 가능한 Cyclops' Island 장면을 열고 자신의 atlas로 바꿔 보세요.

더 많은 무료 스프라이트 도구

변환기는 한 조각입니다. 다음 세 가지는 Neta Studio에서 스프라이트 작업 흐름의 나머지를 담당하며, 동일한 브라우저 세션에서 동일한 로컬 파일 처리로 실행됩니다.

  • 스프라이트 시트 메이커개별 프레임 이미지를 하나의 atlas로 합칩니다. 원본 프레임이 하나의 GIF가 아니라 별도의 PNG이고 여전히 규칙적인 그리드가 필요할 때 유용합니다.
  • 스프라이트 애니메이터엔진을 열지 않고 타임라인에서 시트를 재생하고, 프레임 속도를 조정하고, 루프 속도를 확인합니다. 내보내기 전에 프레임 순서 오프바이원을 잡아냅니다.
  • 스프라이트 리소스 라이브러리그리드 설정, 엔진 임포트 설정, 포맷을 넘나들며 반복되는 투명도 함정에 관한 참고 시트와 노트.
The Cyclops' Island — 스프라이트 시트가 돌아다닐 수 있는 게임이 되는 곳.

그것이 속한 세계로 걸어 들어가기

스프라이트는 설 곳이 없는 캐릭터입니다. 마지막 단계는 다른 곳에서 제공하지 않는 것입니다. 방금 만든 시트를 가져다 누군가 돌아다닐 수 있는 세계, 작은 섬, 행성, 비 오는 거리 모퉁이에 넣는 것입니다. 이 사이트의 모든 세계는 하나의 서술문에서 만들어졌으며 플레이할 수 있는 페이지로 게시되었습니다.

FAQ

ezgif 대안이 있나요? +

네, 특히 GIF to 스프라이트 시트가 필요하다면 그렇습니다. ezgif는 다양한 포맷 변환을 처리하고, 이 도구는 한 가지 일만 합니다. GIF를 디코딩하고, 프레임을 그리드나 스트립으로 배치하고, 선택한 알파로 PNG atlas를 내보내는 것입니다. 아무것도 업로드되지 않으므로 서버 대기열이 없습니다.

투명도가 유지되나요? +

네, 원본 GIF가 실제로 투명 팔레트 인덱스를 사용한다면 그렇습니다. 내보내기는 RGBA PNG입니다. 흔한 실패는 원본에 있습니다. 많은 GIF가 투명도 대신 단색 배경을 가지며, 그 배경은 시트에 실제 픽셀로 나타납니다.

왜 스프라이트 시트에 검은 배경이 있나요? +

GIF 팔레트의 배경 인덱스가 검은색이거나, 프레임이 잘못된 버퍼에 대해 합성된 것입니다. GIF 프레임은 부분 업데이트일 수 있으므로 disposal method를 따르지 않고 디코딩하면 이전 프레임의 픽셀이 남습니다. 그리드를 배치하기 전에 각 프레임을 투명 canvas에 대해 다시 합성하세요.

열과 행은 어떻게 고르나요? +

가능하면 프레임 수를 나누는 열 개수를 고르세요. 그러면 부분적인 마지막 행이 생기지 않습니다. 24프레임 애니메이션이라면 6x4가 적합합니다. VRChat이라면 열을 프레임 수로, 행을 1로 설정하세요.

시트에 프레임 속도를 설정할 수 있나요? +

PNG는 정지 이미지이며 타이밍을 담지 않습니다. 도구의 FPS 설정은 의도한 속도를 기록할 뿐이며, 실제 재생은 엔진이나 셰이더가 구동합니다. VRChat의 flipbook은 고정 단계로 진행되므로 내보내기 속도를 그에 맞추세요.

내보낸 후 애니메이션이 왜 끊기나요? +

원본 GIF에 100분의 1초 단위의 불규칙한 프레임별 지연이 있었고 엔진은 일정한 속도로 진행하고 있을 가능성이 큽니다. 지연을 균일하게 맞추거나, 균일한 속도를 받아들이고 엔진 속도를 평균값으로 설정하세요.

3D 게임 빌더로 돌아가기

완성된 31개의 3D 세계, 게임, 장면이 한 페이지에 모여 있으며 모두 플레이할 수 있습니다.

플랫폼: Neta Studio페이지: GIF to Sprite Sheet Converter다음 글: /explore/tool/sprite-sheet-to-gif · /explore/tool/sprite-animator · /explore/tool/sprite-sheet-maker

바로 쓸 수 있는 스프라이트 시트 둘러보기

이 라이브러리의 모든 에셋은 기록된 프롬프트가 있는 투명한 게임용 PNG입니다 — Sprite sheet resources and Free sprite sheets, tagged by action, style and subject. 자유롭게 둘러보고 다운로드하세요.

×