Devo ricollegare uniformi o attributi quando cambio programmi shader?


11

Il rendering della scena di solito comporta più di un programma shader che, nel mio caso, usano tutti gli stessi attributi e condividono almeno alcune delle uniformi. Per farli funzionare correttamente, attualmente gioco al sicuro, il che significa che ricollego gli attributi e ottengo le posizioni uniformi appropriate ogni volta che passo da un programma shader all'altro. Quindi sostanzialmente più volte in ogni frame, che probabilmente non è l'approccio migliore.

Quindi, è (in generale) necessario ricollegare attributi e uniformi dopo aver cambiato i programmi shader? E perché?

In tal caso, c'è un modo per farlo una volta all'avvio del programma e non è più necessario toccarli di nuovo (tranne per l'impostazione dei valori uniformi)?

Risposte:


12

Non è necessario ricollegare gli attributi, purché si assicuri che la loro posizione rimanga la stessa in entrambi gli shader. (Di solito si utilizza la layout(location = X)sintassi in GLSL, ma si può fare anche glBindAttribLocationse la prima non è disponibile.)

Le uniformi, tuttavia, fanno parte dello stato dell'Oggetto Shader e quindi dovranno essere impostate almeno una volta per ogni shader. Un modo per ridurre al minimo il costo di questo è utilizzare un oggetto buffer uniforme , che conterrà tutti i valori uniformi e può quindi essere associato a uno shader con una singola chiamata.


Sul tuo collegamento UBO: "Infine, possono essere utilizzati per condividere informazioni tra programmi diversi. Pertanto, la modifica di un singolo buffer può effettivamente consentire l'aggiornamento delle uniformi in più programmi".
Zouch
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.