AGSL est conçu pour être largement compatible avec GLSL ES 1.0. Pour en savoir plus, consultez la fonction équivalente dans la documentation OpenGL ES Shading Language. Dans la mesure du possible, cette documentation tente de mettre en évidence les différences entre AGSL et GLSL.
Types
AGSL est compatible avec les types GLSL ES 1.0, ainsi qu'un moyen supplémentaire de représenter les types de vecteur et de matrice. AGSL accepte d'autres types short
et half
pour représenter une précision moyenne.
Types de base
Type | Description |
---|---|
void
|
Aucune valeur renvoyée par la fonction ou liste de paramètres vide. Contrairement au GLSL, les fonctions sans type renvoyé vide doivent renvoyer une valeur. |
bool, bvec2, bvec3, bvec4 (bool2, bool3, bool4) . |
Valeur scalaire/vecteur booléenne |
int, ivec2, ivec3, ivec4 (int2, int3, int4) |
Entier/vecteur signé : highp
|
float, vec2, vec3, vec4 (float2, float3, float4)
|
highp (précision simple) scalaire/vecteur à virgule flottante |
short, short2, short3, short4
|
équivaut à mediump int
un entier/vectoriel signé |
half, half2, half3, half4 |
équivaut à mediump float scalaire/vecteur |
mat2, mat3, mat4 (float2x2, float3x3, float4x4) |
Matrice float 2 x 2, 3 x 3 et 4 x 4
|
half2x2, half3x3, half4x4 |
Équivalent aux types de matrices mediump float |
Précision et valeurs minimales de plage
Il s'agit de la précision et de la plage minimales garanties associées à chaque modificateur en fonction de la spécification OpenGL ES 2.0. Comme la plupart des appareils sont compatibles avec ES 3.0, la précision/plage de highp
et la portée int mediump
seront plus garanties. Les modificateurs de précision peuvent être appliqués aux variables et paramètres scalaires, vectoriels et matriciels. Seuls les minimums listés ci-dessous sont garantis. lowp
n'est pas nécessairement une précision inférieure à mediump
, et mediump
n'est pas nécessairement une précision inférieure à highp
. AGSL convertit actuellement lowp
en mediump
dans le résultat final.
Modifier | Plage "float" | Plage de magnitudes "float" | Précision de la valeur "float" | Plage "int" |
---|---|---|---|---|
Highp | \(\left\{-2^{62},2^{62}\right\}\) | \(\left\{2^{-62},2^{62}\right\}\) | Proche: \(2^{-16}\) | \(\left\{-2^{16},2^{16}\right\}\) |
moyen | \(\left\{-2^{14},2^{14}\right\}\) | \(\left\{2^{-14},2^{14}\right\}\) | Proche: \(2^{-10}\) | \(\left\{-2^{10},2^{10}\right\}\) |
fausse | \(\left\{-2,2\right\}\) | \(\left\{2^{-8},2\right\}\) | Valeur absolue: \(2^{-8}\) | \(\left\{-2^{8},2^{8}\right\}\) |
En plus de la syntaxe d'indice numérique de tableau, par exemple 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
: à utiliser lors de l'accès à des vecteurs qui représentent des points/normal.
vect.rgba
: à utiliser lors de l'accès à des vecteurs qui représentent des couleurs.
vect.LTRB
: à utiliser lorsque le vecteur représente un rectangle (pas en GLSL).
Dans AGSL, les valeurs 0 et 1 permettent de générer une constante 0 ou 1 dans ce canal.
Ex. : vect.rgb1 == vec4(vect.rgb,1)
Structures et tableaux
Les structures sont déclarées avec la même syntaxe que le langage GLSL, mais AGSL n'accepte que les structures ayant un champ d'application global.
struct type-name {
members
} struct-name; // optional variable declaration.
Seuls les tableaux unidimensionnels sont compatibles avec une taille de tableau explicite, à l'aide d'une syntaxe de style C ou GLSL:
nom de la variable <type de base>[<taille du tableau>] – Exemple: half[10] x;
nom de variable <type de base>[<taille du tableau>] – Ex. : half x[10];
Les tableaux ne peuvent pas être renvoyés à partir d'une fonction, copiés, attribués ou comparés. Les restrictions de tableau se propagent dans les structures contenant des tableaux. Les tableaux ne peuvent être indexés qu'à l'aide d'une constante ou d'une variable de boucle.
Matchs de qualification
Type | Description |
---|---|
const
|
Constante compile-time ou paramètre de fonction en lecture seule. |
uniform
|
La valeur ne change pas au cours de la primitive en cours de traitement.
Les uniformes sont transmis à partir d'Android à l'aide des méthodes RuntimeShader pour setColorUniform , setFloatUniform , setIntUniform , setInputBuffer et setInputShader . |
in
|
Pour les paramètres de fonction transmis. Ce paramètre est la valeur par défaut. |
out
|
Pour les paramètres de fonction transmis. Doit utiliser la même précision que la définition de la fonction. |
inout
|
Pour les paramètres transmis à la fois dans et depuis une fonction. Doit utiliser la même précision que la définition de la fonction. |
Déclaration de variable
Les déclarations doivent se trouver dans un champ d'application entre accolades explicite. La déclaration de y
dans l'exemple suivant n'est pas autorisée:
if (condition)
int y = 0;
Principes de base des matrices, structures et tableaux
Exemples de constructeurs matriciels
Lorsqu'une matrice est construite avec une seule valeur, toutes les valeurs de la diagonale reçoivent cette valeur, tandis que les autres reçoivent des zéros. float2x2(1.0)
crée donc une matrice d'identité de 2x2.
Lorsqu'une matrice est construite avec plusieurs valeurs, les colonnes sont remplies en premier (ordre principal des colonnes).
Notez que, contrairement au GLSL, les constructeurs qui réduisent le nombre de composants d'un vecteur transmis ne sont pas pris en charge, mais vous pouvez utiliser le swizzling pour obtenir le même effet. Pour construire un vec3
à partir d'un vec4
en AGSL avec le même comportement que le GLSL, spécifiez vec3 nv = quadVec.xyz
.
Exemple de constructeur de structure
struct light { float intensity; float3 pos; };
// literal integer constants auto-converted to floating point
light lightVar = light(3, float3(1, 2, 3.0));
Composants de la matrice
Accédez aux composants d'une matrice à l'aide d'une syntaxe d'indice de tableau.
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
Champs de structure
Sélectionnez des champs de structure à l'aide de l'opérateur de point .
. Les opérateurs incluent:
Opérateur | Description |
---|---|
. |
sélecteur de champ |
==, != |
égalité |
= |
attribution |
Éléments de tableau
Les éléments de tableau sont accessibles à l'aide de l'opérateur d'indice de tableau [ ]
. Par exemple :
diffuseColor += lightIntensity[3] * NdotL;
Opérateurs
Numéroées par ordre de priorité. Les opérateurs relationnels et d'égalité > < <= >= == != évaluent une valeur booléenne. Pour comparer des vecteurs au niveau des composants, utilisez des fonctions telles que lessThan()
, equal()
, etc.
Opérateur | Description | Associativité | |
---|---|---|---|
1 | () |
regroupement entre parenthèses | N/A |
2 | [] () . ++ --
|
tableau indice appel de fonction et structure de constructeur champ ou sélecteur de méthode | De gauche à droite |
3 | ++ -- + - !
|
incrémenter et décrémenter un préfixe | De droite à gauche |
4 | * / |
multiplier et diviser | De gauche à droite |
5 | + - |
additionner et soustraire | De gauche à droite |
7 | < > <= >= |
relationnel | De gauche à droite |
8 | == != |
égalité/inégalité | De gauche à droite |
12 | && |
logique AND | De gauche à droite |
13 ans | ^^ |
logique XOR | De gauche à droite |
14 | || |
opérateur logique "OR" | De gauche à droite |
15 | ?\:
|
(un opérande entier). | De gauche à droite |
16 | = += -= *= /=
|
attribution arithmétique affectation arithmétique affectation arithmétique | De gauche à droite |
17 | , |
sequence | De gauche à droite |
Opérations matricielles et vectorielles
Lorsqu'ils sont appliqués à des valeurs scalaires, les opérateurs arithmétiques donnent un résultat scalaire. Pour les opérateurs autres que modulo, si un opérande est scalaire et que l'autre est un vecteur ou une matrice, l'opération est effectuée au niveau de la composante et donne le même type de vecteur ou de matrice. Si les deux opérations sont des vecteurs de même taille, l'opération est effectuée au niveau de la composante (et renvoie le même type de vecteur).
Conditions de fonctionnement | Description |
---|---|
m = f * m |
Multiplication de matrice par composant par une valeur scalaire |
v = f * v |
Multiplication de vecteur par composant par une valeur scalaire |
v = v * v |
Multiplication de vecteur par composant par une valeur vectorielle |
m = m + m |
Addition par composant matriciel |
m = m - m |
Soustraction par composante de la matrice |
m = m * m |
Multiplier algébrique linéaire |
Si un opérande est un vecteur correspondant à la taille de ligne ou de colonne de notre matrice, l'opérateur de multiplication peut être utilisé pour effectuer une multiplication algébrique des lignes et des colonnes.
Conditions de fonctionnement | Description |
---|---|
m = v * m |
Vecteur de ligne * multiplication algébrique linéaire matricielle |
m = m * v |
Matrice * multiplication algébrique linéaire à vecteur de colonne |
Utilisez les fonctions intégrées pour le produit scalaire vectoriel, le produit croisé et la multiplication par composant:
Fonction | Description |
---|---|
f = dot(v, v) |
Produit scalaire vectoriel |
v = cross(v, v) |
Produit vectoriel vectoriel |
m = matrixCompMult(m, m) |
Multiplier par composant |
Contrôle du programme
Appel de fonction | Appel par valeur/retour |
---|---|
Itération | for (<init>;<test>;<next>) { break, continue } |
Sélection | if ( ) { } if ( ) { } else { } switch () { break, case } (en dernier) la casse par défaut |
Sauter | break, continue, return (la suppression n'est pas autorisée) |
Entrée | half4 main(float2 fragCoord) |
Limites de la boucle For
Comme dans GLSL ES 1.0, les boucles "for" sont assez limitées. Le compilateur doit être capable de les dérouler. Cela signifie que l'initialiseur, la condition de test et l'instruction next
doivent utiliser des constantes pour que tout puisse être calculé au moment de la compilation. L'instruction next
est en outre limitée à l'utilisation de ++, --, +=, or -=
.
Fonctions intégrées
GT
(type générique) est float
, float2
, float3
, float4
ou half
, half2
, half3
, half4
.
La plupart de ces fonctions s'exécutent au niveau de chaque composant (la fonction est appliquée par composant). C'est noté lorsque ce n'est pas le cas.
Fonctions d'angle et trigonométriques
Les paramètres de fonction spécifiés sous la forme d'un angle sont censés être exprimés en radians. L'une de ces fonctions n'entraînera en aucun cas une erreur de division par zéro. Si le diviseur d'un ratio est de 0, les résultats ne sont pas définis.
Fonction | Description |
---|---|
GT radians(GT degrees) |
Convertit des degrés en radians |
GT degrees(GT radians) |
Convertit des radians en degrés |
GT sin(GT angle) |
Sinus standard |
GT cos(GT angle) |
Cosinus standard |
GT tan(GT angle) |
Tangente standard |
GT asin(GT x)
|
Renvoie un angle dont le sinus est x dans la plage $ \left[-{\pi\over 2},{\pi\over 2}\right] $ |
GT acos(GT x)
|
Renvoie un angle dont le cosinus est x dans la plage $ \left[0,\pi\right] $ |
GT atan(GT y, GT x)
|
Renvoie un angle dont l'arc tangente trigonométrique est $ \left[{y\over x}\right] $ dans la plage $ \left[-\pi,\pi\right] $ |
GT atan(GT y_over_x)
|
Renvoie un angle dont l'arc tangente
trigonométrique est y_over_x dans la plage $ \left[-{\pi\over 2},{\pi\over 2}\right] $ |
Fonctions exponentielles
Fonction | Description |
---|---|
GT pow(GT x, GT y) |
Renvoie $ x^y $ |
GT exp(GT x) |
Renvoie $ e^x $ |
GT log(GT x) |
Renvoie $ ln(x) $ |
GT exp2(GT x) |
Renvoie $ 2^x $ |
GT log2(GT x) |
Renvoie $ log_2(x) $ |
GT sqrt(GT x) |
Renvoie $ \sqrt{x} $ |
GT inversesqrt(GT x) |
Renvoie $ 1\over{\sqrt{x}} $ |
Fonctions courantes
Fonction | Description |
---|---|
GT abs(GT x) |
Valeur absolue |
GT sign(GT x) |
Renvoie -1.0, 0.0 ou 1.0 en fonction du signe x. |
GT floor(GT x) |
Entier le plus proche <= x |
GT ceil(GT x) |
Entier le plus proche >= x |
GT fract(GT x) |
Affiche la partie fractionnaire de x. |
GT mod(GT x, GT y) |
Affiche la valeur de x modulo y |
GT mod(GT x, float y) |
Affiche la valeur de x modulo y |
GT min(GT x, GT y) |
Affiche la valeur minimale de x ou y |
GT min(GT x, float y) |
Affiche la valeur minimale de x ou y |
GT max(GT x, GT y) |
Affiche la valeur maximale de x ou y. |
GT max(GT x, float y) |
Affiche la valeur maximale de x ou y. |
GT clamp(GT x, GT
minVal, GT maxVal) |
Renvoie x, compris entre minVal et maxVal. |
GT clamp(GT x, float
minVal, float maxVal) |
Renvoie x, compris entre minVal et maxVal |
GT saturate(GT x) |
Renvoie la valeur x, comprise entre 0,0 et 1,0 |
GT mix(GT x, GT y
GT a) |
Affiche une combinaison linéaire de x et y |
GT mix(GT x, GT y,
float a) |
Affiche une combinaison linéaire de x et y |
GT step(GT edge, GT x) |
Renvoie 0.0 si x < bord, sinon 1.0 |
GT step(float edge,
GT x) |
Renvoie 0.0 si x < bord, sinon 1.0 |
GT smoothstep(GT edge0,
GT edge1, GT x) |
Effectue une interpolation Hermite entre 0 et 1 lorsque l'arête 0 < x < edge1 |
GT smoothstep(float
edge0, float edge1,
GT x) |
Effectue une interpolation Hermite entre 0 et 1 lorsque l'arête 0 < x < edge1 |
Fonctions géométriques
Ces fonctions opèrent sur des vecteurs en tant que vecteurs, et non au niveau de la composante. GT est un vecteur flottant/demi-vecteur pour les tailles 2 à 4.
Fonction | Description |
---|---|
float/half length
(GT x) |
Renvoie la longueur du vecteur |
float/half distance(GT
p0, GT p1) |
Renvoie la distance entre des points |
float/half dot(GT x,
GT y) |
Affiche un produit scalaire |
float3/half3
cross(float3/half3 x,
float3/half3 y) |
Renvoie un produit croisé |
GT normalize(GT x) |
Normaliser le vecteur à la longueur 1 |
GT faceforward(GT N,
GT I, GT Nref) |
Renvoie N si point(Nref, I) < 0, sinon -N. |
GT reflect(GT I, GT N) |
Direction du reflet I - 2 * point(N,I) * N. |
GT refract(GT I, GT N,
float/half eta) |
Renvoie un vecteur de réfraction |
Fonctions de matrice
"type Mat" correspond à n'importe quel type de matrice carrée.
Fonction | Description |
---|---|
mat matrixCompMult(mat
x, mat y) |
Multiplier x par y au niveau de la composante |
mat inverse(mat m) |
Affiche la valeur inverse de m. |
Fonctions vectorielles relationnelles
Comparez x et y au niveau des composants. Les tailles des vecteurs d'entrée et de retour pour un appel particulier doivent correspondre. T est l'union de types de vecteurs entiers et à virgule flottante. "BV" est un vecteur booléen qui correspond à la taille des vecteurs d'entrée.
Fonction | Description |
---|---|
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 si l'un des composants de x est true . |
bool all(BV x) |
true si tous les composants de x sont true . |
BV not(BV x) |
complément logique de x |
Fonctions de couleur
Fonction | Description |
---|---|
vec4 unpremul(vec4
color) |
Convertit la valeur de couleur en valeur alpha non prémultipliée. |
half3 toLinearSrgb(half3
color) |
Transformation de l'espace colorimétrique en SRGB linéaire |
half3 fromLinearSrgb(half3
color) |
Transformation de l'espace colorimétrique |
Échantillonnage du nuanceur (évaluation)
Les types d'échantillonneurs ne sont pas acceptés, mais vous pouvez évaluer d'autres nuanceurs. Si vous devez échantillonner une texture, vous pouvez créer un objet BitmapShader et l'ajouter en tant qu'uniforme. Vous pouvez le faire pour n'importe quel nuanceur, ce qui signifie que vous pouvez évaluer directement n'importe quel nuanceur Android sans d'abord le transformer en Bitmap, y compris d'autres objets RuntimeShader. Cela offre une grande flexibilité, mais l'évaluation des nuanceurs complexes peut être coûteuse, en particulier dans une boucle.
uniform shader image;
image.eval(coord).a // The alpha channel from the evaluated image shader
Échantillonnage de tampon brut
Bien que la plupart des images contiennent des couleurs qui doivent être gérées par couleur, certaines d'entre elles contiennent des données qui ne sont pas réellement des couleurs, y compris des images stockant des normales, des propriétés du matériau (par exemple, rugosité), des plans de hauteur ou toute autre donnée purement mathématiques qui est stockée dans une image. Lorsque vous utilisez ce type d'images dans AGSL, vous pouvez utiliser un BitmapShader comme tampon brut générique à l'aide de RuntimeShader#setInputBuffer. Cela évitera les transformations et le filtrage de l'espace colorimétrique.