Gibt es eine Analogie, die mir beim Vergleich dieser verschiedenen Typen einfällt, oder wie diese Dinge funktionieren?
Was bedeutet es auch, eine Matrix zu vereinheitlichen?
Direkt von http://www.lighthouse3d.com/tutorials/glsl-tutorial/data-types-and-variables/ kopiert . Die eigentliche Seite enthält viel detailliertere Informationen und es lohnt sich, sie sich anzusehen.
Variable Qualifikatoren
Qualifizierer geben der Variablen eine besondere Bedeutung. Folgende Qualifikanten stehen zur Verfügung:
- const - Die Deklaration ist eine Kompilierungszeitkonstante.
- Attribut - Globale Variablen, die sich pro Scheitelpunkt ändern können und von der OpenGL-Anwendung an Scheitelpunkt-Shader übergeben werden. Dieses Qualifikationsmerkmal kann nur in Vertex-Shadern verwendet werden. Für den Shader ist dies eine schreibgeschützte Variable. Siehe Abschnitt Attribut.
- uniform - Globale Variablen, die sich pro Grundelement ändern können [...] und von der OpenGL-Anwendung an die Shader übergeben werden. Dieses Qualifikationsmerkmal kann sowohl in Vertex- als auch in Fragment-Shadern verwendet werden. Für die Shader ist dies eine schreibgeschützte Variable. Siehe Abschnitt Uniform.
- Variieren - Wird für interpolierte Daten zwischen einem Vertex-Shader und einem Fragment-Shader verwendet. Verfügbar zum Schreiben im Vertex-Shader und schreibgeschützt in einem Fragment-Shader. Siehe Abschnitt Variieren.
In einer Analogie sind const und uniform wie globale Variablen in C / C ++, eine ist konstant und die andere kann gesetzt werden. Attribut ist eine Variable, die einen Scheitelpunkt wie Farb- oder Texturkoordinaten begleitet. Unterschiedliche Variablen können vom Vertex-Shader geändert werden, nicht jedoch vom Fragment-Shader. Daher leiten sie im Wesentlichen Informationen über die Pipeline weiter.
uniform
sind pro-primitive Parameter (konstant während eines gesamten Draw-Aufrufs);attribute
sind Per-Vertex- Parameter (normalerweise: Positionen, Normalen, Farben, UVs, ...);varying
sind Parameter pro Fragment (oder pro Pixel ): Sie variieren von Pixel zu Pixel.Es ist wichtig zu verstehen, wie Sie
varying
Ihre eigenen Shader programmieren.Angenommen, Sie definieren einen variierenden Parameter
v
für jeden Scheitelpunkt eines Dreiecks im Scheitelpunkt-Shader . Wenn dieser variierende Parameter an den Fragment-Shader gesendet wird , wird sein Wert automatisch basierend auf der Position des zu zeichnenden Pixels interpoliert.Im folgenden Bild erhielt das rote Pixel einen interpolierten Wert des variierenden Parameters
v
. Deshalb nennen wir sie "variierend".Der Einfachheit halber verwendet das oben angegebene Beispiel eine bilineare Interpolation , bei der davon ausgegangen wird , dass alle gezeichneten Pixel den gleichen Abstand von der Kamera haben. Für ein genaues 3D-Rendering verwenden Grafikgeräte eine perspektivisch korrekte Interpolation, die die Tiefe eines Pixels berücksichtigt.
quelle
noperspective
, um eine einfache bilineare Interpolation und keine perspektivisch korrekte Interpolation zu erhalten (gekennzeichnet durch das Standardqualifikationsmerkmal :)smooth
. Siehe dieses Beispiel .In OpenGL ist ein "Programm" eine Sammlung von "Shadern" (kleineren Programmen), die in einer Pipeline miteinander verbunden sind.
Shader verarbeiten Scheitelpunkte (Vertex-Shader), Geometrien (Geometrie-Shader), Tessellation (Tessellation-Shader), Fragmente (Pixel-Shader) und andere Stapelprozessaufgaben (Compute-Shader), die zum Rastern eines 3D-Modells erforderlich sind.
OpenGL (WebGL) -Shader sind in GLSL (einer auf der GPU kompilierten textbasierten Shader-Sprache) geschrieben.
Beachten Sie diese Konzepte:
Shader können Daten an den nächsten Shader in der Pipeline übergeben (
out
,inout
) und sie können auch Daten aus der WebGL-Anwendung oder einem vorherigen Shader (in
) akzeptieren .Die Vertex- und Fragment-Shader (wirklich jeder Shader) können eine
uniform
Variable verwenden, um Daten von der WebGL-Anwendung zu empfangen.Der Vertex Shader kann auch Daten von der WebGL-Anwendung mit der
attribute
Variablen empfangen , die bei Bedarf aktiviert oder deaktiviert werden können.Der Vertex Shader kann mithilfe der
varying
Variablen Daten an den Fragment Shader übergeben . Siehe GLSL-Code oben (varying vec3 variableC;
).quelle
Ich mag die Beschreibung von https://learnopengl.com/Getting-started/Shaders , weil das Wort pro Primitiv nicht intuitiv ist
quelle