Textura de flipbook · la guía completa

Textura de flipbook: cómo animar sprites en Unity, Godot y VRChat

Crea tu propia textura de flipbook

Una textura de flipbook reproduce una hoja de sprites fotograma a fotograma sobre una sola superficie. Aprende a crear una en Unity, Godot y VRChat, y reproduce una hoja de sprites real en vivo en 3D.

✦Sprite
Crea una textura de flipbook a partir de un bucle de portal mágico

Una textura de flipbook es una hoja de sprites que un shader reproduce fotograma a fotograma sobre una sola superficie. No hay rig ni línea de tiempo: la hoja contiene todos los fotogramas en una cuadrícula fija, y el material mueve una pequeña ventana a través de esa cuadrícula a una velocidad constante. Una hoja de 8 x 8 contiene 64 fotogramas; a 12 fotogramas por segundo entra en bucle en unos 5,3 segundos. La malla nunca cambia, no se vuelve a subir ninguna textura y toda la animación cuesta una sola consulta de textura.

Esta página cubre los cuatro números que necesita un shader de flipbook y cómo el índice de fotograma se asigna a las coordenadas UV, las dos formas de controlar una textura de flipbook en Unity, cómo se configura un flipbook de Poiyomi en un avatar de VRChat, el equivalente en Godot y Phaser, y cómo crear tu propia hoja a partir de un GIF o de una descripción escrita.

Respuesta rápida

Una textura de flipbook es una hoja de sprites usada como animación de shader, indexada por fila y columna a lo largo del tiempo. La hoja ocupa una ranura de textura; cada evaluación del shader calcula un índice de fotograma a partir del tiempo transcurrido y una velocidad de fotogramas, reduce ese índice a una columna y una fila, y reasigna las UV de la superficie a esa única celda. Frame = floor(time * fps) mod frameCount, column = frame mod columns, row = floor(frame / columns). Una hoja de 6 x 6 a 10 FPS recorre 36 fotogramas en 3,6 segundos, totalmente en la GPU, sin subida por fotograma y sin cambios en la llamada de dibujo.

Cómo funciona una textura de flipbook

Cuatro números definen la animación. Las columnas y las filas describen la disposición de la hoja. La cantidad de fotogramas normalmente es columnas por filas, y es el valor en el que el índice se reinicia. La velocidad de fotogramas es la rapidez con la que avanza el índice. Todo lo demás —filtrado, modo de ajuste, márgenes UV— existe para evitar que el muestreador lea fuera de la celda actual.

La matemática del índice es breve y vale la pena escribirla. Dado el tiempo transcurrido t: frame = floor(t * fps) mod frameCount, column = frame mod columns, row = floor(frame / columns). La ventana UV es entonces tiling = (1 / columns, 1 / rows) y offset = (column / columns, row / rows). La dirección vertical es la parte que confunde a la gente. La mayoría de las herramientas de creación de hojas escriben la fila 0 en la parte superior de la imagen, mientras que los orígenes UV de Unity y Godot están en la parte inferior izquierda. En una hoja con la primera fila arriba en Unity, offset.y pasa a ser 1 - (row + 1) / rows; de lo contrario, las filas se reproducen invertidas y el primer fotograma de la animación es la última fila de la hoja.

El filtrado decide si el resultado es limpio. Configura el modo de ajuste de la hoja en Clamp. Con Repeat, una muestra en el borde derecho de la textura lee el borde izquierdo, así que una columna de píxeles del fotograma 0 aparece dentro del último fotograma de cada fila. Desactiva los mipmaps para pixel art de bordes duros, porque la cadena de mip promedia celdas vecinas y la animación se vuelve papilla cuando la superficie está a unos metros de distancia. Si el motor o el shader de destino fuerza los mipmaps, deja un margen transparente de uno o dos píxeles alrededor de cada celda, o ajusta la ventana UV medio texel hacia adentro en los cuatro lados.

ValorQué controla
ColumnasFotogramas uno al lado del otro. Define el tiling horizontal de una celda: 1 / columns.
FilasFilas de la hoja. Define el tiling vertical: 1 / rows. Usa 1 para una tira.
Cantidad de fotogramasTotal de fotogramas indexados, normalmente columns x rows. El índice se reinicia aquí.
FPSQué tan rápido avanza el índice. floor(time * fps) da el fotograma actual.
Modo de ajusteClamp. Repeat permite que el muestreador lea más allá del borde de la hoja.
Modo de filtroPoint, con mipmaps desactivados, o ajusta las UV medio texel hacia adentro por celda.

Textura de flipbook en Unity

Hay dos rutas, y fallan de maneras distintas. La ruta uno es un shader que controla el índice de fila y columna y se anima solo. La ruta dos es la ventana Animation con keyframes sobre el tiling y el offset del material mientras un shader Lit o Unlit simple hace el muestreo. La ruta uno es mejor para efectos que deben mantenerse sincronizados con el tiempo del juego; la ruta dos es mejor cuando necesitas que la animación sea controlada por un estado de Animator y visible en la línea de tiempo junto con todo lo demás en la escena.

En cualquier caso, configura primero la importación de la hoja de sprites: Modo de ajuste Clamp, Mip Maps desactivados, Modo de filtro Point y sin compresión en pixel art. Esos tres ajustes causan más errores de flipbook que la matemática del shader.

Ruta 1: un shader con índice de fila y columna

En Shader Graph, el nodo Flipbook toma Columns, Rows y un índice de fotograma controlado por tiempo y genera las UV reasignadas. En un shader escrito a mano, expón _Columns, _Rows y _Fps como propiedades y calcula la celda en la etapa de vértices o de fragmentos. Si la animación tiene que estar sincronizada entre objetos, controla el índice de fotograma desde un float de script en lugar de muestrear _Time.y de forma independiente en cada material, para que dos flipbooks en el mismo objeto no puedan desincronizarse.

Ruta 2: la ventana Animation controlando tiling y offset

Esta ruta anima el vector _ST de la textura. Standard y Unlit integrados usan _MainTex_ST; URP Lit y Unlit usan _BaseMap_ST. El tiling permanece fijo en (1, 1 / rows) y solo cambia offset.y. Los pasos a continuación corresponden a esta ruta.

1

01

Selecciona el material y abre la ventana Animation. Crea un clip y luego agrega la propiedad de vector _ST de la textura como pista; aparece como un Vector4 en el material.

2

02

Configura la velocidad de muestreo del clip con el mismo número que tu FPS objetivo. Si la velocidad de muestreo es menor que los FPS que quieres, los keyframes se colapsan en la misma muestra y la animación se reproduce más lento de lo previsto.

3

03

Haz keyframe de offset.y una vez por fotograma: value = 1 - (row + 1) / rows para una hoja con la primera fila arriba, tiling = (1, 1 / rows).

4

04

Configura la interpolación de cada keyframe en Constant en el editor de curvas. Linear mezcla dos celdas y ves ambos fotogramas a la vez como efecto fantasma.

5

05

Asegúrate de que la última clave no repita el valor del primer fotograma, o la animación se detendrá durante un fotograma en la unión del bucle.

6

06

Si varios renderers comparten el material, anima un MaterialPropertyBlock por renderer en lugar de leer renderer.material, que clona el material la primera vez que lo tocas y deja el clon vivo durante toda la vida del objeto.

Flipbook de Poiyomi para VRChat

La sección Flipbook del shader Poiyomi desplaza una ventana UV a través de una hoja en el propio material, de modo que una ranura de material puede mostrar un sprite animado en una malla de avatar. Expone Rows, Columns y una velocidad de fotogramas, además de un modo en el que tú controlas el índice de fotograma en lugar de dejarlo avanzar según el tiempo del shader.

Usa una tira de una sola fila en lugar de una cuadrícula. Una tira le da al shader un solo eje por el que avanzar, lo que elimina por completo la costura vertical. Con una cuadrícula, la ventana UV tiene que bajar una fila al final de cada fila, y cualquier error de filtrado, nivel de mip o redondeo de medio texel en ese límite muestrea la fila vecina — visible como una banda delgada de un fotograma diferente durante la reproducción. Una tira también hace que el índice de fotograma sea una multiplicación directa: el ancho de fotograma en UV es 1 / frameCount, y el offset es simplemente frame / frameCount. Para una animación de 8 fotogramas de celdas de 256 x 256, la tira es de 2048 x 256 y sigue siendo una potencia de dos.

El alfa importa más en un avatar que en una escena plana. Si el sprite tiene bordes duros, usa Cutout u Opaque. Los flipbooks en cola Transparent no escriben profundidad, y en un avatar se ordenan contra el cuerpo y entre sí de formas que cambian con el ángulo de la cámara. Mantén la superficie animada en un material que ya esté en el avatar cuando puedas: cada ranura de material adicional cuenta en contra del rango de rendimiento de tu avatar. Si el índice de fotograma se controla desde un estado de Animator con un parámetro sincronizado, todos los clientes ven el mismo fotograma; un índice de fotograma calculado a partir del tiempo del shader se evalúa localmente y puede quedar en un punto distinto del bucle para distintos espectadores.

1

01

Exporta los fotogramas como una sola tira horizontal. La altura de la tira es igual a la altura de la celda; el ancho de la tira es igual a la cantidad de fotogramas por el ancho de la celda. No dejes una celda vacía al final.

2

02

Importa la textura con Modo de ajuste Clamp, Mip Maps desactivados y sRGB activado. Activa Alpha Is Transparency solo si la tira realmente lleva alfa.

3

03

Crea un material Poiyomi, asígnalo a la malla animada y abre la sección Flipbook.

4

04

Configura Rows en 1 y Columns en la cantidad de fotogramas. Configura la velocidad de fotogramas para que coincida con la duración que quieres: 8 fotogramas a 8 FPS es un bucle de un segundo.

5

05

Elige la fuente del fotograma. El modo Manual expone un índice de fotograma que controlas desde un estado de Animator; el modo controlado por tiempo se repite por sí solo.

6

06

En Rendering, configura Cutout u Opaque para sprites de bordes duros. Deja Transparent solo para efectos de bordes suaves, y espera rarezas de ordenación de profundidad.

7

07

Verifica el bucle: el último fotograma no debe ser un duplicado del primero, o el sprite se congela durante un fotograma en cada ciclo.

8

08

Prueba en un avatar subido con un espejo, de cerca y desde el otro lado de la instancia. La distancia es donde aparecen los problemas de mip y filtrado.

Flipbook en Godot y Phaser

En Godot 4, la ruta 2D es AnimatedSprite2D con un recurso SpriteFrames. Importa la hoja, abre SpriteFrames, configura Hframes y Vframes con la cantidad de columnas y filas, agrega los fotogramas de la animación, luego configura la velocidad de la animación en fotogramas por segundo y deja Loop activado. SpriteFrames almacena la animación como una lista de índices de fotogramas, así que tanto una hoja en cuadrícula como una sola tira funcionan sin que tengas que hacer cálculos de UV.

Si solo necesitas una animación, un Sprite2D simple es más liviano: configura Hframes y Vframes una vez, luego avanza la propiedad entera frame desde un AnimationPlayer con interpolación step. No hagas tween de frame con una curva de easing predeterminada: el valor es un índice entero e interpolarlo o se reduce a un solo valor o parpadea entre dos celdas.

Para un flipbook sobre una superficie 3D en Godot, un ShaderMaterial con la misma matemática de fila y columna que la versión de Unity es el camino más corto: uv = UV * vec2(1.0 / cols, 1.0 / rows) + vec2(col / cols, row / rows), con la fila calculada a partir del índice de fotograma. El origen UV de Godot está abajo a la izquierda, igual que en Unity, así que una hoja con la primera fila arriba necesita el mismo volteo vertical.

En Phaser 3, la hoja se carga una vez y se corta en el momento de la carga. frameWidth y frameHeight definen la celda, los fotogramas se numeran de izquierda a derecha y de arriba a abajo, y la animación se identifica por números de fotograma en lugar de coordenadas: no hay shader que escribir ni aritmética de filas y columnas que equivocar.

MotorObjetoQué configuras
Godot 4AnimatedSprite2D + SpriteFramesHframes y Vframes según la disposición de la hoja, luego la velocidad de la animación en FPS con Loop activado.
Godot 4Sprite2DHframes y Vframes una vez, luego la propiedad entera frame avanzada por un AnimationPlayer con interpolación step.
Godot 4ShaderMaterial en una malla 3DColumnas, filas y un índice de fotograma en el shader, con la misma reasignación de UV y el mismo volteo vertical que en Unity.
Phaser 3this.load.spritesheetframeWidth y frameHeight; Phaser corta la hoja de izquierda a derecha y de arriba a abajo.
Phaser 3this.anims.createFotogramas desde anims.generateFrameNumbers, más frameRate y repeat: -1 para repetir en bucle.

Reproduce una hoja de sprites en vivo en 3D

La escena jugable de esta sección es The Cyclops' Island, que se ejecuta en el constructor de juegos 3D de Neta Studio. El flipbook en pantalla es la misma operación de índice a UV descrita arriba, evaluada en un shader de Three.js en la GPU; la diferencia es que se ejecuta sobre una malla real en una escena real, con una cámara que controlas y luces que se mueven.

Eso importa más de lo que parece. Un flipbook en una escena plana de Unity normalmente se ve de frente, donde el sangrado de costuras y la mezcla de mip son difíciles de ver. Mueve la cámara alrededor de una superficie animada en un ángulo rasante y los problemas aparecen de inmediato: una banda de la celda vecina en el borde del fotograma, el último nivel de mip promediando dos fotogramas hasta volverlos un borrón, o un borde alfa que se ve bien desde el frente y desaparece desde el costado. La versión para navegador hace que el ciclo entre crear una hoja y verla sobre una superficie sea lo bastante corto para iterar sin un paso de compilación.

Mini World es la escena más pequeña para probar una sola hoja: menos mallas y una carga más corta. Agent Sprite Forge genera los fotogramas si aún no tienes una hoja, y ambas escenas usan la misma ruta de flipbook, así que una hoja que se ve bien en Mini World se comporta igual en The Cyclops' Island.

Lanzamiento de mago — una tira de 4 fotogramas (577×686 por fotograma), exactamente la entrada que quiere un shader de flipbook.

Crea tu propia hoja

Hay tres rutas hacia una hoja utilizable: convertir un GIF existente, recortar una cuadrícula a una sola tira o generar fotogramas a partir de una descripción escrita. Las tres terminan en el mismo archivo: un PNG con todas las celdas del mismo tamaño, dispuestas de izquierda a derecha y de arriba a abajo, con el ancho de la hoja como múltiplo exacto del ancho de la celda.

Convertir un GIF es la ruta con más trabajo oculto, porque un GIF no es una secuencia de fotogramas completos. Los fotogramas con frecuencia son diferencias parciales contra el fotograma anterior, y los retardos se almacenan por fotograma en centésimas de segundo. Un shader de flipbook acepta una sola velocidad de fotogramas, así que la temporización variable tiene que aplanarse en fotogramas duplicados antes de exportar.

Recortar una cuadrícula a una tira es mecánico: conserva la fila que necesitas, recorta la altura a una celda y deja el ancho como la cantidad de fotogramas por el ancho de la celda. Es la opción correcta cuando una hoja en cuadrícula se usa como una sola animación, porque elimina el eje vertical y la costura que trae consigo. Generar a partir de una descripción es la tercera ruta: Agent Sprite Forge toma una acción y una cantidad de fotogramas y devuelve una hoja con un tamaño de celda fijo, lo que elimina el trabajo de alinear a mano los fotogramas exportados uno por uno.

1

01

Aplana cada fotograma del GIF antes de exportar. Decodifica cada fotograma sobre un lienzo que arrastre el fotograma anterior, o exportarás los rectángulos de diferencias en lugar de la imagen.

2

02

Normaliza la temporización. Elige el retardo de GIF más corto o la mediana, luego duplica fotogramas donde la fuente se mantenía más tiempo, para que la hoja se reproduzca a un FPS constante.

3

03

Coloca los fotogramas de izquierda a derecha y de arriba a abajo, con cada celda del mismo tamaño. Haz que las dimensiones de la hoja sean un múltiplo exacto del tamaño de la celda: una hoja que mide 9,5 celdas de ancho muestreará los texels equivocados para siempre.

4

04

Para recortar a una tira, recorta la altura a una celda y mantén el ancho en la cantidad de fotogramas por el ancho de la celda. Elimina la celda vacía del final si la cuadrícula de origen tenía una.

5

05

Agrega un margen transparente de uno o dos píxeles alrededor de cada celda si el motor de destino no te permite desactivar los mipmaps. De lo contrario, ajusta la ventana UV medio texel hacia adentro en los cuatro lados.

6

06

Para generar en lugar de convertir, escribe la acción, la cantidad de fotogramas y la dirección en la que mira el personaje, y deja que Agent Sprite Forge devuelva una hoja de celdas fijas en lugar de exportar fotogramas uno por uno y alinearlos a mano.

7

07

Verifica avanzando el índice de fotograma uno por uno en el motor. Si alguna celda muestra una franja de su vecina en el borde, la disposición de la hoja o el margen UV está mal, no el shader.

The Cyclops' Island — una animación de flipbook ejecutándose sobre una superficie en una escena 3D en vivo.

Entra al mundo al que pertenece

Un sprite es un personaje sin un lugar donde pararse. El último paso es el que nadie más ofrece: toma la hoja que acabas de crear y ponla en un mundo por el que alguien pueda caminar: una isla pequeña, un planeta, una esquina lluviosa. Cada mundo de este sitio se creó a partir de una descripción escrita y se publicó como una página que puedes jugar.

Preguntas frecuentes

¿Qué es un flipbook de Poiyomi? +

Es la sección Flipbook del shader Poiyomi, que desplaza una ventana UV a través de una hoja de sprites en un material para que una ranura de material pueda mostrar un sprite animado en una malla de avatar. Configuras Rows, Columns y una velocidad de fotogramas, y dejas que el índice de fotograma avance según el tiempo del shader o lo controlas desde un estado de Animator. Se prefiere una tira de una sola fila porque elimina la costura vertical entre filas.

¿Se puede usar un GIF directamente en un flipbook? +

No. Un GIF almacena retardos por fotograma y, a menudo, solo los píxeles que cambiaron, mientras que un shader de flipbook espera una sola textura y una velocidad de fotogramas constante. Conviértelo primero: aplana cada fotograma sobre el anterior, normaliza la temporización y escribe el resultado en una cuadrícula de celdas fija. El shader nunca ve el GIF.

¿Por qué mi textura de flipbook se filtra entre fotogramas? +

El muestreador está leyendo fuera de la ventana de la celda actual. Configura el modo de ajuste de la textura en Clamp, desactiva los mipmaps para arte de bordes duros y ajusta la ventana UV medio texel hacia adentro en cada lado. La filtración empeora con la distancia, porque ahí es donde la cadena de mip empieza a promediar celdas vecinas entre sí.

¿Qué velocidad de fotogramas debería usar un flipbook? +

De 8 a 12 FPS se percibe como animado a mano y les queda bien a los sprites de personajes; de 24 a 30 les queda bien al fuego, al agua y a otros efectos continuos. El shader tiene exactamente una velocidad, así que si la fuente tenía temporización variable, duplica fotogramas para igualarla en lugar de intentar variar la velocidad a mitad del bucle.

¿Necesito una cuadrícula o basta con una fila? +

Una fila basta para cualquier cosa que se reproduzca como una secuencia, y elimina un eje de error de costura. Las cuadrículas son para hojas que empaquetan varias animaciones en una sola textura, donde el shader o el motor selecciona una fila para reposo, correr o atacar. Si de una hoja en cuadrícula solo sale una animación, recórtala a una tira.

¿Funciona un flipbook con el shader Lit de URP de Unity? +

No de forma predeterminada: URP Lit no tiene índice de fotograma. Usa Shader Graph con el nodo Flipbook, que toma Columns, Rows y un índice controlado por tiempo, o anima el tiling y el offset de _BaseMap_ST del material con interpolación de keyframes constante. Standard y Unlit integrados usan _MainTex_ST bajo las mismas reglas.

Volver al Constructor de juegos 3D

Los 31 mundos, juegos y escenas 3D terminados están en una sola página, y todos son jugables.

Plataforma: Neta StudioPágina: Textura de flipbook: cómo animar sprites en Unity, Godot y VRChatLee a continuación: /explore/tool/gif-to-flipbook · /explore/tool/gif-to-sprite-sheet · /explore/guide/sprite-sheet

Abrir la biblioteca de recursos de sprites

Cada recurso de esta biblioteca es un PNG transparente y listo para juegos con un prompt registrado: recursos de hojas de sprites y hojas de sprites gratuitas, etiquetados por acción, estilo y tema. Gratis para explorar y descargar.

×