2012-06-22 2 views
28

Ho alcuni parametri passati dalla CPU alla GPU che sono costanti per tutti i frammenti ma che cambiano su ogni frame (sto usando GLSL ES 1.1). Dovrei usare uniformi o attributi per tali valori? Gli attributi possono variare da vertice a vertice, quindi la mia intuizione è che l'utilizzo di attributi per valori che sono costanti su tutto il fotogramma sarebbe inefficiente. Tuttavia, ho letto che le uniformi sono per valori che cambiano "relativamente di rado", suggerendo che cambiare le uniformi su ogni fotogramma potrebbe essere inefficiente.Uniform versus attributes in GLSL ES

In termini di hardware, sono più interessato all'ottimizzazione per l'iPhone 4S.

+0

Puoi elencare alcune delle tue letture? – Luca

+1

"OpenGL Shading Language" di Rost e Licea-Kane e "OpenGL ES 2.0" di Munchi, Ginsburg e Shreiner. (Ovviamente il primo non è specifico per ES) –

risposta

32

Io voto per le uniformi.

Uno dei motivi è già spiegato nella domanda: le uniformi sono costanti per ogni vertice/frammento.

Altri motivi per preferire uniformi contro attributi sarebbero:

  • il numero di slot disponibili (si è permesso di 16 attributi, ma molti più uniformi)
  • compilatori GLSL in grado di ottimizzare la gestione del valore uniforme
  • meno streaming di dati su array di vertex lunghi, meno attributi per vertice significa prestazioni migliori.
  • uniformi sono disponibili in shader frammento, senza definire diversi attributi tra vertex e fragment shader
  • uniformi possono essere strutture e matrici, portando a codice più leggibile.