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.