Como a animação é tratada no OpenGL não imediato?

8

Eu sou um novato no OpenGL moderno. Estou confortável com a metodologia imediata do OpenGL, mas nunca fiz nenhum uso sério de VBOs. Minha pergunta é sobre animação. No modo imediato, para obter animação, você só precisa transmitir diferentes posições de vértice (interpoladas dos quadros-chave) no espaço do objeto.

Como isso é alcançado no OpenGL não imediato? Obviamente, o upload de novos dados VBO para cada quadro certamente vai prejudicar o barramento de gráficos. Não encontrei nenhuma literatura sobre a maneira moderna de fazê-lo. Pensando nisso, cheguei a várias opções:

  • Atributos: animação como um deslocamento 3d. Para cada quadro, um atributo de deslocamento diferente (possível interpolado) é passado para cada vértice, aplicado ao mesmo vértice a cada quadro-chave.
  • Índices: armazenando quadros-chave como vértices absolutos e acessando-os através da indexação, usando um conjunto diferente de vértices para cada quadro-chave. Acho essa abordagem impossível, pois você não pode acessar quadros-chave adjacentes e, portanto, não pode interpolar entre eles. Além disso, parece uma má ideia para animação procedural.
  • Textura: isso pode ser muito elástico, mas parece uma boa solução para mim. Novamente, a animação é pensada como um deslocamento xyz para cada vértice. Cada quadro-chave pode ser armazenado em uma textura 1D onde a dimensão é mapeada para o vertexID.Se não me engano, no OpenGL 4.0 você pode acessar texturas de qualquer shader, para poder ler essa textura no shader de vértice e aplicar cada transformação de vértice. Uma textura 2D pode conter vários quadros. Você ainda executa a interpolação (e se a interpolação funcionar para texturas fora do shader de fragmento, das quais não tenho certeza, você pode interpolar linearmente gratuitamente!) Isso pode ser aplicado a sistemas de animação mais complexos, como a animação óssea, sem muito esforço.

Estou pensando demais nisso? Alguém pode lançar alguma luz?

kaoD
fonte

Respostas:

5

Não encontrei nenhuma literatura sobre a maneira moderna de fazê-lo.

Isso geralmente ocorre porque a "maneira moderna" de ter animação de personagem é usar a pesagem óssea esquelética, não a mistura de vértices.

No entanto, se você insistir em fazer animação baseada em mistura de vértices, poderá fazê-lo. A maneira mais simples é simplesmente enviar os dois quadros-chave que você deseja misturar como os atributos. Você tem dados de posição para todos os vários quadros-chave; basta usar glVertexAttribPointer(ou glVertexPointerse você insistir) para escolher quadros-chave específicos. Como cada quadro-chave deve ter seus dados de posição armazenados na mesma ordem (para posições correspondentes), eles podem usar a mesma lista de índices para renderização.

O sombreador obtém dois atributos de "posição", um para o quadro-chave antes do horário atual e um para o quadro-chave depois. Você também passaria um uniforme que especifica quanto de mistura deve ser feito entre eles. Você calcula a nova posição como uma mistura entre os dois quadros-chave e depois faz as transformações habituais a partir daí.

Nicol Bolas
fonte
Você tem livros ou artigos recomendados para ler para começar a aprender a escrever código para lidar com a pesagem óssea esquelética?
Michael.bartnett
Eu estava procurando o "como mover vértices" e não como fazer a animação real. Bem, não é tão diferente com a ponderação óssea esquelética, afinal, tudo se resume a vértices se movendo, quer seja pré-computado (mistura de vértices) ou on-the-fly. Os atributos são o único caminho a percorrer? A abordagem baseada em textura ainda não é viável e mais rápida do que passar muitos dados para cada vértice a cada quadro? (pelo menos os quadros-chave por osso e o fator de mesclagem) Uma textura ainda pode codificar a rotação óssea, e a pesquisa de textura é muito mais rápida do que repassar atributos.
Kd #
Além disso: "Como cada quadro-chave deve ter seus dados de posição armazenados, [...] eles podem usar a mesma lista de índices para renderizar". Isso não é impossível? Como eu poderia acessar dois índices para interpolar entre eles? O sombreador de vértices não é alheio um ao outro e mais ainda a outros índices?
KaoD
@kaoD: Impossível? Não é isso que você faz atualmente para calcular a nova posição de vértice? Para cada posição em cada matriz de quadros-chave, você as combina e as grava no OpenGL. Tudo o que estou dizendo é que você forneça essas matrizes de quadro-chave para o OpenGL e deixe o shader fazer a mistura. Quanto às pesquisas de textura, na hierarquia de "coisas rápidas em shaders", as pesquisas de textura geralmente estão na parte inferior . Os atributos são, mais ou menos gratuitos .
Nicol Bolas
@ NicolBolas: é bom saber que a pesquisa de textura é mais lenta do que eu pensava. O que quero dizer com impossível é que, se não me engano, cada vértice pode apenas "ver" a si mesmo no sombreador e, portanto, não pode indexar outros vértices ou acessar outras matrizes (quadros-chave). O que entendo da sua resposta é que tenho que passar essas duas posições de quadro-chave como atributos para cada vértice, juntamente com um fator de mistura uniforme, mas não teria matriz de vértices, pois não? Embora eu tenha acabado de perceber que você pode usar o quadro-chave atual como a matriz de vértices e o próximo quadro como a matriz de atributos, foi isso que você quis dizer?
kaoD