Référence rapide AGSL

AGSL est conçu pour être largement compatible avec GLSL ES 1.0. Pour en savoir plus, consultez la fonction équivalente dans la documentation du langage de nuanceur OpenGL ES. Lorsque cela est 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'avec une autre méthode de représentation des types de vecteurs et de matrices. AGSL accepte des types short et half supplémentaires pour représenter une précision moyenne.

Types de base

Type Description
void Aucune valeur de retour de fonction ou liste de paramètres vide. Contrairement à GLSL, les fonctions sans type de retour "void" doivent renvoyer une valeur.
bool, bvec2, bvec3, bvec4
(bool2, bool3, bool4).
Scalaire/vecteur booléen
int, ivec2, ivec3, ivec4
(int2, int3, int4)
Entier/vecteur signé highp
float, vec2, vec3, vec4
(float2, float3, float4)
Scalaire/vecteur à virgule flottante highp (simple précision)
short, short2, short3, short4 Équivaut à un entier/vecteur signé mediump int
half, half2, half3, half4 Équivaut au scalaire/vecteur mediump float
mat2, mat3, mat4
(float2x2, float3x3, float4x4)
Matrice float 2x2, 3x3 et 4x4
half2x2, half3x3, half4x4 Équivalent aux types de matrices mediump float

Précision et plage minimales

Il s'agit de la précision et de la plage minimales garanties associées à chaque modificateur, conformément à la spécification OpenGL ES 2.0. Étant donné que la plupart des appareils sont compatibles avec ES 3.0, ils bénéficient d'une précision/portée highp et d'une plage int mediump plus garanties. Les modificateurs de précision peuvent être appliqués aux variables et aux paramètres scalaires, vectoriels et matriciels. Seuls les minima listés ci-dessous sont garantis. lowp n'est pas nécessairement moins précis que mediump, et mediump n'est pas nécessairement moins précis que highp. AGSL convertit actuellement lowp en mediump dans la sortie finale.

Modifier Plage "float" Plage de magnitude "float" Précision "float" Plage "int"
highp \(\left\{-2^{62},2^{62}\right\}\) \(\left\{2^{-62},2^{62}\right\}\) Relative: \(2^{-16}\) \(\left\{-2^{16},2^{16}\right\}\)
mediump \(\left\{-2^{14},2^{14}\right\}\) \(\left\{2^{-14},2^{14}\right\}\) Relative: \(2^{-10}\) \(\left\{-2^{10},2^{10}\right\}\)
lowp \(\left\{-2,2\right\}\) \(\left\{2^{-8},2\right\}\) Absolu: \(2^{-8}\) \(\left\{-2^{8},2^{8}\right\}\)

En plus de la syntaxe de sous-scripte 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 lorsque vous accédez à des vecteurs représentant des points/des normales

vect.rgba : à utiliser lorsque vous accédez à des vecteurs représentant des couleurs

vect.LTRB : à utiliser lorsque le vecteur représente un rectangle (pas en GLSL)

En AGSL, 0 et 1 peuvent être utilisés pour produire un 0 ou un 1 constant dans ce canal. Ex. : vect.rgb1 == vec4(vect.rgb,1)

Structures et tableaux

Les structures sont déclarées selon la même syntaxe que GLSL, mais AGSL n'accepte que les structures de portée globale.

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

Seules les matrices à une dimension sont acceptées avec une taille de matrice explicite, à l'aide de la syntaxe de style C ou GLSL:

<type de base>[<taille de tableau>] nom de la variable (par exemple, half[10] x;)

<type de base> nom de la variable[<taille de l'array>] (par exemple: half x[10];)

Les tableaux ne peuvent pas être renvoyés à partir d'une fonction, copiés, attribués ni comparés. Les restrictions de tableau se propagent aux 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 au moment de la compilation ou paramètre de fonction en lecture seule.
uniform La valeur ne change pas pour 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 à une fonction et renvoyés par celle-ci. 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 explicite entre crochets. 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 de matrices

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éerait donc une matrice d'identité 2x2.

Lorsqu'une matrice est construite avec plusieurs valeurs, les colonnes sont remplies en premier (ordre par colonne).

Notez que, contrairement à GLSL, les constructeurs qui réduisent le nombre de composants d'un vecteur transmis ne sont pas acceptés, mais vous pouvez utiliser le mélange pour obtenir le même effet. Pour créer un vec3 à partir d'un vec4 en AGSL avec le même comportement que 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 de la 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 les champs de structure à l'aide de l'opérateur de période .. Les opérateurs incluent les suivants:

Opérateur Description
. sélecteur de champ
==, != égalité
= devoir

Éléments de tableau

Pour accéder aux éléments d'un tableau, utilisez l'opérateur d'indice de tableau [ ]. Exemple :

diffuseColor += lightIntensity[3] * NdotL;

Opérateurs

Numérotés par ordre de priorité. Les opérateurs relationnels et d'égalité > < <= >= == != renvoient une valeur booléenne. Pour comparer des vecteurs par composante, utilisez des fonctions telles que lessThan(), equal(), etc.

Opérateur Description Associativité
1 () regroupement entre parenthèses N/A
2 [] () . ++ -- Appel de fonction de sous-index de tableau et sélecteur de champ ou de méthode de structure de constructeur, incrément et décrément postfixe de swizzle De gauche à droite
3 ++ -- + - ! incrément et décrément de préfixe unaire 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 && opérateur logique "AND" De gauche à droite
13 ^^ Opérateur logique XOR De gauche à droite
14 || opérateur logique "OR" De gauche à droite
15 ?\: sélection (un seul opérande entier) De gauche à droite
16 = += -= *= /= devoir devoir arithmétique devoir 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 génèrent un scalaire. Pour les opérateurs autres que le modulo, si un opérande est un scalaire et l'autre un vecteur ou une matrice, l'opération est effectuée par composant et donne le même type de vecteur ou de matrice. Si les deux opérations sont des vecteurs de la même taille, l'opération est effectuée par composant (et renvoie le même type de vecteur).

Conditions de fonctionnement Description
m = f * m Multiplication matricielle par composante par une valeur scalaire
v = f * v Multiplication vectorielle par composante par une valeur scalaire
v = v * v Multiplication vectorielle par composante par une valeur vectorielle
m = m + m Addition matricielle par composante
m = m - m Soustraire des matrices par composant
m = m * m Multiplication algébrique linéaire

Si un opérande est un vecteur correspondant à la taille des lignes ou des colonnes 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 de la matrice
m = m * v Matrice * colonne = multiplication algébrique linéaire

Utilisez les fonctions intégrées pour le produit scalaire, le produit vectoriel et la multiplication par composante:

Fonction Description
f = dot(v, v) Produit scalaire de vecteurs
v = cross(v, v) Produit vectoriel
m = matrixCompMult(m, m) Multiplication par composant

Contrôle du programme

Appel de fonction Appel par valeur renvoyée
Itération for (<init>;<test>;<next>)
{ break, continue }
Sélection if ( ) { }
if ( ) { } else { }
switch () { break, case } - cas par défaut en dernier
Sauter break, continue, return
(l'abandon n'est pas autorisé)
Entrée half4 main(float2 fragCoord)

Limites des boucles For

Comme dans GLSL ES 1.0, les boucles "for" sont assez limitées. Le compilateur doit pouvoir dérouler la boucle. Cela signifie que l'initialiseur, la condition de test et l'instruction next doivent utiliser des constantes afin que tout puisse être calculé au moment de la compilation. L'instruction next est également 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 fonctionnent par composant (la fonction est appliquée par composant). Il est indiqué que ce n'est pas le cas.

Angles et fonctions trigonométriques

Les paramètres de fonction spécifiés en tant qu'angle sont supposés être exprimés en radians. Aucune de ces fonctions ne provoquera une erreur de division par zéro. Si le diviseur d'un ratio est égal à 0, les résultats sont indéterminés.

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 l'intervalle $ \left[0,\pi\right] $
GT atan(GT y, GT x) Renvoie un angle dont l'arctangente 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'arctangente 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 de x
GT floor(GT x) Entier le plus proche <= x
GT ceil(GT x) Entier le plus proche >= x
GT fract(GT x) Renvoie la partie fractionnaire de x
GT mod(GT x, GT y) Renvoie la valeur de x modulo y
GT mod(GT x, float y) Renvoie la valeur de x modulo y
GT min(GT x, GT y) Renvoie la valeur minimale de x ou y.
GT min(GT x, float y) Renvoie la valeur minimale de x ou y.
GT max(GT x, GT y) Renvoie la valeur maximale de x ou y
GT max(GT x, float y) Renvoie la valeur maximale de x ou y.
GT clamp(GT x, GT minVal, GT maxVal) Renvoie x limité entre minVal et maxVal.
GT clamp(GT x, float minVal, float maxVal) Renvoie x limité entre minVal et maxVal
GT saturate(GT x) Renvoie x limité entre 0,0 et 1,0.
GT mix(GT x, GT y, GT a) Renvoie un mélange linéaire de x et y
GT mix(GT x, GT y, float a) Renvoie un mélange 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 edge0 < x < edge1
GT smoothstep(float edge0, float edge1, GT x) Effectue une interpolation Hermite entre 0 et 1 lorsque edge0 < x < edge1

Fonctions géométriques

Ces fonctions s'appliquent aux vecteurs en tant que vecteurs, et non par composante. GT correspond aux vecteurs float/half de 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 les points
float/half dot(GT x, GT y) Renvoie le produit scalaire
float3/half3 cross(float3/half3 x, float3/half3 y) Produit croisé des retours
GT normalize(GT x) Normaliser le vecteur pour qu'il ait une longueur de 1
GT faceforward(GT N, GT I, GT Nref) Renvoie N si dot(Nref, I) < 0, sinon -N.
GT reflect(GT I, GT N) Direction de réflexion I - 2 * produit scalaire(N,I) * N.
GT refract(GT I, GT N, float/half eta) Renvoie le vecteur de réfraction.

Fonctions de matrice

Le type mat correspond à n'importe quel type de matrice carrée.

Fonction Description
mat matrixCompMult(mat x, mat y) Multiplier x par y par composant
mat inverse(mat m) Renvoie l'inverse de m.

Fonctions relationnelles vectorielles

Comparez les composants X et Y. Les tailles des vecteurs d'entrée et de retour d'un appel particulier doivent correspondre. T est l'union des 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 un composant de x est true
bool all(BV x) true si toutes les composantes 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 alpha non prémultiplié
half3 toLinearSrgb(half3 color) Transformation de l'espace de couleurs en sRVB linéaire
half3 fromLinearSrgb(half3 color) Transformation de l'espace colorimétrique

Échantillonnage de nuanceurs (é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 le convertir d'abord en Bitmap, y compris les autres objets RuntimeShader. Cela offre une flexibilité énorme, mais les nuanceurs complexes peuvent être coûteux à évaluer, en particulier dans une boucle.

uniform shader image;

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

Échantillonnage du tampon brut

Bien que la plupart des images contiennent des couleurs qui doivent être gérées, certaines images contiennent des données qui ne sont pas réellement des couleurs, y compris les images stockant des normales, des propriétés de matériaux (par exemple, la rugosité), des cartes de hauteur ou toute autre donnée purement mathématique stockée dans une image. Lorsque vous utilisez ces types d'images en AGSL, vous pouvez utiliser un BitmapShader comme tampon brut générique à l'aide de RuntimeShader#setInputBuffer. Cela évite les transformations et le filtrage de l'espace colorimétrique.