Krótki przewodnik po AGSL

System AGSL został zaprojektowany pod kątem dużej zgodności z GLSL ES 1.0. Aby dowiedzieć się więcej, funkcji równoważnej w funkcji Dokumentacja języka cieniowania OpenGL ES. W miarę możliwości w tej dokumentacji próbujemy wskazać różnice między AGSL i GLSL.

Typy

AGSL obsługuje typy GLSL ES 1.0 wraz z dodatkowym sposobem przedstawiania wektorów i typach macierzy. AGSL obsługuje dodatkowe typy short i half do reprezentowania ze średnią precyzją.

Podstawowe typy

Typ Opis
void Funkcja nie zwraca wartości lub pusty parametr z listy. W przeciwieństwie do GLSL funkcje bez znaku pustego zwracany typ musi zwracać wartość.
bool, bvec2, bvec3, bvec4
(bool2, bool3, bool4)
skalarny/wektor logiczny
int, ivec2, ivec3, ivec4
(int2, int3, int4)
Liczba całkowita/wektorowa ze znakiem highp
float, vec2, vec3, vec4
(float2, float3, float4)
highp (pojedyncza precyzja) zmiennoprzecinkowa skalarny/wektor
short, short2, short3, short4 odpowiednik mediump int podpisany liczba całkowita/wektor
half, half2, half3, half4 odpowiednik funkcji skalarnej/wektorowej funkcji mediump float
mat2, mat3, mat4
(float2x2, float3x3, float4x4)
2 x 2, 3 x 3, 4 x 4 float, macierz
half2x2, half3x3, half4x4 Odpowiednik mediump float typów macierzy

Minimalne wartości dokładności i zakresu

To minimalna gwarantowana precyzja i zakres powiązane z każdym na podstawie specyfikacji OpenGL ES 2.0. Większość urządzeń obsługują ES 3.0, będą miały większą gwarantowaną precyzję/zakres highp Zakres: int mediump. Modyfikatory precyzji można stosować do wartości skalarnych, wektorowych i zmiennych i parametrów macierzy. Gwarantowane są wyłącznie wartości minimalne wymienione poniżej. Wartość lowp nie musi być mniejsza od precyzji niż mediump i mediump nie musi być mniejszy niż highp. AGSL obecnie konwertuje: lowp na mediump w ostatecznej postaci.

Modyfikator „float” zakres „float” zakres wielkości „float” precyzja „int” zakres
Highp \(\left\{-2^{62},2^{62}\right\}\) \(\left\{2^{-62},2^{62}\right\}\) Krewny: \(2^{-16}\) \(\left\{-2^{16},2^{16}\right\}\)
średni \(\left\{-2^{14},2^{14}\right\}\) \(\left\{2^{-14},2^{14}\right\}\) Krewny: \(2^{-10}\) \(\left\{-2^{10},2^{10}\right\}\)
Lowp \(\left\{-2,2\right\}\) \(\left\{2^{-8},2\right\}\) Wartość bezwzględna: \(2^{-8}\) \(\left\{-2^{8},2^{8}\right\}\)

Oprócz składni liczbowej w indeksie dolnym, np. 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 – użyj w przypadku uzyskiwania dostępu do wektorów reprezentujących punkty/normalne

vect.rgba – użyj w przypadku dostępu do wektorów reprezentujących kolory.

vect.LTRB – użyj, gdy wektor reprezentuje prostokąt (nie w języku GLSL)

W AGSL przy użyciu 0 i 1 można uzyskać w tym kanale stałą wartość 0 lub 1. Np. vect.rgb1 == vec4(vect.rgb,1)

Struktury i tablice

Struktury są deklarowane z tą samą składnią co GLSL, ale AGSL obsługuje tylko w zakresie globalnym.

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

Tylko jednowymiarowe tablice są obsługiwane z wyraźnym rozmiarem tablicy przy użyciu składnię stylu C lub GLSL:

<typ podstawowy>[<rozmiar tablicy>] nazwa zmiennej, np. half[10] x;

<typ podstawowy> nazwa zmiennej [<rozmiar tablicy>] – np. half x[10];

Tablice nie mogą być zwracane przez funkcję, kopiowane, przypisane ani porównywane. Ograniczenia tablic są rozpowszechnione w strukturach zawierających tablice. Tablice mogą mogą być indeksowane tylko za pomocą zmiennej stałej lub pętli.

Eliminacje

Typ Opis
const stała czasu kompilacji lub funkcja tylko do odczytu, .
uniform Wartość nie zmienia się w elemencie podstawowym w trakcie przetwarzania danych. Mundury są przekazywane z Androida za pomocą atrybutu RuntimeShader metody dla: setColorUniform, setFloatUniform, setIntUniform, setInputBuffer i setInputShader
in Dla przekazywanych parametrów funkcji. To jest wartość domyślną.
out Dla przekazywanych parametrów funkcji. Musi używać takiej samej precyzji jak definicja funkcji.
inout Parametry, które są przekazywane i wychodzące funkcji. Musi mieć taką samą dokładność jak definicji funkcji.

Deklaracja zmiennej

Deklaracje muszą mieć jawny zakres rozszerzony. Deklaracja y w ten przykład jest niedozwolony:

if (condition)
    int y = 0;

Podstawy macierzy, struktury i tablicy

Przykłady konstruktora macierzy

Gdy tworzona jest macierz z jedną wartością, wszystkie wartości tę wartość otrzyma przekątna, a pozostałe – zera. float2x2(1.0) będzie W ten sposób utworzymy macierz tożsamości 2 x 2.

Jeśli tworzona jest macierz z wieloma wartościami, najpierw kolumny są wypełniane. (kolejność według kolumn).

Warto zauważyć, że w przeciwieństwie do GLSL konstruktory, które zmniejszają liczbę komponentów nie są obsługiwane, ale można użyć przesuwania, aby uzyskać taki sam efektu. Aby utworzyć vec3 na podstawie vec4 w argumencie AGSL o takim samym zachowaniu jak GLSL, podaj vec3 nv = quadVec.xyz.

Przykład konstruktora struktur

struct light { float intensity; float3 pos; };
// literal integer constants auto-converted to floating point
light lightVar = light(3, float3(1, 2, 3.0));

Komponenty macierzy

Uzyskaj dostęp do komponentów macierzy za pomocą składni dolnej skryptu.

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

Uporządkuj pola

Wybierz strukturę pól za pomocą operatora kropki .. Dostępne operatory:

Operator Opis
. wybór pola
==, != równość
= przypisanie udziału w konwersji

Elementy tablicy

Dostęp do elementów tablicy uzyskuje się za pomocą operatora indeksu dolnego tablicy [ ]. Na przykład:

diffuseColor += lightIntensity[3] * NdotL;

Operatorzy

Są numerowane według pierwszeństwa. Relacja i równość operatory > < <= >= == != zwraca wartość logiczną. Aby porównać wektory na komponentach, używaj funkcji takich jak lessThan(), equal() itp.

Operator Opis Powiązanie
1 () grupowanie w nawiasach Nie dotyczy
2 [] () . ++ -- indeks dolny tablicy wywołanie funkcji & struktura konstruktora pole lub metoda selektor, zawijas przyrost wartości i zmniejsz Od lewej do prawej
3 ++ -- + - ! przyrost prefiksu i zmniejsz jednoargumentowy Od prawej do lewej
4 * / pomnóż i podziel Od lewej do prawej
5 + - dodaj i odejmij Od lewej do prawej
7 < > <= >= relacyjne Od lewej do prawej
8 == != równość/nierówność Od lewej do prawej
12 && logiczny ORAZ Od lewej do prawej
13 ^^ logiczna XOR Od lewej do prawej
14 || operator logiczny LUB Od lewej do prawej
15 ?\: zaznaczenie (cały operand) Od lewej do prawej
16 = += -= *= /= arytmetyka przydziału arytmetyka przydziału przypisanie udziału w konwersji Od lewej do prawej
17 , sequence Od lewej do prawej

Operacje macierzy i wektorowe

W przypadku zastosowania do wartości skalarnych operatory arytmetyczne dają wartość skalarną. Dla: innych niż modulo, jeśli jeden z operandów jest skalarny, a drugi jest wektor lub macierz, operacja jest wykonywana składowo i daje wynik taki sam typ wektora lub macierzy. Jeśli obie operacje są wektorami o tym samym rozmiarze, jest wykonywana komponentowo (i zwraca ten sam typ wektora).

Operacja Opis
m = f * m Mnożenie macierzy według komponentów przez wartość skalarną
v = f * v Mnożenie wektorów według komponentów przez wartość skalarną
v = v * v Mnożenie wektorów według komponentów przez wartość wektora
m = m + m Dodawanie macierzy na podstawie komponentów
m = m - m Odejmowanie składowe macierzy
m = m * m Liniowy mnożenie algebraiczne

Jeśli jeden operand jest wektorem pasującym do rozmiaru wiersza lub kolumny naszej macierzy, operatora mnożenia można użyć do algebraicznego mnożenia wierszy i kolumn.

Operacja Opis
m = v * m Wektor wiersza * algebraiczny mnożenie liniowej macierzy
m = m * v Matryca * wektor kolumnowy algebraiczny mnożenie algebraiczne

korzystać z wbudowanych funkcji iloczynu skalarnego wektorowego, iloczynu krzyżowego oraz mnożenie komponentowe:

Funkcja Opis
f = dot(v, v) Iloczyn skalarny wektorowy
v = cross(v, v) Iloczyn wektorowy wektorowy
m = matrixCompMult(m, m) Mnożenie przez komponent

Sterowanie programem

Wywołanie funkcji Wywoływanie wg zwrotu
Iteracja for (<init>;<test>;<next>)
{ break, continue }
Zaznaczenie if ( ) { }
if ( ) { } else { }
switch () { break, case } – domyślne wielkość liter jako ostatni
Jump break, continue, return
(odrzucenie jest niedozwolone)
Wpis half4 main(float2 fragCoord)

Ograniczenia pętli

Podobne do GLSL ES 1.0, „for” pętle są dość ograniczone, kompilator musi mieć możliwość aby rozwinąć pętlę. Oznacza to, że inicjator, warunek testowy oraz Instrukcja next musi zawierać stałe, aby wszystko można było obliczyć podczas kompilacji obecnie się znajdujesz. Instrukcja next ogranicza się dodatkowo do użycia ++, --, +=, or -=.

Wbudowane funkcje

GT (typ ogólny) to float, float2, float3, float4 lub half, half2, half3, half4.

Większość z tych funkcji działa na podstawie komponentów (funkcja jest stosowana na komponent). W przeciwnym razie jest ono zaznaczone.

Kąt i funkcje trygonometryczne

Parametry funkcji określone jako kąt przyjmuje się w jednostkach w radianach. W żadnym przypadku żadna z tych funkcji nie spowoduje błędu dzielenia przez zero. Jeśli dzielnik współczynnika wynosi 0, wyniki będą nieokreślone.

Funkcja Opis
GT radians(GT degrees) Konwertuje stopnie na radiany
GT degrees(GT radians) Konwertuje radiany na stopnie
GT sin(GT angle) Standardowy sinus
GT cos(GT angle) Standardowy cosinus
GT tan(GT angle) Tangens standardowy
GT asin(GT x) Zwraca kąt, którego sinus znajduje się w zakresie x z $ \left[-{\pi\over 2},{\pi\over 2}\right] $
GT acos(GT x) Zwraca kąt, którego cosinus wynosi x w punkcie x zakres $ \left[0,\pi\right] $
GT atan(GT y, GT x) Zwraca kąt, którego arcus tangens trygonometryczny czy $ \left[{y\over x}\right] $ w zakres $ \left[-\pi,\pi\right] $
GT atan(GT y_over_x) Zwraca kąt, którego kąt trygonometryczny arcus tangens znajduje się y_over_x w zakresie z $ \left[-{\pi\over 2},{\pi\over 2}\right] $

Funkcje wykładnicze

Funkcja Opis
GT pow(GT x, GT y) Zwraca $ x^y $
GT exp(GT x) Zwraca $ e^x $
GT log(GT x) Zwraca $ ln(x) $
GT exp2(GT x) Zwraca $ 2^x $
GT log2(GT x) Zwraca $ log_2(x) $
GT sqrt(GT x) Zwraca $ \sqrt{x} $
GT inversesqrt(GT x) Zwraca $ 1\over{\sqrt{x}} $

Typowe funkcje

Funkcja Opis
GT abs(GT x) Wartość bezwzględna
GT sign(GT x) Zwraca -1,0, 0,0 lub 1,0 w oparciu o znak x
GT floor(GT x) Najbliższa liczba całkowita <= x
GT ceil(GT x) Najbliższa liczba całkowita >= x
GT fract(GT x) Zwraca część ułamkową liczby x
GT mod(GT x, GT y) Zwraca wartość x modulo y
GT mod(GT x, float y) Zwraca wartość x modulo y
GT min(GT x, GT y) Zwraca minimalną wartość x lub y
GT min(GT x, float y) Zwraca minimalną wartość x lub y
GT max(GT x, GT y) Zwraca maksymalną wartość x lub y
GT max(GT x, float y) Zwraca maksymalną wartość x lub y
GT clamp(GT x, GT minVal, GT maxVal) Zwraca wartość x z zakresu od wartości minVal i maxVal.
GT clamp(GT x, float minVal, float maxVal) Zwraca wartość x z ograniczeniem wartości minVal i maxVal
GT saturate(GT x) Zwraca wartość x z zakresu od 0,0 do 1,0
GT mix(GT x, GT y GT a) Zwraca liniową mieszankę wartości x i y
GT mix(GT x, GT y, float a) Zwraca liniową mieszankę wartości x i y
GT step(GT edge, GT x) Zwraca 0,0, jeśli x < Edge, w przeciwnym razie 1.0
GT step(float edge, GT x) Zwraca 0,0, jeśli x < Edge, w przeciwnym razie 1.0
GT smoothstep(GT edge0, GT edge1, GT x) Wykonuje interpolację Hermite od 0 do 1, gdy krawędź0 < x < Edge1
GT smoothstep(float edge0, float edge1, GT x) Wykonuje interpolację Hermite od 0 do 1, gdy krawędź0 < x < Edge1

Funkcje geometryczne

Te funkcje działają na wektorach jako wektorach, a nie jako składowe. GT to wektory zmiennoprzecinkowe/połowa wektorów o rozmiarach 2–4.

Funkcja Opis
float/half length (GT x) Zwraca długość wektora
float/half distance(GT p0, GT p1) Zwraca odległość między punktami
float/half dot(GT x, GT y) Zwraca iloczyn skalarny
float3/half3 cross(float3/half3 x, float3/half3 y) Zwraca iloczyn
GT normalize(GT x) Normalizuj wektor do długości 1
GT faceforward(GT N, GT I, GT Nref) Zwraca N, jeśli kropka(Nref; I) < 0, w przeciwnym razie -N.
GT reflect(GT I, GT N) Kierunek odbicia I – 2 * kropka(N,I) * N
GT refract(GT I, GT N, float/half eta) Zwraca wektor załamania

Funkcje macierzy

Typ matryca to dowolny typ macierzy kwadratowej.

Funkcja Opis
mat matrixCompMult(mat x, mat y) Pomnóż x przez y według składowej
mat inverse(mat m) Zwraca odwrotność m

Funkcje relacyjne wektorowe

Porównaj wartości x i y pod kątem komponentów. Rozmiary wektorów wejściowych i zwrotnych muszą być takie same w przypadku danego wywołania. Argument T to suma typów wektorów liczb całkowitych i zmiennoprzecinkowych. BV to wektor logiczny, który odpowiada rozmiarowi wektorów wejściowych.

Funkcja Opis
BV lessThan(T x, T y) x < lat
BV lessThanEqual(T x, T y) x <= y
BV greaterThan(T x, T y) x > lat:
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, jeśli dowolny składnik x jest true
bool all(BV x) true, jeśli wszystkie składniki x mają wartość true.
BV not(BV x) dopełnienie logiczne x

Funkcje kolorów

Funkcja Opis
vec4 unpremul(vec4 color) Konwertuje wartość koloru na niepomnożoną wstępnie alfa
half3 toLinearSrgb(half3 color) Przekształcenie przestrzeni kolorów na liniowy SRGB
half3 fromLinearSrgb(half3 color) Przekształcenie przestrzeni kolorów

Próbkowanie cieni (ocena)

Typy próbek nie są obsługiwane, ale możesz sprawdzić inne moduły do cieniowania. Jeśli potrzebujesz aby próbkować teksturę, możesz utworzyć BitmapShader i dodaj go jako uniform. Możesz to zrobić dla dowolnego cieniowania, co oznacza, że możesz bezpośrednio oceniać, na Androida Shadera bez przekształcania go w Najpierw bitmapa, włącznie z innymi Obiekty RuntimeShader. Dzięki temu ze względu na dużą elastyczność, ale złożone modele do cieniowania mogą być kosztowne zwłaszcza w pętli.

uniform shader image;

image.eval(coord).a   // The alpha channel from the evaluated image shader

Próbkowanie nieprzetworzonego bufora

Chociaż większość obrazów zawiera kolory, którymi należy zarządzać, niektóre obrazy zawierają dane, które nie są w rzeczywistości kolorystyczne, w tym obrazy zawierające wartości oznaczające normalność, właściwości materiałowe (np. chropowatość), mapy wysokości lub inne zapisane w obrazie dane matematyczne. W przypadku korzystania z tego rodzaju w języku migowym, możesz użyć BitmapShader jako ogólnego bufora, używając RuntimeShader#setInputBuffer. Pozwoli to uniknąć przekształcania przestrzeni kolorów i filtrowania.