Was ist der Unterschied zwischen konstanten Scheitelpunktattributen und Uniformen?

7

Gemäß dem OpenGL ES 2.0-Programmierhandbuch :

A constant vertex attribute is the same for all vertices of a primitive, and 
therefore only one value needs to be specified for all the vertices of a 
primitive.

Für Uniformen heißt es im Buch:

...any parameter to a shader that is constant across either all vertices or 
fragments (but that is not known at compile time) should be passed in as 
a uniform.

Ich habe immer Uniformen für Daten verwendet, die für ein Grundelement konstant sind, aber jetzt scheint es, dass Attribute auch auf die gleiche Weise verwendet werden können. Gibt es mehr constant vertex attributeals nur "sie sind die gleichen wie Uniformen" ?

Samaursa
quelle
Ist dir klar, was ein Primitiv ist? Ein Grundelement ist ein einzelnes Dreieck (oder eine Linie oder ein Punkt). Wenn Sie GL auch nur aus der Ferne korrekt / effizient verwenden, rendern Sie mit jedem Draw-Aufruf viele Grundelemente.
Sean Middleditch
Wie definiert dieses Buch den Begriff " konstantes Scheitelpunktattribut "? Wie werden solche Attribute dem Shader bereitgestellt?
Nicol Bolas
@ SeanMiddleditch: Ja, dieser Teil ist mir klar.
Samaursa
@NicolBolas: Das erste Zitat stammt aus dem Buch, gefolgt von "Ein konstanter Vertex-Attributwert wird mit einer der folgenden Funktionen angegeben:", wobei die aufgelisteten Funktionen (ich lasse die Zahlen weg) glVertexAttrib # f () und glVertexAttrib # fv sind ()
Samaursa
Apples Dokumente spiegeln dies mit "OpenGL ES 2.0- und 3.0-Apps können entweder ein konstantes Vertex-Attribut festlegen oder stattdessen einen einheitlichen Shader-Wert verwenden, um den Wert zu speichern." Quelle: developer.apple.com/library/ios/documentation/3DDrawing/…
Slipp D. Thompson

Antworten:

6

Dies ist das erste Mal, dass ich von einem gehört habe constant vertex attribute, aber aus seiner Definition geht hervor, dass es sich um ein Vertex-Attribut handelt . Scheitelpunktattribute werden pro Scheitelpunkt definiert (unabhängig davon, ob sie für jeden Scheitelpunkt gleich sind oder nicht). Das heißt, Sie haben nur im Vertex-Shader Zugriff darauf. Uniformen hingegen werden in einem separaten Raum aufbewahrt und sind sowohl für das Fragment als auch für den Vertex-Shader zugänglich.

Da wir Scheitelpunktattribute mit Uniformen vergleichen:

  1. Es gibt eine begrenzte Anzahl von Attributen, die Sie pro Scheitelpunkt verwenden können (normalerweise klein), und sie werden Dingen wie Position, Normal, Farbe usw. zugeordnet, wobei der Platz für Uniformen viel größer ist.
  2. Es gibt Typeinschränkungen für das, was Sie als Scheitelpunktattribut übergeben können. Sie können eine Textur nicht als Scheitelpunktattribut verwenden.
  3. Wenn Sie versuchen, das Attribut über eine Variation an den Fragment-Shader zu übergeben, erhalten Sie für jedes Fragment einen interpolierten Wert.

Versuchen Sie, sie so zu sehen:

Ein Vertex-Attribut ist genau das, was sein Name impliziert: ein Attribut, das dem Vertex entspricht. Jeder Scheitelpunkt hat dieses Attribut. Wenn dieses Attribut für jeden Scheitelpunkt gleich ist, können Sie es als konstantes Scheitelpunktattribut verwenden. Die Menge der Vertex-Attribute ist die Eingabe für einen Vertex-Shader.

Eine Uniform ist etwas, das getrennt von den Vertex- oder Fragment-Shadern gespeichert wird und von beiden aus zugänglich ist. Sie können Zahlen, Matrizen, Texturen und sogar Strukturen speichern. Sie werden nicht als Eingabe verwendet , sondern als Ressourcenpool, auf den Sie jederzeit und überall zugreifen können. Sie werden auch von der Grafikkarte anders behandelt.

Rootlocus
quelle
1
Da diese Frage nach konstanten Scheitelpunktattributen fragt, werden sie nicht auf etwas anderes als diesen konstanten Wert interpoliert. Ein Grund, warum Sie möglicherweise ein konstantes Scheitelpunktattribut verwenden (wie ich es jetzt tue), ist, wenn Sie einen Shader haben, der mehr Attribute als eine bestimmte Geometrie verwendet, die Sie mit diesem Shader rendern möchten. Es hilft beim Stubben dieses Attributs.
Steven Lu