AGSL-Kurzübersicht

AGSL ist weitgehend kompatibel mit GLSL ES 1.0. Weitere Informationen die entsprechende Funktion in der Dokumentation zur OpenGL ES Shading Language Wenn möglich, wird in dieser Dokumentation versucht, auf Unterschiede zwischen AGSL-Dateien hinzuweisen. und GLSL.

Typen

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

Basistypen

Typ Beschreibung
void Kein Rückgabewert der Funktion oder leerer Parameter Liste. Im Gegensatz zu GLSL werden Funktionen ohne Leerraum muss ein Wert zurückgegeben werden.
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 Gleitkommazahl mit einfacher Genauigkeit Skalar/Vektor
short, short2, short3, short4 Entspricht mediump int signiert Ganzzahl/Vektor
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 mediump float Matrixtypen

Genauigkeit und Mindestwerte

Dies sind die minimale garantierte Precision und der -Modifikator basierend auf der OpenGL ES 2.0-Spezifikation. Da die meisten Geräte ES 3.0 unterstützen, haben sie eine garantierte highp Genauigkeit/Reichweite Bereich int mediump. Genauigkeitsmodifikatoren können auf Skalar-, Vektor- und Matrixvariablen und -parametern. Nur die unten aufgeführten Mindestbeträge sind garantiert. lowp ist nicht unbedingt eine geringere Precision als mediump und mediump ist nicht unbedingt geringer als highp. AGSL wandelt derzeit lowp um in der Endausgabe auf mediump setzen.

Modifizierer 'Gleitkommazahl' Bereich 'Gleitkommazahl' Größenbereich 'Gleitkommazahl' Precision "int" Bereich
High \(\left\{-2^{62},2^{62}\right\}\) \(\left\{2^{-62},2^{62}\right\}\) Relativ: \(2^{-16}\) \(\left\{-2^{16},2^{16}\right\}\)
Logo: 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 numerischen Subskriptsyntax im Array, 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: kann verwendet werden, wenn Sie auf Vektoren zugreifen, die Punkte/Normalen darstellen

vect.rgba: Verwenden Sie diese Option, wenn Sie auf Vektoren zugreifen, die Farben darstellen

vect.LTRB: zu verwenden, wenn der Vektor ein Rechteck darstellt (nicht in GLSL)

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

Strukturen und Arrays

Strukturen werden mit derselben Syntax wie GLSL deklariert, AGSL unterstützt jedoch nur und Strukturen auf globaler Ebene.

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

Es werden nur eindimensionale Arrays mit einer expliziten Arraygröße unterstützt, wobei die Verwendung von Syntax im C- oder GLSL-Stil:

<Basistyp>[<Array-Größe>]-Variablenname – Beispiel: half[10] x;

<Basistyp> Variablenname[<Arraygröße>] – Beispiel: half x[10];

Arrays können nicht von einer Funktion zurückgegeben, kopiert, zugewiesen oder verglichen werden. Array-Einschränkungen werden auf Strukturen angewendet, die Arrays enthalten. Arrays können nur mit einer Konstanten oder einer Schleifenvariable indexiert werden.

Qualifikation

Typ Beschreibung
const Kompilierungszeitkonstante oder schreibgeschützte Funktion .
uniform Wert ändert sich nicht über die Primitive hinweg verarbeitet wird. Uniformen werden von Android mithilfe von RuntimeShader Methoden für setColorUniform, setFloatUniform, setIntUniform, setInputBuffer und setInputShader
in Für übergebene Funktionsparameter. Dies ist die Standardeinstellung.
out Für übergebene Funktionsparameter. Muss verwendet werden dieselbe Genauigkeit wie die Funktionsdefinition.
inout Für Parameter, die sowohl an- als auch ausgehend übergeben werden einer Funktion. Muss dieselbe Genauigkeit wie der Funktionsdefinition.

Variablendeklaration

Deklarationen müssen sich in einem expliziten geschweiften Bereich befinden. Die Deklaration von y in Das folgende Beispiel ist nicht zulässig:

if (condition)
    int y = 0;

Matrix/Struktur/Array-Grundlagen

Beispiele für Matrixkonstruktoren

Wenn eine Matrix mit einem einzigen Wert konstruiert wird, werden alle Werte zusammen der Diagonalen wird dieser Wert gegeben, die übrigen Nullen. float2x2(1.0) würde und erstellen daher eine 2 x 2-Identitätsmatrix.

Wenn eine Matrix mit mehreren Werten konstruiert wird, werden zuerst die Spalten ausgefüllt (wichtige Spaltenreihenfolge).

Beachten Sie, dass im Gegensatz zu GLSL-Konstruktoren, die die Anzahl der Komponenten eines übergebene Vektoren werden nicht unterstützt. Sie können aber Effekts. Sie erstellen eine vec3 aus einer vec4 in AGSL mit demselben Verhalten wie GLSL, 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

Auf Matrixkomponenten mit Array-Subskriptionssyntax 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 Punkt-Operator . aus. Zu den Operatoren gehören:

Operator Beschreibung
. Feldselektor
==, != Gleichheit
= Zuweisung

Array-Elemente

Der Zugriff auf Array-Elemente erfolgt mit dem Array-Subskriptoperator [ ]. Beispiel:

diffuseColor += lightIntensity[3] * NdotL;

Netzbetreiber

Die Nummer ist in der Reihenfolge ihrer Priorität nummeriert. Relationale und Gleichheit Operatoren > &lt; <= >= == != als boolescher Wert auszuwerten. Vektoren vergleichen Komponentenweise verwenden Sie Funktionen wie lessThan(), equal() usw.

Operator Beschreibung Assoziativität
1 () Gruppierung in Klammern
2 [] () . ++ -- Tiefgestelltes Array Funktionsaufruf & Konstruktorstruktur Feld oder Methode Selektor, Swizzle Postfix-Inkrement und verringern Rechtsläufig
3 ++ -- + - ! Präfix-Inkrementierung und Unärer verringern 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 (eine ganze Operand) Rechtsläufig
16 = += -= *= /= Zuweisungsarithmetik Zuweisungsarithmetik Zuweisung Rechtsläufig
17 , Sequenz Rechtsläufig

Matrix- und Vektoroperationen

Bei Anwendung auf skalare Werte ergeben die arithmetischen Operatoren einen Skalar. Für wenn ein Operand ein Skalar und der andere ein Vektor- oder Matrixstruktur ist, wird die Operation komponentenweise durchgeführt und ergibt die Vektor- oder Matrixtyps. Wenn beide Operationen Vektoren derselben Größe sind, -Vorgang komponentenweise durchgeführt (und gibt denselben Vektortyp zurück).

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 Matrixkomponentenweise Addition
m = m - m Matrixkomponentenweise Subtraktion
m = m * m Lineare algebraische Multiplikation

Wenn ein Operand ein Vektor ist, der der Zeilen- oder Spaltengröße unserer Matrix entspricht, gibt die Multiplikationsoperator kann für die algebraische Zeilen- und Spaltenmultiplikation verwendet werden.

Betrieb Beschreibung
m = v * m Zeilenvektor × lineare algebraische Multiplikation der Matrix
m = m * v Matrix * Spaltenvektor – lineare algebraische Multiplikation

Die integrierten Funktionen für Vektor-Punktprodukt, Kreuzprodukt und komponentenweise Multiplikation:

Funktion Beschreibung
f = dot(v, v) Vektor-Punktprodukt
v = cross(v, v) Vektorübergreifendes Produkt
m = matrixCompMult(m, m) Komponentenweise Multiplikation

Programmsteuerung

Funktionsaufruf Anruf nach Wert/Rückgabe
Iteration for (<init>;<test>;<next>)
{ break, continue }
Auswahl if ( ) { }
if ( ) { } else { }
switch () { break, case } – Standard-Groß-/Kleinschreibung zuletzt
Springen break, continue, return
(Verwerfen ist nicht zulässig)
Eintrag half4 main(float2 fragCoord)

Für Schleifenbeschränkungen

Ähnlich wie GLSL ES 1.0, "for" Schleifen sind ziemlich begrenzt. muss der Compiler um die Schleife zu lösen. Das bedeutet, dass der Initialisierer, die Testbedingung und In der Anweisung next müssen Konstanten verwendet werden, damit alles beim Kompilieren berechnet werden kann . Die next-Anweisung ist weiter auf die Verwendung von ++, --, +=, or -= beschränkt.

Integrierte Funktionen

GT (allgemeiner Typ) ist float, float2, float3, float4 oder half, half2, half3 und half4

Die meisten dieser Funktionen werden komponentenbezogen ausgeführt (die Funktion wird pro Komponente). Es wird vermerkt, wenn dies nicht der Fall ist.

Winkel & Trigonometrische Funktionen

Bei Funktionsparametern, die als Winkel angegeben sind, wird davon ausgegangen, dass sie in Radianten angegeben sind. In keinem Fall führt eine dieser Funktionen zu einem "Geteilt durch Null"-Fehler. Wenn die Divisor 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 Bogenmaß (Radiant) 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 im Bereich ist von $ \left[-{\pi\over 2},{\pi\over 2}\right] $
GT acos(GT x) Gibt einen Winkel zurück, dessen Kosinus x im Bereich von $ \left[0,\pi\right] $
GT atan(GT y, GT x) Gibt einen Winkel zurück, dessen Trigonometrischer Arkustangens ist $ \left[{y\over x}\right] $ in der Bereich von $ \left[-\pi,\pi\right] $
GT atan(GT y_over_x) Gibt einen Winkel zurück, dessen trigonometrisches Arkustangens ist y_over_x im Bereich von $ \left[-{\pi\over 2},{\pi\over 2}\right] $

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^x $ zurück
GT log2(GT x) Gibt $ log_2(x) $ zurück
GT sqrt(GT x) Gibt $ \sqrt{x} $ zurück
GT inversesqrt(GT x) Gibt $ 1\over{\sqrt{x}} $ zurück

Allgemeine Funktionen

Funktion Beschreibung
GT abs(GT x) Absoluter Wert
GT sign(GT x) Gibt -1.0, 0.0 oder 1.0 basierend auf dem Vorzeichen von x zurück.
GT floor(GT x) Nächste Ganzzahl <= x
GT ceil(GT x) Nächste Ganzzahl >= 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 Minimalwert von x oder y zurück
GT min(GT x, float y) Gibt den Minimalwert von x oder y zurück
GT max(GT x, GT y) Gibt den Maximalwert von x oder y zurück
GT max(GT x, float y) Gibt den Maximalwert von x oder y zurück
GT clamp(GT x, GT minVal, GT maxVal) Gibt den Wert x zwischen minVal und maxVal zurück.
GT clamp(GT x, float minVal, float maxVal) Gibt den Wert x zwischen minVal und maxVal zurück.
GT saturate(GT x) Gibt x zurück, der zwischen 0,0 und 1,0 liegt.
GT mix(GT x, GT y GT a) Gibt die lineare Mischung von x und y zurück
GT mix(GT x, GT y, float a) Gibt die lineare Mischung von x und y zurück
GT step(GT edge, GT x) Gibt 0,0 zurück, wenn x < Edge, sonst 1,0
GT step(float edge, GT x) Gibt 0,0 zurück, wenn x < Edge, sonst 1,0
GT smoothstep(GT edge0, GT edge1, GT x) Führt Hermite-Interpolation durch zwischen 0 und 1, wenn Edge0 < x < Rand1
GT smoothstep(float edge0, float edge1, GT x) Führt Hermite-Interpolation durch zwischen 0 und 1, wenn Edge0 < x < Rand1

Geometrische Funktionen

Diese Funktionen arbeiten mit Vektoren als Vektoren, nicht komponentenweise. GT steht für Gleitkomma-/Halbwertvektoren in den Größen 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) Gibt das Punktprodukt zurück
float3/half3 cross(float3/half3 x, float3/half3 y) Produktübergreifende Rückgaben
GT normalize(GT x) Vektor auf Länge 1 normalisieren
GT faceforward(GT N, GT I, GT Nref) Gibt N zurück, wenn Punkt(Nref, I) < 0, sonst -N.
GT reflect(GT I, GT N) Reflexionsrichtung I: 2 * Punkt(N,I) * N.
GT refract(GT I, GT N, float/half eta) Gibt einen Brechungsvektor zurück.

Matrixfunktionen

Der Typ „mat“ ist ein beliebiger quadratischer Matrixtyp.

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

Vektorrelationale Funktionen

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

Funktion Beschreibung
BV lessThan(T x, T y) x < J
BV lessThanEqual(T x, T y) x <= y
BV greaterThan(T x, T y) x > J
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 gleich 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 Wert um Alpha
half3 toLinearSrgb(half3 color) Farbraumtransformation in lineares SRGB
half3 fromLinearSrgb(half3 color) Farbraumtransformation

Shader-Sampling (Auswertung)

Sampler-Typen werden nicht unterstützt, aber Sie können andere Shader bewerten. Bei Bedarf um eine Textur zu probieren, können Sie BitmapShader-Objekt und fügen es als einheitlich sein. Sie können dies für jeden Shader tun, d. h., Sie können die Daten direkt auswerten einen beliebigen Android Shader verwenden, Zuerst Bitmap, einschließlich anderer RuntimeShader-Objekte. Dadurch können Sie Flexibilität bietet. Komplexe Shader können jedoch teuer werden, insbesondere in einer Schleife.

uniform shader image;

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

Stichprobenerhebung für den Rohpuffer

Obwohl die meisten Bilder Farben enthalten, für die eine Farbverwaltung sinnvoll ist, gibt es einige Bilder. Daten enthalten, die keine Farben sind, wie z. B. Bilder, die Normalen speichern, Materialeigenschaften (z.B. Rauheit), Heightmaps oder andere reine mathematische Daten, die zufällig in einem Bild gespeichert sind. Wenn Sie diese Arten von von Bildern in AGSL können Sie BitmapShader als generischen Rohpuffer verwenden, indem Sie RuntimeShader#setInputBuffer Dadurch werden Farbraumtransformationen und -filter vermieden.