Come viene gestita l'animazione in OpenGL non immediato?


8

Sono un principiante del moderno OpenGL. Sono a mio agio con l'immediata metodologia OpenGL, ma non ho mai fatto un uso serio dei VBO. La mia domanda riguarda l'animazione. In modalità immediata, per ottenere l'animazione devi solo trasmettere diverse posizioni di vertici (interpolate da fotogrammi chiave) nello spazio oggetti.

Come si ottiene questo in OpenGL non immediato? Ovviamente, il caricamento di nuovi dati VBO per ogni fotogramma farà sicuramente salire il bus grafico. Non ho trovato alcuna letteratura sul modo moderno di farlo. Pensandoci, sono arrivato a diverse opzioni:

  • Attributi: animazione come offset 3d. Per ciascun fotogramma, viene passato un attributo offset diverso (possibilmente interpolato) per ciascun vertice, applicato allo stesso vertice ogni fotogramma chiave.
  • Indici: memorizzare i fotogrammi chiave come vertici assoluti e accedervi tramite l'indicizzazione, utilizzando un diverso set di vertici per ogni fotogramma chiave. Trovo questo approccio impossibile, dal momento che non è possibile accedere a fotogrammi chiave adiacenti e quindi non è possibile interpolare tra di loro. Inoltre, sembra una cattiva idea per l'animazione procedurale.
  • Texture: potrebbe essere molto elastico, ma suona come una buona soluzione per me. Ancora una volta, l'animazione è pensata come un offset xyz per ciascun vertice. Ogni fotogramma chiave può essere memorizzato in una trama 1D in cui la dimensione viene mappata su verticeID. Se non sbaglio, in OpenGL 4.0 puoi accedere alle trame da qualsiasi shader, in modo da poter leggere questa trama dallo shader di vertice e applicare ogni trasformazione del vertice. Una trama 2D può contenere diversi fotogrammi. Esegui ancora l'interpolazione (e se l'interpolazione funziona per trame esterne allo shader di frammenti, di cui non sono sicuro, puoi interpolare linearmente gratuitamente!) Questo potrebbe essere applicato a sistemi di animazione più complessi come l'animazione ossea senza troppi sforzi.

Sto pensando troppo a questo? Qualcuno può fare luce?

Risposte:


5

Non ho trovato alcuna letteratura sul modo moderno di farlo.

Ciò è generalmente dovuto al fatto che il "modo moderno" di avere un'animazione del personaggio è usare la pesatura ossea scheletrica, non la fusione di vertici.

Tuttavia, se insisti a realizzare animazioni basate sulla fusione dei vertici, puoi farlo. Il modo più semplice è semplicemente inviare i due fotogrammi chiave tra cui si desidera fondere come attributi. Hai dati di posizione per tutti i vari fotogrammi chiave; basta usare glVertexAttribPointer(o glVertexPointerse insisti) per scegliere fotogrammi chiave specifici. Poiché ogni fotogramma chiave dovrebbe avere i dati di posizione memorizzati nello stesso ordine (per posizioni corrispondenti), possono utilizzare lo stesso elenco di indici per il rendering.

Lo shader ottiene due attributi di "posizione", uno per il fotogramma chiave di fronte all'ora corrente e uno per il fotogramma chiave dopo. Passeresti anche un'uniforme che specifica quanto di una fusione fare tra di loro. Calcolate la nuova posizione come una fusione tra i due fotogrammi chiave, e quindi fate le solite trasformazioni da lì.


Hai libri o articoli consigliati da leggere per iniziare a imparare a scrivere il codice per gestire la pesatura ossea scheletrica?
michael.bartnett,

Stavo cercando il "come spostare i vertici" e non come fare l'animazione reale. Bene, non è così diverso con la ponderazione dell'osso scheletrico, dopo tutto, si riduce ai vertici che si muovono, sia che sia pre-calcolato (miscelato al vertice) o ponderato all'osso al volo. Gli attributi sono l'unico modo per andare fermi? L'approccio basato sulla trama non è ancora fattibile e più veloce del passaggio di molti dati per ciascun vertice in ogni frame? (almeno entrambi i fotogrammi chiave per osso e il fattore di fusione) Una trama può ancora codificare la rotazione dell'osso e la ricerca della trama è molto più rapida rispetto al passaggio degli attributi.
Kaao,

Inoltre: "Poiché ogni fotogramma chiave dovrebbe contenere i dati di posizione [...] memorizzati, è possibile utilizzare lo stesso elenco di indici per il rendering." Non è impossibile? Come potrei accedere a due indici tra cui interpolare? Lo shader di vertice non è ignaro degli altri vertici, e ancora di più agli altri indici?
Kaao,

@kaoD: Impossible? Non è quello che fai attualmente per calcolare la nuova posizione del vertice? Per ogni posizione in ciascun array di fotogrammi chiave, li si fondono insieme e li si scrive su OpenGL. Tutto quello che sto dicendo è che fornisci questi array di fotogrammi chiave a OpenGL e lasci che lo shader esegua la fusione. Per quanto riguarda le ricerche di texture, nella gerarchia delle "cose ​​veloci negli shader", le ricerche di texture sono generalmente in fondo . Gli attributi sono più o meno gratuiti .
Nicol Bolas,

@NicolBolas: bello sapere che la ricerca delle trame è più lenta di quanto pensassi. Ciò che intendo con impossibile è che, se non sbaglio, ogni vertice può solo 'vedere' se stesso nello shader, e quindi non può indicizzare altri vertici o accedere ad altri array (fotogrammi chiave.) Cosa capisco dalla tua risposta è che devo passare queste due posizioni dei fotogrammi chiave come attributi per ciascun vertice, insieme a un'uniforme del fattore di fusione, ma poi non avrei un array di vertici, vero? Anche se ho appena capito che puoi usare l'attuale keyframe come array di vertici e il frame successivo come array di attributi, è questo che intendevi?
Kaao,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.