Riferimento rapido AGSL

AGSL è progettato per essere ampiamente compatibile con GLSL ES 1.0. Per saperne di più, consulta la funzione equivalente nella documentazione del linguaggio di shading OpenGL ES. Ove possibile, questa documentazione tenta di evidenziare le differenze tra AGSL e GLSL.

Tipi

AGSL supporta i tipi GLSL ES 1.0, oltre a un modo aggiuntivo per rappresentare i tipi di vettori e matrici. AGSL supporta tipi aggiuntivi di short e half per rappresentare la precisione media.

Tipi di base

Digitazione Descrizione
void Nessun valore restituito dalla funzione o elenco di parametri vuoto. A differenza di GLSL, le funzioni senza un tipo di valore vuoto devono restituire un valore.
bool, bvec2, bvec3, bvec4
(bool2, bool3, bool4).
Scalare/vettore booleano
int, ivec2, ivec3, ivec4
(int2, int3, int4)
highp numero intero/vettore con segno
float, vec2, vec3, vec4
(float2, float3, float4)
Scalare/vettore in virgola mobile highp (precisione singola)
short, short2, short3, short4 equivalente a mediump int intero/vettore con segno
half, half2, half3, half4 equivalente a scalare/vettore mediump float
mat2, mat3, mat4
(float2x2, float3x3, float4x4)
Matrice float 2x2, 3x3, 4x4
half2x2, half3x3, half4x4 Equivalente ai tipi di matrici mediump float

Precisione e intervalli minimi

Si tratta della precisione e dell'intervallo minimi garantiti associati a ogni modificatore in base alla specifica OpenGL ES 2.0. Poiché la maggior parte dei dispositivi supporta ES 3.0, avranno una precisione/un intervallo highp e un intervallo int mediump più garantiti. I modificatori di precisione possono essere applicati a parametri e variabili scalari, vettoriali e matriciali. Sono garantiti solo i valori minimi elencati di seguito.lowp non ha necessariamente una precisione inferiore a mediump e mediump non ha necessariamente una precisione inferiore a highp. Al momento AGSL converte lowp in mediump nell'output finale.

Modificatore Intervallo "float" Intervallo di grandezza "float" Precisione "float" Intervallo "int"
highp \(\left\{-2^{62},2^{62}\right\}\) \(\left\{2^{-62},2^{62}\right\}\) Relativo: \(2^{-16}\) \(\left\{-2^{16},2^{16}\right\}\)
mediump \(\left\{-2^{14},2^{14}\right\}\) \(\left\{2^{-14},2^{14}\right\}\) Relativo: \(2^{-10}\) \(\left\{-2^{10},2^{10}\right\}\)
lowp \(\left\{-2,2\right\}\) \(\left\{2^{-8},2\right\}\) Assoluto: \(2^{-8}\) \(\left\{-2^{8},2^{8}\right\}\)

Oltre alla sintassi dell'indice numerico dell'array, ad esempio 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: da utilizzare quando si accede a vettori che rappresentano punti/nordie

vect.rgba: da utilizzare quando si accede a vettori che rappresentano i colori

vect.LTRB: da utilizzare quando il vettore rappresenta un rettangolo (non in GLSL)

In AGSL, 0 e 1 possono essere utilizzati per produrre un valore costante 0 o 1 in quel canale. Esempio: vect.rgb1 == vec4(vect.rgb,1)

Strutture e array

Le strutture vengono dichiarate con la stessa sintassi di GLSL, ma AGSL supporta solo le strutture a livello globale.

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

Sono supportati solo gli array unidimensionali con una dimensione esplicita, utilizzando la sintassi in stile C o GLSL:

Nome della variabile <base type>[<array size>] - es: half[10] x;

<tipo base> nome variabile[<dimensione array>] - es: half x[10];

Gli array non possono essere restituiti da una funzione, copiati, assegnati o confrontati. Le limitazioni degli array si propagano alle strutture contenenti array. Gli array possono essere indicizzati solo utilizzando una costante o una variabile di loop.

Qualificazioni

Digitazione Descrizione
const Costante di compilazione o parametro di funzione di sola lettura.
uniform Il valore non cambia nella primitiva in fase di elaborazione. Le uniformi vengono passate da Android utilizzando metodi RuntimeShader per setColorUniform, setFloatUniform, setIntUniform, setInputBuffer e setInputShader.
in Per i parametri della funzione passati. Questa è l'impostazione predefinita.
out Per i parametri della funzione passati. Deve utilizzare la stessa precisione della definizione della funzione.
inout Per i parametri che vengono passati sia all'interno sia all'esterno di una funzione. Deve utilizzare la stessa precisione della definizione della funzione.

Dichiarazione di variabili

Le dichiarazioni devono trovarsi in un ambito esplicito tra parentesi graffe. La dichiarazione di y nel seguente esempio non è consentita:

if (condition)
    int y = 0;

Nozioni di base su matrici/strutture/array

Esempi di costruttori di matrici

Quando una matrice viene costruita con un singolo valore, a tutti i valori lungo la diagonale viene assegnato quel valore, mentre al resto vengono assegnati zeri. float2x2(1.0) creerebbe quindi una matrice di identità 2x2.

Quando una matrice viene costruita con più valori, le colonne vengono riempite per prime (ordine di colonna principale).

Tieni presente che, a differenza di GLSL, i costruttori che riducono il numero di componenti di un vettore passato non sono supportati, ma puoi utilizzare lo svuotamento per ottenere lo stesso effetto. Per creare un vec3 da un vec4 in AGSL con lo stesso comportamento di GLSL, specifica vec3 nv = quadVec.xyz.

Esempio di costruttore di strutture

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

Componenti della matrice

Accedi ai componenti di una matrice con la sintassi di sottoindice dell'array.

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

Campi di struttura

Seleziona i campi della struttura utilizzando l'operatore punto .. Gli operatori includono:

Operatore Descrizione
. selettore di campi
==, != uguaglianza
= compito

Elementi array

Per accedere agli elementi dell'array viene utilizzato l'operatore di indice dell'array [ ]. Ad esempio:

diffuseColor += lightIntensity[3] * NdotL;

Operatori

Numerati in ordine di precedenza. Gli operatori di relazione e uguaglianza > < <= >= == != restituiscono un valore booleano. Per confrontare i vettori componente per componente, utilizza funzioni come lessThan(), equal() e così via.

Operatore Descrizione Associatività
1 () raggruppamento tra parentesi N/D
2 [] () . ++ -- indice array chiamata funzione e struttura del costruttore selettore di campo o metodo, swizzle incremento e decremento postfisso Da sinistra verso destra
3 ++ -- + - ! prefisso incremento e decremento unario Da destra verso sinistra
4 * / moltiplicare e dividere Da sinistra verso destra
5 + - addizione e sottrazione Da sinistra verso destra
7 < > <= >= relazionale Da sinistra verso destra
8 == != uguaglianza/diseguaglianza Da sinistra verso destra
12 && AND logico Da sinistra verso destra
13 ^^ OR logico Da sinistra verso destra
14 || OR logico Da sinistra verso destra
15 ?\: selezione (un intero operando) Da sinistra verso destra
16 = += -= *= /= compito aritmetica compito aritmetica compito Da sinistra verso destra
17 , sequence Da sinistra verso destra

Operazioni su matrici e vettori

Se applicati a valori scalari, gli operatori aritmetici generano un valore scalare. Per gli operatori diversi da modulo, se un operando è scalare e l'altro è un vettore o una matrice, l'operazione viene eseguita componente per componente e genera lo stesso tipo di vettore o matrice. Se entrambe le operazioni sono vettori della stessa dimensione, l'operazione viene eseguita componente per componente (e restituisce lo stesso tipo di vettore).

Funzionamento Descrizione
m = f * m Moltiplicazione di una matrice per componente per un valore scalare
v = f * v Moltiplicazione di un vettore per componente per un valore scalare
v = v * v Moltiplicazione vettoriale componente per componente per un valore vettore
m = m + m Somma componente per componente della matrice
m = m - m Sottrazione componente per componente della matrice
m = m * m Moltiplicazione algebrica lineare

Se un operando è un vettore che corrisponde alle dimensioni di righe o colonne della nostra matrice, l'operatore di moltiplicazione può essere utilizzato per eseguire la moltiplicazione algebrica di righe e colonne.

Funzionamento Descrizione
m = v * m Vettore riga * moltiplicazione algebrica lineare della matrice
m = m * v Moltiplicazione algebrica lineare di una matrice per un vettore colonna

Utilizza le funzioni integrate per il prodotto scalare, il prodotto incrociato e la moltiplicazione componente per componente dei vettori:

Funzione Descrizione
f = dot(v, v) Prodotto scalare di vettori
v = cross(v, v) Prodotto vettoriale
m = matrixCompMult(m, m) Moltiplicazione componente per componente

Controllo del programma

Chiamata di funzione Chiamata per valore restituito
Iterazione for (<init>;<test>;<next>)
{ break, continue }
Selezione if ( ) { }
if ( ) { } else { }
switch () { break, case } - default case last
Salta break, continue, return
(l'eliminazione non è consentita)
Voce half4 main(float2 fragCoord)

Limitazioni del ciclo For

Come in GLSL ES 1.0, i cicli "for" sono piuttosto limitati; il compilatore deve essere in grado di svolgere il ciclo. Ciò significa che l'inizializzatore, la condizione di test e l'istruzionenext devono utilizzare costanti in modo che tutto possa essere calcolato in fase di compilazione. L'istruzione next è ulteriormente limitata all'utilizzo di ++, --, +=, or -=.

Funzioni integrate

GT (tipo generico) è float, float2, float3, float4 o half, half2, half3, half4.

La maggior parte di queste funzioni opera a livello di componente (la funzione viene applicata per componente). Viene indicato quando non è così.

Angoli e funzioni trigonometriche

Si presume che i parametri della funzione specificati come angolo siano in unità di radianti. In nessun caso nessuna di queste funzioni genera un errore di divisione per zero. Se il divisore di una proporzione è 0, i risultati non saranno definiti.

Funzione Descrizione
GT radians(GT degrees) Converte i gradi in radianti
GT degrees(GT radians) Converte i radianti in gradi
GT sin(GT angle) Seno standard
GT cos(GT angle) Coseno standard
GT tan(GT angle) Tangente standard
GT asin(GT x) Restituisce un angolo il cui seno è x nell'intervallo di $ \left[-{\pi\over 2},{\pi\over 2}\right] $
GT acos(GT x) Restituisce un angolo il cui coseno è x nell'intervallo $ \left[0,\pi\right] $
GT atan(GT y, GT x) Restituisce un angolo la cui arctangente trigonometrica è $ \left[{y\over x}\right] $ nell'intervallo $ \left[-\pi,\pi\right] $
GT atan(GT y_over_x) Restituisce un angolo la cui arctangente trigonometrica è y_over_x nell'intervallo di $ \left[-{\pi\over 2},{\pi\over 2}\right] $

Funzioni esponenziali

Funzione Descrizione
GT pow(GT x, GT y) Restituisce $ x^y $
GT exp(GT x) Restituisce $ e^x $
GT log(GT x) Restituisce $ ln(x) $
GT exp2(GT x) Restituisce 2^x
GT log2(GT x) Restituisce $ log_2(x) $
GT sqrt(GT x) Restituisce $ \sqrt{x} $
GT inversesqrt(GT x) Restituisce $ 1\over{\sqrt{x}} $

Funzioni comuni

Funzione Descrizione
GT abs(GT x) Valore assoluto
GT sign(GT x) Restituisce -1.0, 0.0 o 1.0 in base al segno di x
GT floor(GT x) Numero intero più vicino <= x
GT ceil(GT x) Numero intero più vicino >= x
GT fract(GT x) Restituisce la parte frazionaria di x
GT mod(GT x, GT y) Restituisce il valore del modulo di x per y
GT mod(GT x, float y) Restituisce il valore del modulo di x per y
GT min(GT x, GT y) Restituisce il valore minimo di x o y
GT min(GT x, float y) Restituisce il valore minimo di x o y
GT max(GT x, GT y) Restituisce il valore massimo di x o y
GT max(GT x, float y) Restituisce il valore massimo di x o y
GT clamp(GT x, GT minVal, GT maxVal) Restituisce x clampato tra minVal e maxVal.
GT clamp(GT x, float minVal, float maxVal) Restituisce x compreso tra minVal e maxVal
GT saturate(GT x) Restituisce x clampato tra 0,0 e 1,0
GT mix(GT x, GT y, GT a) Restituisce la combinazione lineare di x e y
GT mix(GT x, GT y, float a) Restituisce la combinazione lineare di x e y
GT step(GT edge, GT x) Restituisce 0,0 se x < edge, altrimenti 1,0
GT step(float edge, GT x) Restituisce 0,0 se x < edge, altrimenti 1,0
GT smoothstep(GT edge0, GT edge1, GT x) Esegue l'interpolazione Hermite tra 0 e 1 quando bordo0 < x < bordo1
GT smoothstep(float edge0, float edge1, GT x) Esegue l'interpolazione Hermite tra 0 e 1 quando bordo0 < x < bordo1

Funzioni geometriche

Queste funzioni operano sui vettori come vettori, non per componenti. GT è costituito da vettori float/half nelle dimensioni 2-4.

Funzione Descrizione
float/half length (GT x) Restituisce la lunghezza del vettore
float/half distance(GT p0, GT p1) Restituisce la distanza tra i punti
float/half dot(GT x, GT y) Restituisce il prodotto scalare
float3/half3 cross(float3/half3 x, float3/half3 y) Restituisce il prodotto incrociato
GT normalize(GT x) Normalizza il vettore in modo che abbia una lunghezza pari a 1
GT faceforward(GT N, GT I, GT Nref) Restituisce N se dot(Nref, I) < 0, altrimenti -N.
GT reflect(GT I, GT N) Direzione di riflessione I - 2 * dot(N,I) * N.
GT refract(GT I, GT N, float/half eta) Restituisce il vettore di rifrazione

Funzioni di matrice

Il tipo mat è un tipo di matrice quadrata.

Funzione Descrizione
mat matrixCompMult(mat x, mat y) Moltiplicare x per y componente per componente
mat inverse(mat m) Restituisce l'inverso di m

Funzioni relazionali vettoriali

Confronta x e y componente per componente. Le dimensioni dei vettori di input e di ritorno per una determinata chiamata devono corrispondere. T è l'unione dei tipi di vettori interi e in virgola mobile. BV è un vettore booleano che corrisponde alle dimensioni dei vettori di input.

Funzione Descrizione
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 se un componente di x è true
bool all(BV x) true se tutti i componenti di x sono true.
BV not(BV x) complemento logico di x

Funzioni di colore

Funzione Descrizione
vec4 unpremul(vec4 color) Converte il valore del colore in alpha non premoltiplicato
half3 toLinearSrgb(half3 color) Trasformazione dello spazio colore in sRGB lineare
half3 fromLinearSrgb(half3 color) Trasformazione dello spazio colore

Campionamento degli shader (valutazione)

I tipi di sampler non sono supportati, ma puoi valutare altri shader. Se devi campionata una texture, puoi creare un oggetto BitmapShader e aggiungerlo come uniforme. Puoi farlo per qualsiasi shader, il che significa che puoi valutare direttamente qualsiasi shader Android senza prima trasformarlo in un Bitmap, inclusi altri oggetti RuntimeShader. Ciò consente un'enorme flessibilità, ma gli shader complessi possono essere costosi da valutare, in particolare in un loop.

uniform shader image;

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

Campionamento del buffer non elaborato

Sebbene la maggior parte delle immagini contenga colori che devono essere gestiti, alcune contengono dati che non sono effettivamente colori, tra cui immagini che memorizzano normali, proprietà dei materiali (ad es. ruvidità), heightmap o altri dati puramente matematici che si trovano a essere memorizzati in un'immagine. Quando utilizzi questo tipo di immagini in AGSL, puoi utilizzare un BitmapShader come buffer non elaborato generico utilizzando RuntimeShader#setInputBuffer. In questo modo eviterai le trasformazioni e i filtri dello spazio colore.