2010-02-26 14 views

risposta

19

È possibile eseguire questa operazione, ad es. effettuando chiamate di funzione dal punto di accesso principale alle funzioni implementate nei vari oggetti shader.

main() { 
    callToShaderObject1() 
    callToShaderObject2() 
} 

ciascuna di queste funzioni callToShaderObject può vivere in diversi oggetti shading, ma tutti gli oggetti devono essere allegati e collegata nello stesso programma prima di poter essere utilizzato.

+0

Per motivi di curiosità, perché dovresti farlo, invece di avere semplicemente tutte le funzioni nello shader di frammenti in questione? È così che il codice possa essere condiviso con altri programmi shader, senza la necessità di duplicazioni? –

+0

@Nick: non l'ho visto usato da solo. Sono rimasto sorpreso quando ho letto per la prima volta le specifiche sull'idea di creare programmi shader con oggetti shader, quindi perché so che tu puoi farlo. E 'stato costruito dal modello di compilazione standard ... Aggiornamento – Bahbar

+2

: Ho visto questo in uso ora, mentre studiavo shader modellati di MineCraft. In tal caso, è stato molto utile dato che ogni shader ha molte opzioni che possono essere attivate e disattivate, con vari effetti che operano in combinazione con vari altri. In uno scenario simile e in cui sono coinvolti più autori, diventa molto più utile separare le funzioni in file separati. –

4

Non possono essere eseguiti allo stesso tempo, ma si è liberi di utilizzare ombreggiatori diversi per geometrie diverse o di eseguire il rendering in più passaggi utilizzando ombreggiatori diversi.

+1

Quindi sarebbe necessario un programma diverso? Quindi un programma diverso per ogni pass? Come in, potrei avere un vertex e un framment shader su un programma (che è un passaggio?) E poi avere un vertex e framment shader su un altro programma (il secondo passaggio?)? Posso semplicemente cambiare glUseProgram() quando ne ho voglia? Quindi sto essenzialmente rendendo una scena due volte ...? – Harry

+1

Esattamente a destra. Proprio come un rendering multi-pass in una pipeline fissa, ma invece di modificare le impostazioni OpenGL tra passate, stai caricando diversi programmi. –