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.