AGSL está diseñado para ser altamente compatible con GLSL ES 1.0. Para obtener más información, consulta la función equivalente en la documentación de OpenGL ES Shading Language. Cuando es posible, esta documentación intenta señalar las diferencias entre AGSL y GLSL.
Tipos
AGSL admite tipos GLSL ES 1.0 junto con una forma adicional de representar tipos de vectores y matrices. AGSL admite tipos adicionales de short
y half
para representar la precisión media.
Tipos básicos
Tipo | Descripción |
---|---|
void
|
No hay valor de retorno de la función ni lista de parámetros vacía. A diferencia de GLSL, las funciones sin un tipo de datos que se muestra nulo deben mostrar un valor. |
bool, bvec2, bvec3, bvec4 (bool2, bool3, bool4) . |
Escalar o vector booleano |
int, ivec2, ivec3, ivec4 (int2, int3, int4) |
Número entero o vector con firma highp
|
float, vec2, vec3, vec4 (float2, float3, float4)
|
Escalar o vector de punto flotante highp (precisión simple) |
short, short2, short3, short4
|
Equivale a un número entero o vector firmado de mediump int . |
half, half2, half3, half4 |
es equivalente a un escalar o vector mediump float |
mat2, mat3, mat4 (float2x2, float3x3, float4x4) |
Matriz float de 2 × 2, 3 × 3 y 4 × 4
|
half2x2, half3x3, half4x4 |
Equivale a los tipos de matrices mediump float |
Precisión y mínimos de rango
Estos son la precisión y el rango mínimos garantizados asociados con cada modificador según la especificación de OpenGL ES 2.0. Dado que la mayoría de los dispositivos admiten ES 3.0, tendrán una precisión o un rango de highp
y un rango de int mediump
más garantizados. Los modificadores de precisión se pueden aplicar a variables y parámetros escalares, vectoriales y matriciales. Solo se garantizan los mínimos que se indican a continuación. lowp
no tiene necesariamente una precisión menor que mediump
, y mediump
no tiene necesariamente una precisión menor que highp
. Actualmente, AGSL convierte lowp
en mediump
en el resultado final.
Modificador | Rango de "float" | Rango de magnitud "float" | Precisión de "float" | Rango "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\}\) | Absoluto: \(2^{-8}\) | \(\left\{-2^{8},2^{8}\right\}\) |
Además de la sintaxis de subíndice numérico del array, p. ej., 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
: Úsalo cuando accedas a vectores que representen puntos o normales.
vect.rgba
: Úsalo cuando accedas a vectores que representen colores.
vect.LTRB
: Úsalo cuando el vector represente un rectángulo (no en GLSL).
En AGSL, se pueden usar 0 y 1 para producir un 0 o 1 constante en ese canal.
P. ej.: vect.rgb1 == vec4(vect.rgb,1)
Estructuras y arrays
Las estructuras se declaran con la misma sintaxis que GLSL, pero AGSL solo admite estructuras con alcance global.
struct type-name {
members
} struct-name; // optional variable declaration.
Solo se admiten arrays de 1 dimensión con un tamaño de array explícito, con sintaxis de estilo C o GLSL:
<base type>[<array size>] nombre de la variable: p. ej., half[10] x;
Nombre de la variable <base type>[<array size>] (p. ej., half x[10];
)
Los arrays no se pueden mostrar desde una función, copiar, asignar ni comparar. Las restricciones de arrays se propagan a las estructuras que contienen arrays. Los arrays solo se pueden indexar con una constante o una variable de bucle.
Clasificatorios
Tipo | Descripción |
---|---|
const
|
Constante del tiempo de compilación o parámetro de función de solo lectura |
uniform
|
El valor no cambia en la primitiva que se está procesando.
Los uniformes se pasan desde Android con métodos RuntimeShader para setColorUniform , setFloatUniform , setIntUniform , setInputBuffer y setInputShader . |
in
|
Para los parámetros de función pasados. Es el valor predeterminado. |
out
|
Para los parámetros de función pasados. Debe usar la misma precisión que la definición de la función. |
inout
|
Para los parámetros que se pasan dentro y fuera de una función. Debe usar la misma precisión que la definición de la función. |
Declaración de una variable
Las declaraciones deben estar en un alcance explícito con llaves. No se permite la declaración de y
en el siguiente ejemplo:
if (condition)
int y = 0;
Conceptos básicos de matrices, estructuras y arrays
Ejemplos de constructores de matrices
Cuando se construye una matriz con un solo valor, a todos los valores de la diagonal se les asigna ese valor, mientras que al resto se les asigna cero. Por lo tanto, float2x2(1.0)
crearía una matriz de identidad de 2 × 2.
Cuando se construye una matriz con varios valores, las columnas se completan primero (orden de formato de columna).
Ten en cuenta que, a diferencia de GLSL, no se admiten los constructores que reducen la cantidad de componentes de un vector pasado, pero puedes usar el intercambio para obtener el mismo efecto. Para construir un vec3
a partir de un vec4
en AGSL con el mismo comportamiento que GLSL, especifica vec3 nv = quadVec.xyz
.
Ejemplo de constructor de estructura
struct light { float intensity; float3 pos; };
// literal integer constants auto-converted to floating point
light lightVar = light(3, float3(1, 2, 3.0));
Componentes de matriz
Accede a los componentes de una matriz con la sintaxis de subíndice de 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
Campos de estructura
Selecciona campos de estructura con el operador de período .
. Entre los operadores, se incluyen los siguientes:
Operador | Descripción |
---|---|
. |
selector de campos |
==, != |
igualdad |
= |
tarea |
Elementos de array
Se accede a los elementos del array con el operador de subíndice del array [ ]
. Por ejemplo:
diffuseColor += lightIntensity[3] * NdotL;
Operadores
Se numeran en orden de precedencia. Los operadores relacionales y de igualdad > < <= >= == != se evalúan como un valor booleano. Para comparar vectores por componente, usa funciones como lessThan()
, equal()
, etcétera.
Operador | Descripción | Asociatividad | |
---|---|---|---|
1 | () |
agrupación entre paréntesis | N/A |
2 | [] () . ++ --
|
Llamada a función de subíndice de array y selector de campo o método de estructura de constructor, incremento y decremento postfijo de intercambio | Izquierda a derecha |
3 | ++ -- + - !
|
prefijo incremento y decremento unario | Derecha a izquierda |
4 | * / |
multiplicar y dividir | Izquierda a derecha |
5 | + - |
sumar y restar | Izquierda a derecha |
7 | < > <= >= |
relacional | Izquierda a derecha |
8 | == != |
igualdad/desigualdad | Izquierda a derecha |
12 | && |
Y lógico | Izquierda a derecha |
13 | ^^ |
XOR lógico | Izquierda a derecha |
14 | || |
O lógico | Izquierda a derecha |
15 | ?\:
|
selección (un operando completo) | Izquierda a derecha |
16 | = += -= *= /=
|
asignación aritmética asignación aritmética asignación | Izquierda a derecha |
17 | , |
secuencia | Izquierda a derecha |
Operaciones con matrices y vectores
Cuando se aplican a valores escalares, los operadores aritméticos generan un valor escalar. Para operadores distintos del módulo, si un operando es un escalar y el otro es un vector o una matriz, la operación se realiza por componentes y genera el mismo tipo de vector o matriz. Si ambas operaciones son vectores del mismo tamaño, la operación se realiza por componente (y muestra el mismo tipo de vector).
Operación | Descripción |
---|---|
m = f * m |
Multiplicación de matrices por un valor escalar por componente |
v = f * v |
Multiplicación de vectores por un valor escalar por componente |
v = v * v |
Multiplicación de vectores por componentes por un valor de vector |
m = m + m |
Adición de componentes de matrices |
m = m - m |
Resta de componentes de matrices |
m = m * m |
Multiplicación algebraica lineal |
Si un operando es un vector que coincide con el tamaño de la fila o la columna de nuestra matriz, el operador de multiplicación se puede usar para realizar la multiplicación algebraica de filas y columnas.
Operación | Descripción |
---|---|
m = v * m |
Multiplicación algebraica lineal de vector de fila por matriz |
m = m * v |
Multiplicación algebraica lineal de matriz × vector de columna |
Usa las funciones integradas para el producto escalar de vectores, el producto cruzado y la multiplicación por componentes:
Función | Descripción |
---|---|
f = dot(v, v) |
Producto punto de vectores |
v = cross(v, v) |
Producto vectorial cruzado |
m = matrixCompMult(m, m) |
Multiplicación por componente |
Control de programas
Llamada a función | Llamada por valor que se muestra |
---|---|
Iteración | for (<init>;<test>;<next>) { break, continue } |
Selección | if ( ) { } if ( ) { } else { } switch () { break, case }
- El caso predeterminado es el último |
Saltar | break, continue, return (no se permite descartar) |
Entrada | half4 main(float2 fragCoord) |
Limitaciones del bucle for
Al igual que en GLSL ES 1.0, los bucles “for” son bastante limitados; el compilador debe poder desenrollar el bucle. Esto significa que el inicializador, la condición de prueba y la sentencia next
deben usar constantes para que todo se pueda calcular en el momento de la compilación. La sentencia next
se limita aún más al uso de ++, --, +=, or -=
.
Funciones integradas
GT
(tipo genérico) es float
, float2
, float3
, float4
o half
, half2
, half3
, half4
.
La mayoría de estas funciones operan por componente (la función se aplica por componente). Se indica cuando no es así.
Ángulos y funciones trigonométricas
Se supone que los parámetros de función especificados como un ángulo están en unidades de radianes. En ningún caso, ninguna de estas funciones generará un error de división por cero. Si el divisor de una proporción es 0, los resultados no se definirán.
Función | Descripción |
---|---|
GT radians(GT degrees) |
Convierte grados en radianes |
GT degrees(GT radians) |
Convierte radianes en grados |
GT sin(GT angle) |
Seno estándar |
GT cos(GT angle) |
Coseno estándar |
GT tan(GT angle) |
Tangente estándar |
GT asin(GT x)
|
Muestra un ángulo cuyo seno es x en el rango de $ \left[-{\pi\over 2},{\pi\over 2}\right] $. |
GT acos(GT x)
|
Muestra un ángulo cuyo coseno es x en el rango de $ \left[0,\pi\right] $. |
GT atan(GT y, GT x)
|
Muestra un ángulo cuya arctangente trigonométrica es $ \left[{y\over x}\right] $ en el rango de $ \left[-\pi,\pi\right] $. |
GT atan(GT y_over_x)
|
Muestra un ángulo cuya arctangente trigonométrica es y_over_x en el rango de $ \left[-{\pi\over 2},{\pi\over 2}\right] $ |
Funciones exponenciales
Función | Descripción |
---|---|
GT pow(GT x, GT y) |
Devuelve $ x^y $ |
GT exp(GT x) |
Devuelve $ e^x $ |
GT log(GT x) |
Devuelve $ ln(x) $ |
GT exp2(GT x) |
Devuelve $ 2^x $ |
GT log2(GT x) |
Devuelve $ log_2(x) $ |
GT sqrt(GT x) |
Devuelve $ \sqrt{x} $ |
GT inversesqrt(GT x) |
Devuelve $ 1\over{\sqrt{x}} $ |
Funciones comunes
Función | Descripción |
---|---|
GT abs(GT x) |
Valor absoluto |
GT sign(GT x) |
Muestra -1.0, 0.0 o 1.0 según el signo de x. |
GT floor(GT x) |
Número entero más cercano <= x |
GT ceil(GT x) |
Número entero más cercano >= x |
GT fract(GT x) |
Muestra la parte fraccionaria de x. |
GT mod(GT x, GT y) |
Muestra el valor de x módulo y. |
GT mod(GT x, float y) |
Muestra el valor de x módulo y. |
GT min(GT x, GT y) |
Muestra el valor mínimo de x o y. |
GT min(GT x, float y) |
Muestra el valor mínimo de x o y. |
GT max(GT x, GT y) |
Muestra el valor máximo de x o y. |
GT max(GT x, float y) |
Muestra el valor máximo de x o y. |
GT clamp(GT x, GT
minVal, GT maxVal) |
Muestra x restringido entre minVal y maxVal. |
GT clamp(GT x, float
minVal, float maxVal) |
Muestra x restringido entre minVal y maxVal. |
GT saturate(GT x) |
Muestra x limitado entre 0.0 y 1.0. |
GT mix(GT x, GT y,
GT a) |
Muestra una combinación lineal de x e y. |
GT mix(GT x, GT y,
float a) |
Muestra una combinación lineal de x e y. |
GT step(GT edge, GT x) |
Muestra 0.0 si x < edge, de lo contrario, 1.0. |
GT step(float edge,
GT x) |
Muestra 0.0 si x < edge, de lo contrario, 1.0. |
GT smoothstep(GT edge0,
GT edge1, GT x) |
Realiza la interpolación de Hermite entre 0 y 1 cuando edge0 < x < edge1. |
GT smoothstep(float
edge0, float edge1,
GT x) |
Realiza la interpolación de Hermite entre 0 y 1 cuando edge0 < x < edge1. |
Funciones geométricas
Estas funciones operan en vectores como vectores, no por componentes. GT son vectores de punto flotante o medio en tamaños de 2 a 4.
Función | Descripción |
---|---|
float/half length
(GT x) |
Muestra la longitud del vector. |
float/half distance(GT
p0, GT p1) |
Muestra la distancia entre puntos |
float/half dot(GT x,
GT y) |
Devuelve el producto punto |
float3/half3
cross(float3/half3 x,
float3/half3 y) |
Devolución de producto cruzado |
GT normalize(GT x) |
Normaliza el vector a 1 de longitud |
GT faceforward(GT N,
GT I, GT Nref) |
Muestra N si dot(Nref, I) < 0, de lo contrario, -N. |
GT reflect(GT I, GT N) |
Dirección de reflexión I - 2 * producto punto(N,I) * N. |
GT refract(GT I, GT N,
float/half eta) |
Devuelve el vector de refracción. |
Funciones de matriz
El tipo mat es cualquier tipo de matriz cuadrada.
Función | Descripción |
---|---|
mat matrixCompMult(mat
x, mat y) |
Multiplica x por y por componente |
mat inverse(mat m) |
Muestra la inversa de m. |
Funciones relacionales de vectores
Compara x e y por componente. Los tamaños de los vectores de entrada y devueltos para una llamada en particular deben coincidir. T es la unión de los tipos de vectores de números enteros y de punto flotante. BV es un vector booleano que coincide con el tamaño de los vectores de entrada.
Función | Descripción |
---|---|
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 algún componente de x es true |
bool all(BV x) |
true si todos los componentes de x son true . |
BV not(BV x) |
complemento lógico de x |
Funciones de color
Función | Descripción |
---|---|
vec4 unpremul(vec4
color) |
Convierte el valor de color en alfa no premultiplicado. |
half3 toLinearSrgb(half3
color) |
Transformación del espacio de color a sRGB lineal |
half3 fromLinearSrgb(half3
color) |
Transformación del espacio de color |
Muestreo de sombreadores (evaluación)
No se admiten los tipos de sampler, pero puedes evaluar otros sombreadores. Si necesitas muestrear una textura, puedes crear un objeto BitmapShader y agregarlo como uniforme. Puedes hacerlo para cualquier sombreador, lo que significa que puedes evaluar directamente cualquier sombreador de Android sin convertirlo primero en un Bitmap, incluidos otros objetos RuntimeShader. Esto permite una gran cantidad de flexibilidad, pero los sombreadores complejos pueden ser costosos de evaluar, en especial en un bucle.
uniform shader image;
image.eval(coord).a // The alpha channel from the evaluated image shader
Muestreo de búfer sin procesar
Aunque la mayoría de las imágenes contienen colores que deben administrarse, algunas contienen datos que no son realmente colores, incluidas las imágenes que almacenan normales, propiedades de material (p.ej., rugosidad), mapas de altura o cualquier otro dato puramente matemático que se almacena en una imagen. Cuando usas estos tipos de imágenes en AGSL, puedes usar un BitmapShader como un búfer sin procesar genérico con RuntimeShader#setInputBuffer. Esto evitará las transformaciones y el filtrado del espacio de color.