Quando è meglio caricare matrici di modelli parziali nello shader di vertici?


8

A partire da ora, durante il rendering della mia scena e durante l'iterazione nel grafico della scena, per ciascun nodo la sua matrice del modello viene calcolata dalla matrice del modello del genitore e dalla posa del nodo della scena. Questo è abbastanza semplice e riduce già il numero di moltiplicazioni di matrice a una moltiplicazione per nodo e frame.

Ma tutte queste moltiplicazioni di matrice devono essere fatte sulla CPU e in ogni frame per poter eseguire movimenti (multipli consecutivi) di nodi di scena molto velocemente. La GPU, tuttavia, è probabilmente molto più adatta per eseguire molte moltiplicazioni di matrici, quindi sto pensando di inviare più matrici di modelli parziali allo shader di vertice invece di calcolare tutto sulla CPU.

Inviare ogni singola parte (quindi la posa di ogni nodo) alla GPU probabilmente non ha molto senso, poiché in questo caso tutti i calcoli vengono eseguiti per ogni vertice anziché ogni nodo, il che ridurrebbe effettivamente le prestazioni. Ma forse i nodi di scena con molti bambini o solo bambini non in movimento (rispetto al suo genitore) potrebbero essere un posto per dividere la matrice del modello e spostare le moltiplicazioni sullo shader.

Quindi, quando è meglio inviare matrici modello parziali allo shader e spostare la moltiplicazione nella GPU? O è semplicemente una cattiva idea farlo?

Risposte:


9

Fare matematica con le uniformi è uno shader che di solito non ti dà alcuna prestazione rispetto a farlo sulla CPU. Una CPU non è più lenta di una GPU nel fare matematica a matrice, ma non è strutturata in modo da fare grandi quantità di matematica in parallelo. Ma devi effettivamente fare una grande quantità di matematica per ottenere una vittoria. L'invio di dati extra alla GPU solo per far sì che la GPU moltiplichi due matrici insieme raramente ti renderà netta.

Ora, supponiamo di avere un buffer di matrici skinning. Si potrebbe iniziare a importare se tutti si trasformano nello spazio mondo sulla CPU o semplicemente passare un extra di matrice modello-a-mondo-spazio per la GPU. Ma anche allora dipende dal rapporto tra vertici e ossa.


Dipendo dalla quantità di calcoli, GPU è molto veloce nelle operazioni matematiche, quindi è una questione di tentativi e analisi comparativa.
Michele IV,

5

Raramente, se mai. Hai risposto a metà nella tua domanda: uno shader di vertice viene eseguito una volta per vertice, uno shader di frammenti una volta per frammento. Se non stai facendo qualcosa di unico per quel vertice o frammento, allora stai facendo esattamente la stessa cosa ogni volta che invochi uno shader. Non mi sembra più efficiente.

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.