2012-03-13 14 views
6

Quanto velocemente glUseProgram()? C'è qualcosa di meglio (più veloce) ?:Comportamento delle uniformi dopo glUseProgram() e velocità

Qui sono i miei pensieri:

  1. Usa 1 programma di shader universale, ma con molte impostazioni di input e attributi (impostazioni per ogni classe Graphics)
  2. utilizzare più di 1 shader per ogni classe di grafica

Quale stato sono uniformi dopo aver modificato il programma shader? Salvano valori (ad esempio, i valori delle matrici)?

Ecco quello che io considero i benefici di 1 # essere:

  • Non fa uso di glUseProgram()

E i vantaggi di 2 #:

  • No le modifiche alla matrice (ad esempio, se la classe Menu e la classe Scene3D hanno matrici di proiezione diverse)

risposta

6

Quale delle due opzioni è meglio dipende in gran parte da cosa fanno quegli shader, da quanto sono diversi e da quanti attributi/uniformi si impostano e quanto spesso vengono cambiati. Non esiste una risposta giusta per tutti i casi.

Detto questo: tenere presente che non solo il costo per i cambiamenti di stato, ma anche un costo di runtime dello shader e viene pagato per vertice e per frammento. Quindi mantenere la complessità dello shader basso è sempre una buona idea e uno shader universale è più complesso di quelli specializzati.

Ridurre al minimo il cambio di stato. Se si hanno oggetti A, C, E usando il Programma X e B, D, F usando il Programma Y allora, a parità di tutti gli altri, si esegue il rendering in ACEBDF, non in ABCDEF.

Riguardo all'ultima domanda: i programmi mantengono il loro stato, e quindi i valori delle uniformi, nel corso della loro vita, a meno che non li ricolleghi. Ma le uniformi sono per stato di programma, il che significa che se si hanno due uniformi con lo stesso nome e tipo in programmi diversi, i valori non verranno trasferiti da un programma all'altro.

+0

"La scelta delle due opzioni dipende in gran parte da ciò che fanno quegli shader" - Task semplice: rendering con texturing, senza effetti (solo alcuni devono avere effetti shader). –

+0

Se alcuni sono molto semplici e alcuni hanno un effetto, allora avrei un semplice shader con solo texturing (assumendo openg gl 2.x o superiore) e uno per classe effect. Ma è davvero difficile giudicare senza saperne di più. Probabilmente non importa molto nel quadro generale. A meno che tu non abbia problemi di prestazioni e sappia che è a causa di cambiamenti di stato, fai semplicemente ciò che è più conveniente. – haffax

+1

Le uniformi possono essere condivise tra i programmi utilizzando l'oggetto Buffer uniforme (si veda ad esempio [Uniformi condivisi] (http://arcsynthesis.org/gltut/Positioning/Tut07%20Shared%20Uniforms.html)) – stativ

Problemi correlati