Diferencias entre AGSL y GLSL

AGSL y GLSL tienen una sintaxis muy similar, lo que permite que muchos sombreadores de fragmentos GLSL que se incorporan a Android con mínimos cambios. AGSL corrige su GLSL de atributos configurada en GLSL ES 1.0 (el lenguaje de sombreado que usa OpenGL ES 2.0) para que brindan el máximo alcance de dispositivos.

Un sombreador de fragmentos GLSL controla todo el comportamiento de la GPU entre las el rasterizador y el hardware de combinación. Ese sombreador hace todo el trabajo para calcular y el color que genera es exactamente lo que se agrega a la etapa de mezcla de la canalización. Cuando escribes un sombreador en AGSL, estás programando una etapa del la canalización de gráficos de Android. Muchas de las diferencias lingüísticas derivan de esto.

Ejecución del sombreador

Al igual que en un sombreador GLSL, un sombreador AGSL comienza la ejecución en una función principal. A diferencia de GLSL, la función toma la posición del sombreador en "local" coordenadas como un parámetro. Es similar a gl_FragCoord, pero en lugar del búfer de fotogramas coordenadas, es posible que se hayan traducido antes de llamar a tu sombreador. Luego, el sombreador muestra el color de píxel como una vec4 en medio o y alta precisión (similar a out vec4 color o gl_FragColor en GLSL)

mediump vec4 main(in vec2 fragCoord)

Espacio de coordenadas

Espacios de coordenadas GLSL frente a AGSL

Sombreador dibujado con GLSL frente a sombreador casi idéntico dibujado con AGSL

AGSL y GLSL usan diferentes espacios de coordenadas de forma predeterminada. En GLSL, el fragmento (fragCoord) se relaciona con la parte inferior izquierda. AGSL coincide con la pantalla sistema de coordenadas de Canvas, lo que significa que el eje Y comienza en la esquina superior izquierda. Si es necesario, puedes convertir entre estos dos espacios pasando la resolución como un y usar resolution.y - fragCoord.y para el valor del eje Y. Como alternativa, puedes aplicar una matriz de transformación local a tu sombreador.

// AGSL to GLSL coordinate space transformation matrix
val localMatrix = Matrix()
localMatrix.postScale(1.0f, -1.0f)
localMatrix.postTranslate(0.0f, viewHeight)
gridShader.setLocalMatrix(localMatrix)

Precisión y tipos

Se admiten modificadores de precisión compatibles con GLSL, pero AGSL introduce Los tipos half y short, que también representan la precisión media.

Los tipos de vectores se pueden declarar como <base type><columns>. Puedes usar float2 en lugar de vec2 y bool4 en lugar de bvec4. Los tipos de matriz se pueden declarar como <base type><columns>x<rows>, por lo que float3x3 en lugar de mat3. AGSL también permite declaraciones de estilo GLSL para mat y vec, y estos tipos se asignan a su número de punto flotante equivalentes.

Preprocesador

AGSL no admite el estilo GLSL preprocesador directivas. Convierte las sentencias #define en variables const. Compilador de AGSL admite el plegado constante y la eliminación de ramas para variables const, así que estas serán eficientes.

Espacios de color

Las aplicaciones para Android se administran en color. El espacio de color de un lienzo determina el espacio de color de trabajo para dibujar. Fuente de contenido (como sombreadores, incluido BitmapShader). también tienen espacios de color.

Para ciertos efectos, como una iluminación física precisa, se deben realizar los cálculos. en un espacio de color lineal. Para ayudar con esto, AGSL proporciona estas funciones funciones:

half3 toLinearSrgb(half3 color)
half3 fromLinearSrgb(half3 color)

Estos convierten los colores entre el espacio de trabajo de trabajo y el de Android LINEAR_EXTENDED_SRGB espacio de color. Ese espacio usa colores primarios sRGB (gamut) y una de transferencia de datos. Representa valores fuera del gamut sRGB valores de rangos (inferiores a 0.0 y superiores a 1.0).

Uniformes

Debido a que AGSL no sabe si los uniformes contienen colores, no se aplicará automáticamente una conversión de color. Puedes etiquetar half4/float4/vec4 con layout(color), que le permite a Android saber que el uniforme se usará como color, lo que permite que Android transforme el valor uniforme en el color de trabajo. espacio.

En AGSL, declara el uniforme de la siguiente manera:

layout(color) uniform half4 iColor;  // Input color
uniform float2 iResolution;          // Viewport resolution (pixels)

En el código de Android, puedes configurar el uniforme de la siguiente manera:

shader.setColorUniform("iColor", Color.GREEN)
shader.setFloatUniform("iResolution", canvas.width.toFloat(), canvas.height.toFloat())