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?