AGSL-Kurzübersicht

AGSL ist weitgehend mit GLSL ES 1.0 kompatibel. Weitere Informationen finden Sie in der Dokumentation zur OpenGL ES-Shading-Language. In dieser Dokumentation werden nach Möglichkeit Unterschiede zwischen AGSL und GLSL hervorgehoben.

Typen

AGSL unterstützt GLSL ES 1.0-Typen sowie eine zusätzliche Möglichkeit zur Darstellung von Vektor- und Matrixtypen. AGSL unterstützt zusätzliche short- und half-Typen zur Darstellung mittlerer Genauigkeit.

Grundlegende Typen

Eingeben Beschreibung
void Keine Funktion gibt einen Rückgabewert oder eine leere Parameterliste zurück. Im Gegensatz zu GLSL müssen Funktionen ohne void-Rückgabetyp einen Wert zurückgeben.
bool, bvec2, bvec3, bvec4
(bool2, bool3, bool4).
Boolescher Skalar/Vektor
int, ivec2, ivec3, ivec4
(int2, int3, int4)
highp Vorzeichenbehaftete Ganzzahl/Vektor
float, vec2, vec3, vec4
(float2, float3, float4)
highp (einfache Genauigkeit) Gleitkomma skalar/Vektor
short, short2, short3, short4 Entspricht einem signed integer/vector von mediump int
half, half2, half3, half4 Entspricht mediump float Skalar/Vektor
mat2, mat3, mat4
(float2x2, float3x3, float4x4)
2 × 2, 3 × 3, 4 × 4 float-Matrix
half2x2, half3x3, half4x4 Entspricht den Matrixtypen von mediump float

Mindestwerte für Genauigkeit und Bereich

Dies sind die Mindestgenauigkeit und der Mindestbereich, die für jeden Modifikator gemäß der OpenGL ES 2.0-Spezifikation garantiert werden. Da die meisten Geräte ES 3.0 unterstützen, ist die highp-Genauigkeit/-Reichweite und die int mediump-Reichweite bei ihnen besser. Genauigkeitsmodifikatoren können auf Skalar-, Vektor- und Matrixvariablen und ‑parameter angewendet werden. Nur die unten aufgeführten Mindestwerte sind garantiert. lowp hat nicht unbedingt eine geringere Genauigkeit als mediump und mediump hat nicht unbedingt eine geringere Genauigkeit als highp. AGSL wandelt lowp derzeit in mediump in der endgültigen Ausgabe um.

Modifizierer Bereich „float“ „float“-Magnitudenbereich Genauigkeit „float“ Bereich „int“
highp \(\left\{-2^{62},2^{62}\right\}\) \(\left\{2^{-62},2^{62}\right\}\) Relativ: \(2^{-16}\) \(\left\{-2^{16},2^{16}\right\}\)
mediump \(\left\{-2^{14},2^{14}\right\}\) \(\left\{2^{-14},2^{14}\right\}\) Relativ: \(2^{-10}\) \(\left\{-2^{10},2^{10}\right\}\)
lowp \(\left\{-2,2\right\}\) \(\left\{2^{-8},2\right\}\) Absolut: \(2^{-8}\) \(\left\{-2^{8},2^{8}\right\}\)

Zusätzlich zur Syntax für numerische Unterindizes von Arrays, z. B. var[num], names of vector components for vectors of length 2 - 4 are denoted by a single letter. Components can be swizzled and replicated. ex:vect.yx,vect.yy`

vect.xyzw – Wird beim Zugriff auf Vektoren verwendet, die Punkte/Normalen darstellen

vect.rgba: Wird beim Zugriff auf Vektoren verwendet, die Farben darstellen

vect.LTRB – Verwenden Sie diesen Wert, wenn der Vektor ein Rechteck darstellt (nicht in GLSL)

In AGSL können 0 und 1 verwendet werden, um in diesem Kanal eine konstante 0 oder 1 zu erzeugen. Beispiel: vect.rgb1 == vec4(vect.rgb,1)

Strukturen und Arrays

Strukturen werden mit derselben Syntax wie in GLSL deklariert, aber AGSL unterstützt nur Strukturen im globalen Gültigkeitsbereich.

struct type-name {
 members
} struct-name; // optional variable declaration.

Es werden nur eindimensionale Arrays mit einer expliziten Arraygröße unterstützt. Dabei kann entweder die C-Syntax oder die GLSL-Syntax verwendet werden:

<base type>[<array size>] variable name – z. B. half[10] x;

<base type> variable name[<array size>] – z. B. half x[10];

Arrays können nicht von einer Funktion zurückgegeben, kopiert, zugewiesen oder verglichen werden. Arrayeinschränkungen werden auf Strukturen mit Arrays angewendet. Arrays können nur mit einer Konstante oder einer Schleifenvariablen indexiert werden.

Qualifikation

Eingeben Beschreibung
const Kompilierzeitkonstante oder schreibgeschützter Funktionsparameter.
uniform Der Wert ändert sich nicht im Verlauf der Verarbeitung des Primitives. RuntimeShader-Methoden für setColorUniform, setFloatUniform, setIntUniform, setInputBuffer und setInputShader werden verwendet, um Uniformen von Android zu übergeben.
in Für übergebene Funktionsparameter. Das ist die Standardeinstellung.
out Für übergebene Funktionsparameter. Es muss dieselbe Genauigkeit wie in der Funktionsdefinition verwendet werden.
inout Für Parameter, die sowohl an eine Funktion übergeben als auch von ihr zurückgegeben werden. Es muss dieselbe Genauigkeit wie in der Funktionsdefinition verwendet werden.

Variablendeklaration

Deklarationen müssen in einem expliziten Bereich mit Klammern stehen. Die Deklaration von y im folgenden Beispiel ist nicht zulässig:

if (condition)
    int y = 0;

Grundlagen zu Matrizen, Strukturen und Arrays

Beispiele für Matrixkonstruktoren

Wenn eine Matrix mit einem einzelnen Wert erstellt wird, wird dieser Wert allen Werten entlang der Diagonale zugewiesen, während die übrigen Nullen erhalten. float2x2(1.0) würde daher eine 2 × 2-Identitätsmatrix erstellen.

Wenn eine Matrix mit mehreren Werten erstellt wird, werden zuerst die Spalten ausgefüllt (Spaltenprioritätsreihenfolge).

Im Gegensatz zu GLSL werden Konstruktoren, die die Anzahl der Komponenten eines übergebenen Vektors reduzieren, nicht unterstützt. Sie können jedoch das Swizzle-Verfahren verwenden, um denselben Effekt zu erzielen. Wenn Sie in AGSL eine vec3 aus einer vec4 mit demselben Verhalten wie in GLSL erstellen möchten, geben Sie vec3 nv = quadVec.xyz an.

Beispiel für einen Strukturkonstruktor

struct light { float intensity; float3 pos; };
// literal integer constants auto-converted to floating point
light lightVar = light(3, float3(1, 2, 3.0));

Matrixkomponenten

Mithilfe der Array-Indexierungssyntax auf Komponenten einer Matrix zugreifen

float4x4 m; // represents a matrix
m[1] = float4(2.0); // sets second column to all 2.0
m[0][0] = 1.0; // sets upper left element to 1.0
m[2][3] = 2.0; // sets 4th element of 3rd column to 2.0

Strukturfelder

Wählen Sie Strukturfelder mit dem Punktoperator . aus. Zu den Operatoren gehören:

Operator Beschreibung
. Feldauswahl
==, != Gleichheit
= Aufgabe

Arrayelemente

Der Zugriff auf Arrayelemente erfolgt über den Array-Skriptoperator [ ]. Beispiel:

diffuseColor += lightIntensity[3] * NdotL;

Netzbetreiber

Sie sind in der Reihenfolge der Priorität nummeriert. Die relationalen und Gleichheitsoperatoren >, <, <=, >=, == und != werden als boolescher Wert ausgewertet. Verwenden Sie Funktionen wie lessThan() oder equal(), um Vektoren komponentenweise zu vergleichen.

Operator Beschreibung Assoziativität
1 () Einschub
2 [] () . ++ -- Array-Index, Funktionsaufruf und Konstruktorstruktur, Feld- oder Methodenauswahl, swizzle, Postfix-Increment und Postfix-Decrement Rechtsläufig
3 ++ -- + - ! Präfix-Increment und Präfix-Decrement unär Linksläufig
4 * / multiplizieren und dividieren Rechtsläufig
5 + - addieren und subtrahieren Rechtsläufig
7 < > <= >= relational Rechtsläufig
8 == != Gleichheit/Ungleichheit Rechtsläufig
12 && Logisches UND Rechtsläufig
13 ^^ Logisches XOR Rechtsläufig
14 || Logisches ODER Rechtsläufig
15 ?\: Auswahl (ein ganzer Operand) Rechtsläufig
16 = += -= *= /= Zuweisung arithmetische Zuweisung arithmetische Zuweisung Rechtsläufig
17 , Sequenz Rechtsläufig

Matrix- und Vektoroperationen

Wenn arithmetische Operatoren auf skalare Werte angewendet werden, ergibt sich ein Skalar. Bei anderen Operatoren als Modulo wird der Vorgang komponentenweise ausgeführt, wenn ein Operand ein Skalar und der andere ein Vektor oder eine Matrix ist. Das Ergebnis hat dann denselben Vektor- oder Matrixtyp. Wenn beide Operationen Vektoren derselben Größe sind, wird die Operation komponentenweise ausgeführt und es wird derselbe Vektortyp zurückgegeben.

Betrieb Beschreibung
m = f * m Komponentenweise Matrixmultiplikation mit einem Skalarwert
v = f * v Komponentenweise Vektormultiplikation mit einem Skalarwert
v = v * v Komponentenweise Vektormultiplikation mit einem Vektorwert
m = m + m Komponentenweise Matrixaddition
m = m - m Komponentenweise Subtraktion von Matrizen
m = m * m Lineare algebraische Multiplikation

Wenn ein Operand ein Vektor ist, der der Zeilen- oder Spaltengröße unserer Matrix entspricht, kann der Multiplikationsoperator zur algebraischen Zeilen- und Spaltenmultiplikation verwendet werden.

Betrieb Beschreibung
m = v * m Lineare algebraische Multiplikation von Zeilenvektor * Matrix
m = m * v Matrix * Spaltenvektor – lineare algebraische Multiplikation

Verwenden Sie die integrierten Funktionen für das Vektor-Punktprodukt, das Kreuzprodukt und die komponentenweise Multiplikation:

Funktion Beschreibung
f = dot(v, v) Skalarprodukt
v = cross(v, v) Vektorkreuzprodukt
m = matrixCompMult(m, m) Komponentenweise Multiplikation

Programmsteuerung

Funktionsaufruf Call by value-return
Iteration for (<init>;<test>;<next>)
{ break, continue }
Auswahl if ( ) { }
if ( ) { } else { }
switch () { break, case } – Standardfall zuletzt
Springen break, continue, return
(„entfernen“ ist nicht zulässig)
Eintrag half4 main(float2 fragCoord)

Einschränkungen bei For-Schleifen

Ähnlich wie in GLSL ES 1.0 sind „for“-Schleifen ziemlich eingeschränkt. Der Compiler muss die Schleife entschachteln können. Das bedeutet, dass für die Initialisierung, die Testbedingung und die next-Anweisung Konstanten verwendet werden müssen, damit alles zur Kompilierungszeit berechnet werden kann. Die next-Anweisung ist außerdem auf die Verwendung von ++, --, +=, or -= beschränkt.

Integrierte Funktionen

GT (generischer Typ) ist float, float2, float3, float4 oder half, half2, half3, half4.

Die meisten dieser Funktionen werden komponentenweise angewendet. Wenn dies nicht der Fall ist, wird dies vermerkt.

Winkel und trigonometrische Funktionen

Bei Funktionsparametern, die als Winkel angegeben werden, wird davon ausgegangen, dass sie in Radiant angegeben sind. Bei keiner dieser Funktionen kommt es zu einem Fehler vom Typ „Geteilt durch null“. Wenn der Nenner eines Verhältnisses 0 ist, sind die Ergebnisse nicht definiert.

Funktion Beschreibung
GT radians(GT degrees) Wandelt Grad in Radianten um
GT degrees(GT radians) Wandelt Radianten in Grad um
GT sin(GT angle) Standard-Sinus
GT cos(GT angle) Standardkosinus
GT tan(GT angle) Standardtangente
GT asin(GT x) Gibt einen Winkel zurück, dessen Sinus x ist, im Bereich von $ \left[-{\pi\over 2},{\pi\over 2}\right] $
GT acos(GT x) Gibt einen Winkel zurück, dessen Kosinus x ist, im Bereich [0, π].
GT atan(GT y, GT x) Gibt einen Winkel zurück, dessen trigonometrischer Arkustangens $ \left[{y\over x}\right] $ im Bereich $ \left[-\pi,\pi\right] $ ist.
GT atan(GT y_over_x) Gibt einen Winkel zurück, dessen trigonometrischer Arkustangens y_over_x im Bereich von $ \left[-{\pi\over 2},{\pi\over 2}\right] $ ist.

Exponentialfunktionen

Funktion Beschreibung
GT pow(GT x, GT y) Gibt $ x^y $ zurück
GT exp(GT x) Gibt $ e^x $ zurück
GT log(GT x) Gibt $ ln(x) $ zurück
GT exp2(GT x) Gibt 2 hoch x zurück.
GT log2(GT x) Gibt den Wert $ log_2(x) $ zurück.
GT sqrt(GT x) Gibt die Quadratwurzel von x zurück.
GT inversesqrt(GT x) Gibt 1 ÷ Wurzel(x) zurück

Gängige Funktionen

Funktion Beschreibung
GT abs(GT x) Absoluter Wert
GT sign(GT x) Gibt je nach Vorzeichen von x -1,0, 0,0 oder 1,0 zurück
GT floor(GT x) Nächste ganze Zahl <= x
GT ceil(GT x) Nächste ganze Zahl >= x
GT fract(GT x) Gibt den Bruchteil von x zurück
GT mod(GT x, GT y) Gibt den Wert von x modulo y zurück
GT mod(GT x, float y) Gibt den Wert von x modulo y zurück
GT min(GT x, GT y) Gibt den Mindestwert von x oder y zurück
GT min(GT x, float y) Gibt den Mindestwert von x oder y zurück
GT max(GT x, GT y) Gibt den Höchstwert von x oder y zurück
GT max(GT x, float y) Gibt den Höchstwert von x oder y zurück
GT clamp(GT x, GT minVal, GT maxVal) Gibt x zurück, das zwischen minVal und maxVal begrenzt ist.
GT clamp(GT x, float minVal, float maxVal) Gibt x zurück, das zwischen minVal und maxVal begrenzt ist.
GT saturate(GT x) Gibt x zurück, begrenzt auf 0,0 und 1,0.
GT mix(GT x, GT y, GT a) Gibt eine lineare Mischung aus x und y zurück
GT mix(GT x, GT y, float a) Gibt eine lineare Mischung aus x und y zurück
GT step(GT edge, GT x) Gibt 0,0 zurück, wenn x < edge, andernfalls 1,0.
GT step(float edge, GT x) Gibt 0,0 zurück, wenn x < edge, andernfalls 1,0.
GT smoothstep(GT edge0, GT edge1, GT x) Führt eine Hermite-Interpolation zwischen 0 und 1 aus, wenn edge0 < x < edge1
GT smoothstep(float edge0, float edge1, GT x) Führt eine Hermite-Interpolation zwischen 0 und 1 aus, wenn edge0 < x < edge1

Geometrische Funktionen

Diese Funktionen arbeiten nicht komponentenweise, sondern auf Vektoren als Ganzes. GT ist ein Float-/Halbvektor der Größe 2–4.

Funktion Beschreibung
float/half length (GT x) Gibt die Länge des Vektors zurück
float/half distance(GT p0, GT p1) Gibt die Entfernung zwischen Punkten zurück
float/half dot(GT x, GT y) Skalarprodukt zurückgeben
float3/half3 cross(float3/half3 x, float3/half3 y) Rückgaben – produktübergreifend
GT normalize(GT x) Vektor auf Länge 1 normalisieren
GT faceforward(GT N, GT I, GT Nref) Gibt N zurück, wenn „dot(Nref, I)“ < 0 ist, andernfalls -N.
GT reflect(GT I, GT N) Reflexionsrichtung I – 2 * Skalarprodukt(N,I) * N.
GT refract(GT I, GT N, float/half eta) Gibt den Brechungsvektor zurück

Matrixfunktionen

„Typ mat“ ist ein beliebiger quadratischer Matrixtyp.

Funktion Beschreibung
mat matrixCompMult(mat x, mat y) Komponentenweise Multiplikation von x mit y
mat inverse(mat m) Gibt die Umkehrfunktion von m zurück.

Vektorrelationale Funktionen

Vergleichen Sie die Komponenten x und y. Die Größe der Eingabe- und Rückgabevektoren für einen bestimmten Aufruf muss übereinstimmen. T ist die Vereinigung von Ganzzahl- und Gleitkommavektortypen. BV ist ein boolescher Vektor, der der Größe der Eingabevektoren entspricht.

Funktion Beschreibung
BV lessThan(T x, T y) x < y
BV lessThanEqual(T x, T y) x <= y
BV greaterThan(T x, T y) x > y
BV greaterThanEqual(T x, T y) x >= y
BV equal(T x, T y) x == y
BV equal(BV x, BV y) x == y
BV notEqual(T x, T y) x != y
BV notEqual(BV x, BV y) x != y
bool any(BV x) true, wenn eine Komponente von x true ist
bool all(BV x) true, wenn alle Komponenten von x true sind.
BV not(BV x) logisches Komplement von x

Farbfunktionen

Funktion Beschreibung
vec4 unpremul(vec4 color) Wandelt den Farbwert in einen nicht vormultiplizierten Alphawert um.
half3 toLinearSrgb(half3 color) Farbraumtransformation in linearen sRGB
half3 fromLinearSrgb(half3 color) Farbraumtransformation

Shader-Sampling (Bewertung)

Samplertypen werden nicht unterstützt, Sie können aber andere Shader verwenden. Wenn Sie eine Textur stichprobenartig verwenden möchten, können Sie ein BitmapShader-Objekt erstellen und es als Uniform hinzufügen. Das ist für jeden Shader möglich. Sie können also jeden Android-Shader direkt auswerten, ohne ihn zuerst in eine Bitmap umzuwandeln, einschließlich anderer RuntimeShader-Objekte. Das bietet eine enorme Flexibilität, aber komplexe Shader können teuer in der Auswertung sein, insbesondere in einer Schleife.

uniform shader image;

image.eval(coord).a   // The alpha channel from the evaluated image shader

Stichprobenerhebung aus dem Rohbuffer

Die meisten Bilder enthalten Farben, die farbkalibriert werden sollten. Einige Bilder enthalten jedoch keine Farben, sondern Daten wie Normalen, Materialeigenschaften (z. B. Rauheit), Höhenkarten oder andere rein mathematische Daten, die in einem Bild gespeichert sind. Wenn Sie diese Art von Bildern in AGSL verwenden, können Sie einen BitmapShader als generischen Rohbuffer mit RuntimeShader#setInputBuffer verwenden. So werden Farbraumtransformationen und -filter vermieden.