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.