AGSL спроектирован так, чтобы быть в значительной степени совместимым с GLSL ES 1.0. Дополнительную информацию см. в эквивалентной функции в документации OpenGL ES Shading Language . Когда это возможно, в этой документации делается попытка выявить различия между AGSL и GLSL.
Типы
AGSL поддерживает типы GLSL ES 1.0, а также дополнительный способ представления векторных и матричных типов. AGSL поддерживает дополнительные short
и half
типы для обеспечения средней точности.
Основные типы
Тип | Описание |
---|---|
void | Нет возвращаемого значения функции или пустой список параметров. В отличие от GLSL, функции без возвращаемого типа void должны возвращать значение. |
bool, bvec2, bvec3, bvec4 (bool2, bool3, bool4) . | Булев скаляр/вектор |
int, ivec2, ivec3, ivec4 (int2, int3, int4) | целое число/вектор со знаком highp |
float, vec2, vec3, vec4 (float2, float3, float4) | highp (одинарная точность) скаляр/вектор с плавающей запятой |
short, short2, short3, short4 | эквивалентно mediump int целое/векторное число со знаком |
half, half2, half3, half4 | эквивалентно скаляру/вектору mediump float |
mat2, mat3, mat4 (float2x2, float3x3, float4x4) | float матрица 2x2, 3x3, 4x4 |
half2x2, half3x3, half4x4 | Эквивалентно типам матриц mediump float |
Минимумы точности и дальности
Это минимальная гарантированная точность и диапазон, связанные с каждым модификатором, на основе спецификации OpenGL ES 2.0. Поскольку большинство устройств поддерживают ES 3.0, они будут иметь более гарантированную highp
точность/диапазон и int mediump
диапазон. Модификаторы точности можно применять к скалярным, векторным и матричным переменным и параметрам. Гарантируются только минимальные значения, перечисленные ниже; lowp
не обязательно имеет более низкую точность, чем mediump
, а mediump
не обязательно имеет более низкую точность, чем highp
. AGSL в настоящее время конвертирует lowp
в mediump
в конечном результате.
Модификатор | «плавающий» диапазон | «плавающий» диапазон магнитуд | «плавающая» точность | 'целый' диапазон |
---|---|---|---|---|
высокий уровень | \(\left\{-2^{62},2^{62}\right\}\) | \(\left\{2^{-62},2^{62}\right\}\) | Родственник: \(2^{-16}\) | \(\left\{-2^{16},2^{16}\right\}\) |
средний уровень | \(\left\{-2^{14},2^{14}\right\}\) | \(\left\{2^{-14},2^{14}\right\}\) | Родственник: \(2^{-10}\) | \(\left\{-2^{10},2^{10}\right\}\) |
лоуп | \(\left\{-2,2\right\}\) | \(\left\{2^{-8},2\right\}\) | Абсолютный: \(2^{-8}\) | \(\left\{-2^{8},2^{8}\right\}\) |
В дополнение к синтаксису числовых индексов массива, например: 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
— используется при доступе к векторам, представляющим точки/нормали.
vect.rgba
— используется при доступе к векторам, представляющим цвета.
vect.LTRB
— используйте, когда вектор представляет прямоугольник (не в GLSL).
В AGSL 0 и 1 могут использоваться для создания константы 0 или 1 в этом канале. Пример: vect.rgb1 == vec4(vect.rgb,1)
Структуры и массивы
Структуры объявляются с тем же синтаксисом, что и GLSL, но AGSL поддерживает структуры только в глобальной области видимости.
struct type-name {
members
} struct-name; // optional variable declaration.
Поддерживаются только одномерные массивы с явным указанием размера массива с использованием синтаксиса в стиле C или GLSL:
<базовый тип>[<размер массива>] имя переменной - например: half[10] x;
<базовый тип> имя переменной[<размер массива>] - например: half x[10];
Массивы не могут быть возвращены из функции, скопированы, присвоены или сравнены. Ограничения массивов распространяются на структуры, содержащие массивы. Массивы можно индексировать только с использованием константы или переменной цикла.
Квалификации
Тип | Описание |
---|---|
const | Константа времени компиляции или параметр функции, доступный только для чтения. |
uniform | Значение не меняется в пределах обрабатываемого примитива. Униформы передаются из Android с помощью методов RuntimeShader для setColorUniform , setFloatUniform , setIntUniform , setInputBuffer и setInputShader . |
in | Для передаваемых параметров функции. Это значение по умолчанию. |
out | Для переданных параметров функции. Должна использоваться та же точность, что и в определении функции. |
inout | Для параметров, которые передаются в функцию и из нее. Должна использоваться та же точность, что и в определении функции. |
Объявление переменной
Объявления должны находиться в явной области видимости. Объявление y
в следующем примере запрещено:
if (condition)
int y = 0;
Основы матрицы/структуры/массива
Примеры конструкторов матриц
Когда матрица строится с одним значением, всем значениям по диагонали присваивается это значение, а остальным — нули. Таким образом, float2x2(1.0)
создаст единичную матрицу 2x2.
Если матрица построена с несколькими значениями, сначала заполняются столбцы (порядок по столбцам).
Обратите внимание: в отличие от GLSL, конструкторы, уменьшающие количество компонентов передаваемого вектора, не поддерживаются, но вы можете использовать swizzling для достижения того же эффекта. Чтобы создать vec3
из vec4
в AGSL с тем же поведением, что и GLSL, укажите vec3 nv = quadVec.xyz
.
Пример конструктора структуры
struct light { float intensity; float3 pos; };
// literal integer constants auto-converted to floating point
light lightVar = light(3, float3(1, 2, 3.0));
Компоненты матрицы
Доступ к компонентам матрицы с помощью синтаксиса индексации массива.
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
Поля структуры
Выберите поля структуры, используя точку .
оператор. В число операторов входят:
Оператор | Описание |
---|---|
. | селектор полей |
==, != | равенство |
= | назначение |
Элементы массива
Доступ к элементам массива осуществляется с помощью оператора индекса массива [ ]
. Например:
diffuseColor += lightIntensity[3] * NdotL;
Операторы
Нумеруются в порядке старшинства. Операторы отношения и равенства > < <= >= == != возвращают логическое значение. Для сравнения векторов покомпонентно используйте такие функции, как lessThan()
, equal()
и т. д.
Оператор | Описание | Ассоциативность | |
---|---|---|---|
1 | () | группировка в скобках | Н/Д |
2 | [] () . ++ -- | вызов функции индекса массива и поле структуры конструктора или селектор метода, увеличение и уменьшение постфикса swizzle | Слева направо |
3 | ++ -- + - ! | увеличение и уменьшение префикса унарное | Справа налево |
4 | * / | умножать и делить | Слева направо |
5 | + - | добавить и вычесть | Слева направо |
7 | < > <= >= | реляционный | Слева направо |
8 | == != | равенство/неравенство | Слева направо |
12 | && | логическое И | Слева направо |
13 | ^^ | логическое исключающее ИЛИ | Слева направо |
14 | || | логическое ИЛИ | Слева направо |
15 | ?\: | выбор (один целый операнд) | Слева направо |
16 | = += -= *= /= | арифметика присваивания арифметика присваивания | Слева направо |
17 | , | последовательность | Слева направо |
Матричные и векторные операции
При применении к скалярным значениям арифметические операторы приводят к скалярному значению. Для операторов, отличных от модуля по модулю, если один операнд является скаляром, а другой — вектором или матрицей, операция выполняется покомпонентно и приводит к тому же типу вектора или матрицы. Если обе операции являются векторами одного и того же размера, операция выполняется покомпонентно (и возвращает один и тот же тип вектора).
Операция | Описание |
---|---|
m = f * m | Покомпонентное умножение матрицы на скалярное значение |
v = f * v | Покомпонентное векторное умножение на скалярное значение |
v = v * v | Покомпонентное векторное умножение на векторное значение |
m = m + m | Покомпонентное сложение матрицы |
m = m - m | Матричное покомпонентное вычитание |
m = m * m | Линейное алгебраическое умножение |
Если один операнд представляет собой вектор, соответствующий размеру строки или столбца нашей матрицы, оператор умножения можно использовать для алгебраического умножения строк и столбцов.
Операция | Описание |
---|---|
m = v * m | Вектор-строка * матрица, линейное алгебраическое умножение |
m = m * v | Матрица * вектор-столбец, линейное алгебраическое умножение |
Используйте встроенные функции для скалярного произведения векторов, векторного произведения и покомпонентного умножения:
Функция | Описание |
---|---|
f = dot(v, v) | Скалярное произведение вектора |
v = cross(v, v) | Векторное векторное произведение |
m = matrixCompMult(m, m) | Покомпонентное умножение |
Программное управление
Вызов функции | Вызов по возвращаемому значению |
---|---|
Итерация | for (<init>;<test>;<next>) { break, continue } |
Выбор | if ( ) { } if ( ) { } else { } switch () { break, case } — регистр по умолчанию последний |
Прыжок | break, continue, return (выбрасывать нельзя) |
Вход | half4 main(float2 fragCoord) |
Для ограничений цикла
Как и в GLSL ES 1.0, циклы for весьма ограничены; компилятор должен иметь возможность развернуть цикл. Это означает, что инициализатор, условие проверки и next
оператор должны использовать константы, чтобы все можно было вычислить во время компиляции. next
оператор дополнительно ограничен использованием ++, --, +=, or -=
.
Встроенные функции
GT
(общий тип) — это float
, float2
, float3
, float4
или half
, half2
, half3
, half4
.
Большинство этих функций работают покомпонентно (функция применяется для каждого компонента). Это отмечается, когда это не так.
Угловые и тригонометрические функции
Предполагается, что параметры функции, заданные как угол, выражаются в радианах. Ни в коем случае ни одна из этих функций не приведет к ошибке деления на ноль. Если делитель отношения равен 0, то результаты будут неопределенными.
Функция | Описание |
---|---|
GT radians(GT degrees) | Преобразует градусы в радианы |
GT degrees(GT radians) | Преобразует радианы в градусы |
GT sin(GT angle) | Стандартный синус |
GT cos(GT angle) | Стандартный косинус |
GT tan(GT angle) | Стандартная касательная |
GT asin(GT x) | Возвращает угол, синус которого равен x, в диапазоне $ \left[-{\pi\over 2},{\pi\over 2}\right] $ |
GT acos(GT x) | Возвращает угол, косинус которого равен x, в диапазоне $ \left[0,\pi\right] $ |
GT atan(GT y, GT x) | Возвращает угол, тригонометрический арктангенс которого равен $ \left[{y\over x}\right] $ в диапазоне $ \left[-\pi,\pi\right] $ |
GT atan(GT y_over_x) | Возвращает угол, тригонометрический арктангенс которого равен y_over_x в диапазоне $ \left[-{\pi\over 2},{\pi\over 2}\right] $ |
Экспоненциальные функции
Функция | Описание |
---|---|
GT pow(GT x, GT y) | Возвращает $ x^y $ |
GT exp(GT x) | Возвращает $ е^х $ |
GT log(GT x) | Возвращает $ ln(x) $ |
GT exp2(GT x) | Возвращает $ 2^x $ |
GT log2(GT x) | Возвращает $ log_2(x) $ |
GT sqrt(GT x) | Возвращает $ \sqrt{x} $ |
GT inversesqrt(GT x) | Возвращает $ 1\over{\sqrt{x}} $ |
Общие функции
Функция | Описание |
---|---|
GT abs(GT x) | Абсолютное значение |
GT sign(GT x) | Возвращает -1,0, 0,0 или 1,0 в зависимости от знака x. |
GT floor(GT x) | Ближайшее целое число <= x |
GT ceil(GT x) | Ближайшее целое число >= x |
GT fract(GT x) | Возвращает дробную часть x |
GT mod(GT x, GT y) | Возвращает значение x по модулю y |
GT mod(GT x, float y) | Возвращает значение x по модулю y |
GT min(GT x, GT y) | Возвращает минимальное значение x или y |
GT min(GT x, float y) | Возвращает минимальное значение x или y |
GT max(GT x, GT y) | Возвращает максимальное значение x или y |
GT max(GT x, float y) | Возвращает максимальное значение x или y |
GT clamp(GT x, GT minVal, GT maxVal) | Возвращает x, зажатый между minVal и maxVal. |
GT clamp(GT x, float minVal, float maxVal) | Возвращает x, зажатый между minVal и maxVal. |
GT saturate(GT x) | Возвращает x, ограниченное между 0,0 и 1,0. |
GT mix(GT x, GT y GT a) | Возвращает линейную смесь x и y |
GT mix(GT x, GT y, float a) | Возвращает линейную смесь x и y |
GT step(GT edge, GT x) | Возвращает 0,0, если x < ребро, иначе 1,0 |
GT step(float edge, GT x) | Возвращает 0,0, если x < ребро, иначе 1,0 |
GT smoothstep(GT edge0, GT edge1, GT x) | Выполняет интерполяцию Эрмита между 0 и 1, когда край0 < x < край1 |
GT smoothstep(float edge0, float edge1, GT x) | Выполняет интерполяцию Эрмита между 0 и 1, когда край0 < x < край1 |
Геометрические функции
Эти функции работают с векторами как с векторами, а не покомпонентно. GT — это векторы с плавающей запятой/полувекторы размеров 2–4.
Функция | Описание |
---|---|
float/half length (GT x) | Возвращает длину вектора |
float/half distance(GT p0, GT p1) | Возвращает расстояние между точками |
float/half dot(GT x, GT y) | Возвращает скалярное произведение |
крест float3/half3 cross(float3/half3 x, float3/half3 y) | Возвращает перекрестное произведение |
GT normalize(GT x) | Нормализовать вектор до длины 1 |
GT faceforward(GT N, GT I, GT Nref) | Возвращает N, если точка(Nref, I) < 0, иначе -N. |
GT reflect(GT I, GT N) | Направление отражения I - 2 * точка(N,I) * N. |
GT refract(GT I, GT N, float/half eta) | Возвращает вектор преломления |
Матричные функции
Тип mat — любой тип квадратной матрицы.
Функция | Описание |
---|---|
mat matrixCompMult(mat x, mat y) | Умножить x на y покомпонентно |
mat inverse(mat m) | Возвращает обратное значение m |
Векторные реляционные функции
Сравните x и y покомпонентно. Размеры векторов ввода и возврата для конкретного вызова должны совпадать. T — это объединение векторных типов целых чисел и с плавающей запятой. BV — это логический вектор, соответствующий размеру входных векторов.
Функция | Описание |
---|---|
BV lessThan(T x, T y) | х < у |
BV lessThanEqual(T x, T y) | х <= у |
BV greaterThan(T x, T y) | х > у |
BV greaterThanEqual(T x, T y) | х >= у |
BV equal(T x, T y) | х == у |
BV equal(BV x, BV y) | х == у |
BV notEqual(T x, T y) | х != у |
BV notEqual(BV x, BV y) | х != у |
bool any(BV x) | true , если какой-либо компонент x true |
bool all(BV x) | true , если все компоненты x true . |
BV not(BV x) | логическое дополнение x |
Функции цвета
Функция | Описание |
---|---|
vec4 unpremul(vec4 color) | Преобразует значение цвета в альфа без предварительного умножения |
half3 toLinearSrgb(half3 color) | Преобразование цветового пространства в линейное SRGB |
half3 fromLinearSrgb(half3 color) | Преобразование цветового пространства |
Выборка шейдеров (оценка)
Типы сэмплеров не поддерживаются, но вы можете оценить другие шейдеры. Если вам нужно получить образец текстуры, вы можете создать объект BitmapShader и добавить его как юниформ. Вы можете сделать это для любого шейдера, что означает, что вы можете напрямую оценить любой шейдер Android, не превращая его предварительно в растровое изображение , включая другие объекты RuntimeShader . Это обеспечивает огромную гибкость, но оценка сложных шейдеров может оказаться дорогостоящей, особенно в цикле.
uniform shader image;
image.eval(coord).a // The alpha channel from the evaluated image shader
Необработанная выборка буфера
Хотя большинство изображений содержат цвета, которые должны управляться цветом, некоторые изображения содержат данные, которые на самом деле не являются цветами, включая изображения, хранящие нормали, свойства материала (например, шероховатость), карты высот или любые другие чисто математические данные, которые хранятся в изображение. При использовании изображений такого типа в AGSL вы можете использовать BitmapShader в качестве общего необработанного буфера, используя RuntimeShader#setInputBuffer . Это позволит избежать преобразований и фильтрации цветового пространства.