2012-06-22 8 views
28

Ich habe einige Parameter von CPU zu GPU übergeben, die für alle Fragmente konstant sind, aber die sich für jeden Rahmen ändern (ich verwende GLSL ES 1.1). Sollte ich Uniformen oder Attribute für solche Werte verwenden? Attribute können von Scheitelpunkt zu Scheitelpunkt variieren, daher bin ich der Ansicht, dass die Verwendung von Attributen für Werte, die über den gesamten Rahmen hinweg konstant sind, ineffizient wäre. Ich habe jedoch gelesen, dass Uniformen für Werte sind, die sich "relativ selten" ändern, was darauf hindeutet, dass das Ändern von Uniformen in jedem Frame ineffizient sein könnte.Uniform versus Attribute in GLSL ES

In Bezug auf Hardware, bin ich am meisten interessiert für die Optimierung für das iPhone 4S.

+0

Können Sie einige Ihrer Messwerte auflisten? – Luca

+1

"OpenGL Shading Language" von Rost und Licea-Kane und "OpenGL ES 2.0" von Munchi, Ginsburg und Shreiner. (Offensichtlich ist Ersteres nicht spezifisch für ES) –

Antwort

32

Ich stimme für Uniformen.

Einer der Gründe ist bereits in Ihrer Frage erklärt: Uniformen sind Konstanten für jeden Vertex/Fragment.

Andere Gründe Uniformen gegen Attribute würde bevorzugen:

  • die Anzahl der verfügbaren Slots (Sie erlaubt sind 16 Attribute, aber viele mehr Uniformen)
  • GLSL-Compiler einheitlichen Wert optimieren Handling
  • Da weniger Daten auf langen Vertex-Arrays streamen, bedeutet weniger Attribut pro Vertex eine bessere Leistung.
  • Uniformen sind in Fragment-Shadern verfügbar, ohne unterschiedliche Attribute zwischen Vertex- und Fragment-Shadern zu definieren.
  • Uniformen können Strukturen und Arrays sein, was zu besser lesbarem Code führt.