Riferimento rapido AGSL

AGSL è progettato per essere ampiamente compatibile con GLSL ES 1.0. Per ulteriori informazioni, vedi la funzione equivalente nella Documentazione di OpenGL ES Shading Language. Laddove possibile, questa documentazione cerca di evidenziare le differenze tra AGSL e GLSL.

Tipi

AGSL supporta i tipi GLSL ES 1.0 insieme a un ulteriore modo per rappresentare i vettori e tipi di matrici. AGSL supporta i tipi aggiuntivi short e half per rappresentare precisione media.

Tipi di base

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

Minimi di precisione e intervallo

Si tratta della precisione e dell'intervallo minimi garantiti associati a ogni basato sulla specifica OpenGL ES 2.0. Poiché la maggior parte dei dispositivi supportano ES 3.0, avranno una precisione/intervallo più garantito di highp Intervallo int mediump. I modificatori di precisione possono essere applicati a scalari, vettoriali e variabili e parametri della matrice. Sono garantiti solo i minimi elencati di seguito. lowp non è necessariamente una precisione inferiore a mediump e mediump non è necessariamente inferiore a highp. AGSL al momento converte lowp a mediump nell'output finale.

Modificatore "float" intervallo "float" intervallo di magnitudo "float" precisione "int" intervallo
massimo \(\left\{-2^{62},2^{62}\right\}\) \(\left\{2^{-62},2^{62}\right\}\) Parente: \(2^{-16}\) \(\left\{-2^{16},2^{16}\right\}\)
medio \(\left\{-2^{14},2^{14}\right\}\) \(\left\{2^{-14},2^{14}\right\}\) Parente: \(2^{-10}\) \(\left\{-2^{10},2^{10}\right\}\)
basso \(\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 es. 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 per accedere a vettori che rappresentano punti/normali

vect.rgba: da utilizzare per accedere 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 usati per produrre una 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 di archiviazione a livello globale.

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

Solo gli array monodimensionali sono supportati con una dimensione array esplicita, utilizzando sintassi di stile C o GLSL:

<tipo di base>[<dimensione array>], nome variabile, ad esempio half[10] x;

<tipo di base> nome variabile[<dimensione array>], ad esempio: half x[10];

Gli array non possono essere restituiti da una funzione, copiati, assegnati o confrontati. Le restrizioni relative agli array si propagano alle strutture che contengono array. Gli array possono l'indicizzazione può essere eseguita solo utilizzando una variabile costante o loop.

Qualificazioni

Tipo Descrizione
const Costante di tempo di compilazione o funzione di sola lettura .
uniform Il valore non cambia nella primitiva in fase di elaborazione. Le uniformi vengono trasmesse da Android tramite Shader di runtime metodi per setColorUniform, setFloatUniform, setIntUniform, setInputBuffer e setInputShader.
in Per i parametri delle funzioni trasmesse. Questo è il predefinito.
out Per i parametri delle funzioni ignorate. Da utilizzare la stessa precisione della definizione della funzione.
inout Per i parametri trasmessi in entrata e in uscita di una funzione. Deve utilizzare la stessa precisione di la definizione della funzione.

Dichiarazione delle variabili

Le dichiarazioni devono avere un ambito di protezione esplicito. La dichiarazione di y in il seguente esempio non è consentito:

if (condition)
    int y = 0;

Nozioni di base su matrice/struttura/array

Esempi di costruttori di matrici

Quando una matrice viene creata con un singolo valore, tutti i valori insieme alla diagonale quel valore, mentre al resto vengono dati zeri. float2x2(1.0) lo farebbe pertanto si crea una matrice identità 2x2.

Quando una matrice è creata con più valori, le colonne vengono riempite per prime (ordine colonna-maggiore).

Tieni presente che, a differenza di GLSL, i costruttori che riducono il numero di componenti di un il vettore passato non è supportato, ma puoi usare la rotazione 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 della struttura

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 obbligo di sottoscrizione a un 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 della struttura

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

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

Elementi array

Per accedere agli elementi array, utilizza l'operatore [ ] di pedice dell'array. Ad esempio:

diffuseColor += lightIntensity[3] * NdotL;

Operatori

Sono numerati in ordine di precedenza. Lo scenario relazionale e l'uguaglianza operatori > &lt; <= >= == != restituisce un valore booleano. Per confrontare i vettori a livello di componente, usa funzioni quali lessThan(), equal() e così via.

Operatore Descrizione Associatività
1 () raggruppamento tra parentesi N/D
2 [] () . ++ -- pedice array funzione chiamata & struttura costruttore campo o metodo selettore, swizzle l'incremento automatico diminuisci Da sinistra verso destra
3 ++ -- + - ! l'incremento del prefisso diminuisci unario Da destra verso sinistra
4 * / moltiplicare e dividere Da sinistra verso destra
5 + - add e sottrai Da sinistra verso destra
7 < > <= >= relazionale Da sinistra verso destra
8 == != uguaglianza/disuguaglianza Da sinistra verso destra
12 && AND logico Da sinistra verso destra
13 ^^ XOR logico Da sinistra verso destra
14 || OR logico Da sinistra verso destra
15 ?\: una selezione (un'intera operando) Da sinistra verso destra
16 = += -= *= /= aritmetica di assegnazione aritmetica di assegnazione compito Da sinistra verso destra
17 , sequence Da sinistra verso destra

Operazioni su matrici e vettori

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

Funzionamento Descrizione
m = f * m Moltiplicazione della matrice a livello di componenti per un valore scalare
v = f * v Moltiplicazione del vettore a livello di componenti per un valore scalare
v = v * v Moltiplicazione del vettore a livello di componenti per un valore vettoriale
m = m + m Addizione a livello di componenti della matrice
m = m - m Sottrazione dal punto di vista dei componenti della matrice
m = m * m Moltiplicazione algebrica lineare

Se un operando è un vettore che corrisponde alla dimensione di riga o colonna della nostra matrice, il l'operatore di moltiplicazione può essere utilizzato per eseguire le moltiplicazioni algebriche di righe e colonne.

Funzionamento Descrizione
m = v * m Moltiplicazione algebrica lineare del vettore di riga * della matrice
m = m * v Matrice * colonna algebrica lineare vettoriale per colonna

Utilizza le funzioni integrate per il prodotto Vector., il prodotto incrociato e moltiplicazione per componenti:

Funzione Descrizione
f = dot(v, v) Prodotto con punti vettoriali
v = cross(v, v) Prodotto incrociato vettoriale
m = matrixCompMult(m, m) Moltiplicazione a livello di componenti

Controllo programma

Chiamata funzione Chiamata in base al valore-ritorno
Iterazione for (<init>;<test>;<next>)
{ break, continue }
Selezione if ( ) { }
if ( ) { } else { }
switch () { break, case } - ultima richiesta predefinita
Salta break, continue, return
(non consentito)
Da principiante half4 main(float2 fragCoord)

For loop limitazioni

Simile a GLSL ES 1.0, "for" che sono abbastanza limitati; il compilatore deve essere in grado per svolgere il ciclo. Ciò significa che l'inizializzatore, la condizione di test L'istruzione next deve utilizzare costanti affinché sia possibile calcolare tutto in fase di compilazione nel tempo. 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). Si rileva quando non è così.

Angolo e funzioni trigonometriche

I parametri della funzione specificati come angolo si presume siano espressi in radianti. In nessun caso nessuna di queste funzioni genererà un errore di divisione per zero. Se divisore di un rapporto è 0, i risultati saranno indefiniti.

Funzione Descrizione
GT radians(GT degrees) Converte da 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 nella intervallo di $ \left[0,\pi\right] $
GT atan(GT y, GT x) Restituisce un angolo il cui arcotangente trigonometrico è $ \left[{y\over x}\right] $ in intervallo di $ \left[-\pi,\pi\right] $
GT atan(GT y_over_x) Restituisce un angolo la cui trigonometria l'arcotangente è 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 di x modulo y
GT mod(GT x, float y) Restituisce il valore di x modulo 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 bloccato tra minVal e maxVal.
GT clamp(GT x, float minVal, float maxVal) Restituisce x bloccato tra minVal e maxVal
GT saturate(GT x) Restituisce x bloccato tra 0,0 e 1,0
GT mix(GT x, GT y GT a) Restituisce una combinazione lineare di x e y
GT mix(GT x, GT y, float a) Restituisce una 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 edge0 < x < bordo1
GT smoothstep(float edge0, float edge1, GT x) Esegue l'interpolazione Hermite tra 0 e 1 quando edge0 < x < bordo1

Funzioni geometriche

Queste funzioni operano sui vettori come vettori, non a livello di componenti. GT è un vettore mobile/mezzo 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 punti
float/half dot(GT x, GT y) Restituisce il prodotto scalare
float3/half3 cross(float3/half3 x, float3/half3 y) Restituisce prodotti incrociati
GT normalize(GT x) Normalizza il vettore alla lunghezza 1
GT faceforward(GT N, GT I, GT Nref) Restituisce N se punto(Nref, I) < 0, altrimenti -N.
GT reflect(GT I, GT N) Direzione della riflessione I - 2 * punto(N,I) * N.
GT refract(GT I, GT N, float/half eta) Restituisce un vettore di rifrazione

Funzioni matriciali

Il tappetino è di qualsiasi tipo a matrice quadrata.

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

Funzioni relazionali vettoriali

Confrontare i componenti x e y. Le dimensioni dei vettori di input e di ritorno per una particolare chiamata devono corrispondere. "T" indica l'unione dei tipi di vettori interi e con virgola mobile. BV è un vettore booleano che corrisponde alla dimensione dei vettori di input.

Funzione Descrizione
BV lessThan(T x, T y) x < a
BV lessThanEqual(T x, T y) x <= y
BV greaterThan(T x, T y) x > a
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 uno qualsiasi dei componenti 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 colore

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

Campionamento ombreggiamento (valutazione)

I tipi di Sampler non sono supportati, ma puoi valutare altri Shader. Se hai bisogno per campionare una texture, puoi creare BitmapShader e aggiungilo come oggetto uniforme. Puoi fare questo per qualsiasi Shar, il che significa che puoi valutare direttamente qualsiasi Shader Android senza trasformarlo in un Bitmap, incluse altre RuntimeShader. Ciò consente per avere una grande flessibilità, ma gli ombreggiatori complessi possono essere costosi e valuta, 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

Anche se la maggior parte delle immagini contiene colori che devono essere gestiti, alcune contengono dati che non sono effettivamente colori, tra cui immagini che contengono valori normali, proprietà dei materiali (ad es. rugosità), mappe di altezza o qualsiasi altro dati matematici che vengono archiviati in un'immagine. Quando si utilizzano questi tipi di immagini in AGSL, puoi usare un BitmapShader come buffer non elaborato generico utilizzando RuntimeShader#setInputBuffer. In questo modo eviterai trasformazioni e filtri dello spazio colore.