Referencia rápida de AGSL

AGSL está diseñado para ser altamente compatible con GLSL ES 1.0. Para obtener más información, ver la función equivalente en la Documentación de OpenGL ES Shading Language. Cuando sea posible, en esta documentación se intentarán destacar las diferencias entre AGSL y GLSL.

Tipos

AGSL admite tipos de GLSL ES 1.0 junto con una forma adicional de representar vectores y tipos de matrices. AGSL admite tipos short y half adicionales para representar precisión media.

Tipos básicos

Tipo Descripción
void Ninguna función muestra un valor o un parámetro vacío lista. A diferencia de GLSL, las funciones no están vacías. el tipo de datos que se muestra debe 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 de highp
float, vec2, vec3, vec4
(float2, float3, float4)
Punto flotante de highp (precisión simple) escalar/vector
short, short2, short3, short4 equivalente a mediump int firmado número entero/vector
half, half2, half3, half4 equivalente a mediump float escalar/vector
mat2, mat3, mat4
(float2x2, float3x3, float4x4)
Matriz float de 2 × 2, 3 × 3 y 4 × 4
half2x2, half3x3, half4x4 Equivalente a tipos de matrices mediump float

Mínimos de precisión y rango

Estos son los rangos y la precisión mínimos garantizados asociados con cada basado en la especificación de OpenGL ES 2.0. Ya que la mayoría de los dispositivos admiten ES 3.0, tendrán una precisión/rango de highp más garantizado y Rango de int mediump. Los modificadores de precisión pueden aplicarse a variables escalares, vectoriales y variables y parámetros de la matriz. Solo se garantizan los importes mínimos que se indican a continuación. En realidad, lowp no es necesariamente menor que mediump y mediump. no es necesariamente menor que highp. Actualmente, AGSL convierte lowp a mediump en el resultado final.

Modificador "flotante" rango "flotante" rango de magnitud "flotante" precisión “int” rango
alto \(\left\{-2^{62},2^{62}\right\}\) \(\left\{2^{-62},2^{62}\right\}\) Relativo: \(2^{-16}\) \(\left\{-2^{16},2^{16}\right\}\)
medio \(\left\{-2^{14},2^{14}\right\}\) \(\left\{2^{-14},2^{14}\right\}\) Relativo: \(2^{-10}\) \(\left\{-2^{10},2^{10}\right\}\)
bajo \(\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: Se usa cuando se accede a vectores que representan puntos/normales

vect.rgba: Se usa cuando se accede a vectores que representan colores.

vect.LTRB: Se usa cuando el vector representa un rectángulo (no en GLSL).

En AGSL, se pueden usar 0 y 1 para producir una constante 0 o 1 en ese canal. Ej.: vect.rgb1 == vec4(vect.rgb,1)

Estructuras y arrays

Las estructuras se declaran con la misma sintaxis que GLSL, pero AGSL solo admite de estructuras de seguridad a un alcance global.

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

Solo se admiten arrays unidimensionales con un tamaño de array explícito usando sintaxis de estilo C o GLSL:

<tipo de base>[<array size>] nombre de la variable, p. ej.: half[10] x;

<tipo de base> nombre de la variable[<tamaño del array>] - p. ej.: half x[10];

No se pueden mostrar arrays desde una función, copiarlos, asignarlos o compararlos. Las restricciones de array se propagan a las estructuras que contienen arrays. Los arrays pueden solo pueden indexarse con una constante o una variable de bucle.

Clasificatorios

Tipo Descripción
const Constante de tiempo de compilación o función de solo lectura parámetro.
uniform El valor no cambia en la primitiva mientras se procesan. Los uniformes se pasan desde Android usando RuntimeShader métodos para setColorUniform, setFloatUniform, setIntUniform, setInputBuffer y setInputShader
in Para los parámetros de la función pasados. Es el valor predeterminado.
out Para parámetros de funciones pasadas. Debe usar la misma precisión que la definición de la función.
inout Para los parámetros que se pasan de una función. Se 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 colocado por llave. La declaración de y en el siguiente ejemplo no está permitido:

if (condition)
    int y = 0;

Aspectos básicos de la matriz, la estructura o el array

Ejemplos de constructor de matriz

Cuando se construye una matriz con un solo valor, todos los valores junto la diagonal recibe ese valor, mientras que al resto se le dan ceros. float2x2(1.0) harían lo siguiente crea una matriz de identidad 2x2.

Cuando una matriz se construye con múltiples valores, las columnas se completan primero (orden de columna principal).

Ten en cuenta que, a diferencia de GLSL, los constructores que reducen el número de componentes de un no se admiten, pero puedes usar swizzling para tener la misma 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 la matriz

Accede a los componentes de una matriz con la sintaxis de subíndice del 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 punto .. Entre los operadores, se incluyen los siguientes:

Operador Descripción
. selector de campos
==, != igualdad
= asignación

Elementos de array

Para acceder a los elementos del array, se usa el operador de subíndice del array [ ]. Por ejemplo:

diffuseColor += lightIntensity[3] * NdotL;

Operadores

Numerados en orden de prioridad. Las bases de datos relacionales operadores > < <= >= == != evalúa como un valor booleano. Comparar vectores a nivel de componentes, usa funciones como lessThan(), equal(), etcétera.

Operador Descripción Asociatividad
1 () agrupación entre paréntesis N/A
2 [] () . ++ -- subíndice del array llamada a función y estructura de constructor campo o método selector, swizzle postfijo y disminuir Izquierda a derecha
3 ++ -- + - ! incremento de prefijo disminuir unrio 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 && AND lógico Izquierda a derecha
13 ^^ XOR lógico Izquierda a derecha
14 || OR lógico Izquierda a derecha
15 ?\: selección (una imagen completa operando) Izquierda a derecha
16 = += -= *= /= aritmética de asignaciones aritmética de asignaciones asignación Izquierda a derecha
17 , secuencia Izquierda a derecha

Operaciones de vectores y matrices

Cuando se aplican a valores escalares, los operadores aritméticos dan como resultado un escalar. Para operadores distintos de módulo, si un operando es un escalar y el otro es un vector o matriz, la operación se realiza a nivel de componentes y da como resultado la mismo vector o tipo de matriz. Si ambas operaciones son vectores del mismo tamaño, la se realiza por componentes (y muestra el mismo tipo de vector).

Operación Descripción
m = f * m Multiplicación de matrices por componentes por un valor escalar
v = f * v Multiplicación de vectores por componentes por un valor escalar
v = v * v Multiplicación de vectores por componentes por un valor de vector
m = m + m Suma de componentes de matriz
m = m - m Resta de componentes de la matriz
m = m * m Multiplicación algebraica lineal

Si un operando es un vector que coincide con el tamaño de fila o columna de nuestra matriz, el se puede usar para hacer multiplicaciones algebraicas de filas y columnas.

Operación Descripción
m = v * m Vector de filas × multiplicación algebraica lineal de matriz
m = m * v Matriz * multiplicación algebraica lineal del vector de columna

Usar las funciones integradas para vector punto product, producto cruzado y multiplicación por componentes:

Función Descripción
f = dot(v, v) Vector.producto escalar
v = cross(v, v) Producto cruzado vectorial
m = matrixCompMult(m, m) Multiplicación por componente

Control del programa

Llamada a función Llamada según el valor de retorno
Iteración for (<init>;<test>;<next>)
{ break, continue }
Selección if ( ) { }
if ( ) { } else { }
switch () { break, case } - Primer caso predeterminado
Saltar break, continue, return
(no se permite descartar)
Entrada half4 main(float2 fragCoord)

Para limitaciones de bucle

Similar a GLSL ES 1.0, "for" los bucles son bastante limitados; el compilador debe poder para desenrollar el bucle. Esto significa que el inicializador, la condición de la prueba y el La sentencia next debe usar constantes para que todo se pueda procesar en la compilación tiempo. La sentencia next está aún más limitada al uso de ++, --, +=, or -=.

Funciones integradas

GT (tipo genérico) es float, float2, float3, float4 o half, half2, half3 y half4.

La mayoría de estas funciones operan a nivel de componentes (la función se aplica por componente). Se nota cuando ese no es el caso.

Ángulo 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 dará como resultado un error de división por cero. Si el botón divisor de una proporción es 0, los resultados serán indefinidos.

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) Devuelve un ángulo cuyo seno es x en el rango de $ \left[-{\pi\over 2},{\pi\over 2}\r8] $
GT acos(GT x) Devuelve un ángulo cuyo coseno es x en el rango de $ \left[0,\pi\right] $
GT atan(GT y, GT x) Devuelve un ángulo cuyo arcotangente trigonométrica es $ \left[{y\over x}\right] $ en el rango de $ \left[-\pi,\pi\right] $
GT atan(GT y_over_x) Devuelve un ángulo cuya forma trigonométrica la arcotangente está y_over_x en el rango de $ \left[-{\pi\over 2},{\pi\over 2}\r8] $

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 sobre 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) Devuelve la parte fraccionaria de x
GT mod(GT x, GT y) Devuelve el valor de x módulo y
GT mod(GT x, float y) Devuelve el valor de x módulo y
GT min(GT x, GT y) Devuelve el valor mínimo de x o y.
GT min(GT x, float y) Devuelve el valor mínimo de x o y.
GT max(GT x, GT y) Devuelve el valor máximo de x o y.
GT max(GT x, float y) Devuelve el valor máximo de x o y.
GT clamp(GT x, GT minVal, GT maxVal) Muestra x fijado entre minVal y maxVal.
GT clamp(GT x, float minVal, float maxVal) Muestra x fijado entre minVal y maxVal
GT saturate(GT x) Muestra x fijado entre 0.0 y 1.0
GT mix(GT x, GT y GT a) Devuelve una combinación lineal de x e y
GT mix(GT x, GT y, float a) Devuelve una combinación lineal de x e y
GT step(GT edge, GT x) Muestra 0.0 si x < perímetro, else 1.0
GT step(float edge, GT x) Muestra 0.0 si x < perímetro, else 1.0
GT smoothstep(GT edge0, GT edge1, GT x) Realiza la interpolación Hermite entre 0 y 1 cuando el perímetro 0 sea menor que x < borde1
GT smoothstep(float edge0, float edge1, GT x) Realiza la interpolación Hermite entre 0 y 1 cuando el perímetro 0 sea menor que x < borde1

Funciones geométricas

Estas funciones operan en vectores como vectores, no a nivel de componentes. GT es un vector de número de punto flotante/medios en tamaños 2-4.

Función Descripción
float/half length (GT x) Devuelve la longitud de un vector
float/half distance(GT p0, GT p1) Devuelve la distancia entre puntos
float/half dot(GT x, GT y) Devuelve el producto punto
float3/half3 cross(float3/half3 x, float3/half3 y) Devuelve productos cruzados
GT normalize(GT x) Normalizar vector a longitud 1
GT faceforward(GT N, GT I, GT Nref) Muestra N si punto(Nref, I) < 0, else -N.
GT reflect(GT I, GT N) Dirección de reflexión I: 2 * punto(N,I) * N.
GT refract(GT I, GT N, float/half eta) Muestra 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) Multiplicar x por y a nivel de componentes
mat inverse(mat m) Devuelve el inverso de m

Funciones relacionales de vectores

Compara componentes x e y. Deben coincidir los tamaños de los vectores de entrada y de retorno para una llamada en particular. T es la unión de los tipos de vectores de número entero y 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 < año
BV lessThanEqual(T x, T y) x <= y
BV greaterThan(T x, T y) x > año
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 no multiplicado previamente alfa
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)

Los tipos de Sampler no son compatibles, pero puedes evaluar otros sombreadores. Si necesitas para probar una textura, puedes crear una BitmapShader y agregarlo como archivo. uniforme. Puedes hacer esto para cualquier sombreador, lo que significa que puedes evaluar directamente cualquier sombreador de Android sin convertirlo en Bitmap primero, incluido otro Objetos RuntimeShader. Esto permite gran flexibilidad, pero puede ser costoso de usar sombreadores complejos. evaluar, especialmente 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 se deben administrar, algunas imágenes contienen datos que en realidad no son colores, como imágenes que almacenan normales propiedades de material (por ejemplo, aspereza), mapas de altura u otros atributos exclusivamente datos matemáticos que están almacenados en una imagen. Cuando uses estos tipos de imágenes en AGSL, puedes usar un BitmapShader como un búfer genérico sin procesar usando RuntimeShader#setInputBuffer. Esto evitará transformaciones y filtros de espacio de color.