¿Cómo se maneja la animación en OpenGL no inmediato?

8

Soy un novato en OpenGL moderno. Me siento cómodo con la metodología inmediata de OpenGL, pero nunca he hecho un uso serio de los VBO. Mi pregunta es sobre animación. En el modo inmediato, para lograr la animación, solo tiene que transmitir diferentes posiciones de vértice (interpoladas desde fotogramas clave) en el espacio de objetos.

¿Cómo se logra esto en OpenGL no inmediato? Obviamente, cargar datos VBO nuevos para cada cuadro seguramente va a acaparar el bus de gráficos. No he encontrado ninguna literatura sobre la forma moderna de hacerlo. Pensando en ello, llegué a varias opciones:

  • Atributos: animación como desplazamiento 3d. Para cada cuadro, se pasa un atributo de desplazamiento diferente (posible interpolado) para cada vértice, aplicado al mismo vértice en cada fotograma clave.
  • Índices: almacenar fotogramas clave como vértices absolutos y acceder a ellos mediante la indexación, utilizando un conjunto diferente de vértices para cada fotograma clave. Este enfoque me parece imposible, ya que no puede acceder a fotogramas clave adyacentes y, por lo tanto, no puede interpolar entre ellos. Además, parece una mala idea para la animación de procedimientos.
  • Textura: esto puede ser muy elástico pero parece una buena solución para mí. Nuevamente, la animación se piensa como un desplazamiento xyz para cada vértice. Cada fotograma clave se puede almacenar en una textura 1D donde la dimensión se asigna a vertexID. Si no me equivoco, en OpenGL 4.0 puede acceder a las texturas desde cualquier sombreador, por lo que puede leer esta textura desde el sombreador de vértices y aplicar cada transformación de vértice. Una textura 2D podría contener varios cuadros. Todavía realiza la interpolación (y si la interpolación funciona para texturas fuera del sombreador de fragmentos, de lo que no estoy seguro, ¡puede interpolar linealmente gratis!) Esto podría aplicarse a sistemas de animación más complejos como la animación ósea sin mucho esfuerzo.

¿Estoy pensando demasiado en esto? ¿Alguien puede arrojar algo de luz?

kaoD
fuente

Respuestas:

5

No he encontrado ninguna literatura sobre la forma moderna de hacerlo.

En general, eso se debe a que la "forma moderna" de tener animación de personajes es usar pesaje de huesos esqueléticos, no mezcla de vértices.

Sin embargo, si insiste en hacer animación basada en la mezcla de vértices, puede hacerlo. La forma más sencilla es simplemente enviar los dos fotogramas clave que desea combinar como atributos. Tiene datos de posición para todos los diversos fotogramas clave; simplemente use glVertexAttribPointer(o glVertexPointersi insiste) para elegir fotogramas clave específicos. Dado que cada fotograma clave debe tener sus datos de posición almacenados en el mismo orden (para las posiciones correspondientes), pueden usar la misma lista de índice para la representación.

El sombreador obtiene dos atributos de "posición", uno para el fotograma clave delante de la hora actual y otro para el fotograma clave posterior. También pasaría un uniforme que especifica qué cantidad de mezcla hacer entre ellos. Calcula la nueva posición como una combinación entre los dos fotogramas clave y luego realiza las transformaciones habituales desde allí.

Nicol Bolas
fuente
¿Tiene algún libro o artículo recomendado para leer para comenzar a aprender a escribir código para manejar el pesaje óseo esquelético?
michael.bartnett
Estaba buscando "cómo mover vértices", no cómo hacer la animación real. Bueno, no es tan diferente con la ponderación ósea esquelética, después de todo, se trata de vértices que se mueven, ya sea precalculado (mezclado con vértice) o ponderado sobre la marcha. ¿Son los atributos el único camino a seguir? ¿No es aún factible el enfoque basado en la textura, y más rápido que pasar muchos datos para cada vértice en cada cuadro? (al menos los fotogramas clave por hueso y el factor de mezcla) Una textura aún puede codificar la rotación ósea, y la búsqueda de textura es mucho más rápida que pasar atributos.
kaoD
Además: "Dado que cada fotograma clave debe tener sus datos de posición [...] almacenados, pueden usar la misma lista de índice para renderizar". ¿No es eso imposible? ¿Cómo puedo acceder a dos índices para interpolar? ¿No está el sombreador de vértices ajeno al vértice del otro, y aún más a otros índices?
kaoD
@kaoD: ¿Imposible? ¿No es eso lo que haces actualmente para calcular la nueva posición del vértice? Para cada posición en cada conjunto de fotogramas clave, los combina y los escribe en OpenGL. Todo lo que digo es que proporcione esas matrices de fotogramas clave a OpenGL y deje que el sombreador haga la mezcla. En cuanto a las búsquedas de textura, en la jerarquía de "cosas rápidas en sombreadores", las búsquedas de textura generalmente se encuentran en la parte inferior . Los atributos son, más o menos gratis .
Nicol Bolas
@NicolBolas: es bueno saber que la búsqueda de texturas es más lenta de lo que pensaba. Lo que quiero decir con imposible es que, si no me equivoco, cada vértice solo puede "verse" en el sombreador y, por lo tanto, no puede indexar otros vértices ni acceder a ninguna otra matriz (fotogramas clave). Lo que entiendo de su respuesta es que tengo que pasar estas dos posiciones de fotogramas clave como atributos para cada vértice, junto con un factor de mezcla uniforme, pero entonces no tendría una matriz de vértices, ¿verdad? Aunque acabo de darme cuenta de que puedes usar el fotograma clave actual como matriz de vértices y el siguiente fotograma como matriz de atributos, ¿es esto lo que querías decir?
kaoD