Referensi Cepat AGSL

AGSL dirancang agar kompatibel dengan GLSL ES 1.0. Untuk informasi selengkapnya, lihat fungsi yang setara dalam dokumentasi OpenGL ES Shading Language. Jika memungkinkan, dokumentasi ini akan mencoba menjelaskan perbedaan antara AGSL dan GLSL.

Jenis

AGSL mendukung jenis GLSL ES 1.0 beserta cara tambahan untuk merepresentasikan jenis vektor dan matriks. AGSL mendukung jenis short dan half tambahan untuk mewakili presisi sedang.

Jenis dasar

Jenis Deskripsi
void Tidak ada nilai yang ditampilkan fungsi atau daftar parameter kosong. Tidak seperti di GLSL, fungsi tanpa jenis nilai yang ditampilkan void harus menampilkan nilai.
bool, bvec2, bvec3, bvec4
(bool2, bool3, bool4).
Skalar/vektor Boolean
int, ivec2, ivec3, ivec4
(int2, int3, int4)
highp bilangan bulat/vektor yang telah ditandai
float, vec2, vec3, vec4
(float2, float3, float4)
Skalar/vektor floating point presisi tunggal highp
short, short2, short3, short4 setara dengan bilangan bulat/vektor bertanda mediump int
half, half2, half3, half4 setara dengan skalar/vektor mediump float
mat2, mat3, mat4
(float2x2, float3x3, float4x4)
Matriks float 2x2, 3x3, 4x4
half2x2, half3x3, half4x4 Setara dengan jenis matriks mediump float

Presisi dan minimum rentang

Ini adalah presisi dan rentang minimum yang dijamin yang terkait dengan setiap pengubah berdasarkan spesifikasi OpenGL ES 2.0. Karena sebagian besar perangkat mendukung ES 3.0, perangkat tersebut akan memiliki presisi/rentang highp dan rentang int mediump yang lebih terjamin. Pengubah presisi dapat diterapkan ke parameter dan variabel skalar, vektor, dan matriks. Hanya nilai minimum yang tercantum di bawah yang dijamin; lowp tidak selalu memiliki presisi yang lebih rendah daripada mediump, dan mediump tidak selalu memiliki presisi yang lebih rendah daripada highp. AGSL saat ini mengonversi lowp ke mediump dalam output akhir.

Pengubah Rentang 'float' Rentang magnitudo 'float' Presisi 'float' Rentang 'int'
highp \(\left\{-2^{62},2^{62}\right\}\) \(\left\{2^{-62},2^{62}\right\}\) Relatif: \(2^{-16}\) \(\left\{-2^{16},2^{16}\right\}\)
mediump \(\left\{-2^{14},2^{14}\right\}\) \(\left\{2^{-14},2^{14}\right\}\) Relatif: \(2^{-10}\) \(\left\{-2^{10},2^{10}\right\}\)
lowp \(\left\{-2,2\right\}\) \(\left\{2^{-8},2\right\}\) Mutlak: \(2^{-8}\) \(\left\{-2^{8},2^{8}\right\}\)

Selain sintaksis subskrip numerik array, misalnya: 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 - Gunakan saat mengakses vektor yang mewakili titik/normal

vect.rgba - Gunakan saat mengakses vektor yang mewakili warna

vect.LTRB - Gunakan saat vektor mewakili persegi panjang (bukan di GLSL)

Di AGSL, 0 dan 1 dapat digunakan untuk menghasilkan 0 atau 1 konstan di saluran tersebut. Contoh: vect.rgb1 == vec4(vect.rgb,1)

Struktur dan array

Struktur dideklarasikan dengan sintaksis yang sama dengan GLSL, tetapi AGSL hanya mendukung struktur pada cakupan global.

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

Hanya array 1 dimensi yang didukung dengan ukuran array eksplisit, menggunakan sintaksis gaya C atau GLSL:

<base type>[<array size>] nama variabel - mis.: half[10] x;

Nama variabel <base type>[<array size>] - mis.: half x[10];

Array tidak dapat ditampilkan dari fungsi, disalin, ditetapkan, atau dibandingkan. Pembatasan array diterapkan ke struktur yang berisi array. Array hanya dapat diindeks menggunakan konstanta atau variabel loop.

Kualifikasi

Jenis Deskripsi
const Konstanta waktu kompilasi, atau parameter fungsi hanya baca.
uniform Nilai tidak berubah di seluruh primitif yang sedang diproses. Seragam diteruskan dari Android menggunakan metode RuntimeShader untuk setColorUniform, setFloatUniform, setIntUniform, setInputBuffer, dan setInputShader.
in Untuk parameter fungsi yang diteruskan. Ini adalah defaultnya.
out Untuk parameter fungsi yang diteruskan. Harus menggunakan presisi yang sama dengan definisi fungsi.
inout Untuk parameter yang diteruskan masuk dan keluar dari fungsi. Harus menggunakan presisi yang sama dengan definisi fungsi.

Deklarasi variabel

Deklarasi harus berada dalam cakupan tanda kurung kurawal eksplisit. Deklarasi y dalam contoh berikut tidak diizinkan:

if (condition)
    int y = 0;

Dasar-dasar matriks/struktur/array

Contoh konstruktor matriks

Saat matriks dibuat dengan satu nilai, semua nilai di sepanjang diagonal akan diberi nilai tersebut, sedangkan sisanya diberi nol. Oleh karena itu, float2x2(1.0) akan membuat matriks identitas 2x2.

Saat matriks dibuat dengan beberapa nilai, kolom akan diisi terlebih dahulu (urutan kolom utama).

Perhatikan bahwa, tidak seperti GLSL, konstruktor yang mengurangi jumlah komponen vektor yang diteruskan tidak didukung, tetapi Anda dapat menggunakan swizzling untuk mendapatkan efek yang sama. Untuk membuat vec3 dari vec4 di AGSL dengan perilaku yang sama seperti GLSL, tentukan vec3 nv = quadVec.xyz.

Contoh konstruktor struktur

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

Komponen matriks

Mengakses komponen matriks dengan sintaksis subskrip 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

Kolom struktur

Pilih kolom struktur menggunakan operator titik .. Operator meliputi:

Operator Deskripsi
. pemilih kolom
==, != kesetaraan
= tugas

Elemen array

Elemen array diakses menggunakan operator subskrip array [ ]. Contoh:

diffuseColor += lightIntensity[3] * NdotL;

Operator

Diurutkan berdasarkan prioritas. Operator relasional dan kesetaraan > < <= >= == != dievaluasi ke Boolean. Untuk membandingkan vektor secara komponen, gunakan fungsi seperti lessThan(), equal(), dll.

Operator Deskripsi Asosiativitas
1 () pengelompokan tanda kurung T/A
2 [] () . ++ -- panggilan fungsi subskript array & kolom atau pemilih metode struktur konstruktor, swizzle penambahan dan pengurangan postfiks Kiri ke Kanan
3 ++ -- + - ! awalan inkremental dan decrement unary Kanan ke Kiri
4 * / perkalian dan pembagian Kiri ke Kanan
5 + - menambahkan dan mengurangi Kiri ke Kanan
7 < > <= >= relasional Kiri ke Kanan
8 == != persamaan/ketidaksetaraan Kiri ke Kanan
12 && logika AND Kiri ke Kanan
13 ^^ XOR logika Kiri ke Kanan
14 || logika OR Kiri ke Kanan
15 ?\: pilihan (satu seluruh operand) Kiri ke Kanan
16 = += -= *= /= tugas tugas aritmetika tugas tugas aritmetika Kiri ke Kanan
17 , urutan Kiri ke Kanan

Operasi matriks dan vektor

Jika diterapkan ke nilai skalar, operator aritmatika akan menghasilkan skalar. Untuk operator selain modulo, jika satu operand adalah skalar dan yang lainnya adalah vektor atau matriks, operasi dilakukan secara komponen dan menghasilkan jenis vektor atau matriks yang sama. Jika kedua operasi adalah vektor dengan ukuran yang sama, operasi dilakukan secara komponen (dan menampilkan jenis vektor yang sama).

Operasi Deskripsi
m = f * m Perkalian matriks komponen dengan nilai skalar
v = f * v Perkalian vektor komponen dengan nilai skalar
v = v * v Perkalian vektor komponen dengan nilai vektor
m = m + m Penambahan berdasarkan komponen matriks
m = m - m Pengurangan komponen matriks
m = m * m Perkalian aljabar linear

Jika satu operand adalah vektor yang cocok dengan ukuran baris atau kolom matriks, operator perkalian dapat digunakan untuk melakukan perkalian baris dan kolom aljabar.

Operasi Deskripsi
m = v * m Vektor baris * perkalian aljabar linear matriks
m = m * v Matriks * perkalian aljabar linear vektor kolom

Gunakan fungsi bawaan untuk perkalian titik vektor, perkalian silang, dan perkalian komponen:

Fungsi Deskripsi
f = dot(v, v) Perkalian titik vektor
v = cross(v, v) Perkalian silang vektor
m = matrixCompMult(m, m) Perkalian menurut komponen

Kontrol program

Panggilan fungsi Panggilan berdasarkan nilai yang ditampilkan
Iterasi for (<init>;<test>;<next>)
{ break, continue }
Pemilihan if ( ) { }
if ( ) { } else { }
switch () { break, case } - default case last
Lompat break, continue, return
(penghapusan tidak diizinkan)
Entri half4 main(float2 fragCoord)

Batasan loop for

Serupa dengan GLSL ES 1.0, loop 'for' cukup terbatas; compiler harus dapat membuka loop. Artinya, penginisialisasi, kondisi pengujian, dan pernyataan next harus menggunakan konstanta sehingga semuanya dapat dikomputasi pada waktu kompilasi. Pernyataan next lebih lanjut dibatasi untuk menggunakan ++, --, +=, or -=.

Fungsi bawaan

GT (jenis generik) adalah float, float2, float3, float4, atau half, half2, half3, half4.

Sebagian besar fungsi ini beroperasi secara komponen (fungsi diterapkan per komponen). Hal ini akan dicatat jika tidak demikian.

Sudut & fungsi trigonometri

Parameter fungsi yang ditentukan sebagai sudut diasumsikan dalam satuan radian. Dalam kasus apa pun, fungsi ini tidak akan menghasilkan error pembagian dengan nol. Jika pembagi rasio adalah 0, hasilnya tidak akan ditentukan.

Fungsi Deskripsi
GT radians(GT degrees) Mengonversi derajat ke radian
GT degrees(GT radians) Mengonversi radian ke derajat
GT sin(GT angle) Sinus standar
GT cos(GT angle) Kosinus standar
GT tan(GT angle) Tangent standar
GT asin(GT x) Menampilkan sudut yang sinusnya adalah x dalam rentang $ \left[-{\pi\over 2},{\pi\over 2}\right] $
GT acos(GT x) Menampilkan sudut yang kosinusnya adalah x dalam rentang $ \left[0,\pi\right] $
GT atan(GT y, GT x) Menampilkan sudut yang arctangent trigonometrinya adalah $ \left[{y\over x}\right] $ dalam rentang $ \left[-\pi,\pi\right] $
GT atan(GT y_over_x) Menampilkan sudut yang arctangent trigonometrinya adalah y_over_x dalam rentang $ \left[-{\pi\over 2},{\pi\over 2}\right] $

Fungsi eksponensial

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

Fungsi umum

Fungsi Deskripsi
GT abs(GT x) Nilai absolut
GT sign(GT x) Menampilkan -1.0, 0.0, atau 1.0 berdasarkan tanda x
GT floor(GT x) Bilangan bulat terdekat <= x
GT ceil(GT x) Bilangan bulat terdekat >= x
GT fract(GT x) Menampilkan bagian pecahan dari x
GT mod(GT x, GT y) Menampilkan nilai x modulo y
GT mod(GT x, float y) Menampilkan nilai x modulo y
GT min(GT x, GT y) Menampilkan nilai minimum x atau y
GT min(GT x, float y) Menampilkan nilai minimum x atau y
GT max(GT x, GT y) Menampilkan nilai maksimum x atau y
GT max(GT x, float y) Menampilkan nilai maksimum x atau y
GT clamp(GT x, GT minVal, GT maxVal) Menampilkan x yang dikekang antara minVal dan maxVal.
GT clamp(GT x, float minVal, float maxVal) Menampilkan x yang dikekang antara minVal dan maxVal
GT saturate(GT x) Menampilkan x yang dibatasi antara 0,0 dan 1,0
GT mix(GT x, GT y, GT a) Menampilkan gabungan linear x dan y
GT mix(GT x, GT y, float a) Menampilkan gabungan linear x dan y
GT step(GT edge, GT x) Menampilkan 0,0 jika x < edge, atau 1,0
GT step(float edge, GT x) Menampilkan 0,0 jika x < edge, atau 1,0
GT smoothstep(GT edge0, GT edge1, GT x) Melakukan interpolasi Hermite antara 0 dan 1 saat edge0 < x < edge1
GT smoothstep(float edge0, float edge1, GT x) Melakukan interpolasi Hermite antara 0 dan 1 saat edge0 < x < edge1

Fungsi geometris

Fungsi ini beroperasi pada vektor sebagai vektor, bukan per komponen. GT adalah vektor float/setengah dalam ukuran 2-4.

Fungsi Deskripsi
float/half length (GT x) Menampilkan panjang vektor
float/half distance(GT p0, GT p1) Menampilkan jarak antartitik
float/half dot(GT x, GT y) Menampilkan perkalian titik
float3/half3 cross(float3/half3 x, float3/half3 y) Menampilkan produk silang
GT normalize(GT x) Mennormalisasi vektor ke panjang 1
GT faceforward(GT N, GT I, GT Nref) Menampilkan N jika dot(Nref, I) < 0, jika tidak, -N.
GT reflect(GT I, GT N) Arah refleksi I - 2 * dot(N,I) * N.
GT refract(GT I, GT N, float/half eta) Menampilkan vektor pembiasan

Fungsi matriks

Jenis mat adalah jenis matriks persegi.

Fungsi Deskripsi
mat matrixCompMult(mat x, mat y) Mengalikan x dengan y menurut komponen
mat inverse(mat m) Menampilkan invers dari m

Fungsi relasional vektor

Bandingkan komponen x dan y. Ukuran vektor input dan vektor return untuk panggilan tertentu harus cocok. T adalah gabungan dari jenis vektor bilangan bulat dan floating point. BV adalah vektor boolean yang cocok dengan ukuran vektor input.

Fungsi Deskripsi
BV lessThan(T x, T y) x < y
BV lessThanEqual(T x, T y) x <= y
BV greaterThan(T x, T y) x > y
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 jika ada komponen x yang bernilai true
bool all(BV x) true jika semua komponen x adalah true.
BV not(BV x) komplemen logis x

Fungsi warna

Fungsi Deskripsi
vec4 unpremul(vec4 color) Mengonversi nilai warna menjadi alfa non-premultiplied
half3 toLinearSrgb(half3 color) Transformasi ruang warna ke SRGB linear
half3 fromLinearSrgb(half3 color) Transformasi ruang warna

Pengambilan sampel shader (evaluasi)

Jenis sampler tidak didukung, tetapi Anda dapat mengevaluasi shader lainnya. Jika perlu mengambil sampel tekstur, Anda dapat membuat objek BitmapShader, dan menambahkannya sebagai seragam. Anda dapat melakukannya untuk shader apa pun, yang berarti Anda dapat langsung mengevaluasi Shader Android apa pun tanpa mengubahnya menjadi Bitmap terlebih dahulu, termasuk objek RuntimeShader lainnya. Hal ini memungkinkan fleksibilitas yang sangat besar, tetapi shader yang kompleks dapat mahal untuk dievaluasi, terutama dalam loop.

uniform shader image;

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

Pengambilan sampel buffer mentah

Meskipun sebagian besar gambar berisi warna yang harus dikelola warna, beberapa gambar berisi data yang sebenarnya bukan warna, termasuk gambar yang menyimpan normal, properti material (misalnya, kekasaran), peta ketinggian, atau data matematika murni lainnya yang kebetulan disimpan dalam gambar. Saat menggunakan jenis gambar ini di AGSL, Anda dapat menggunakan BitmapShader sebagai buffering mentah generik menggunakan RuntimeShader#setInputBuffer. Tindakan ini akan menghindari transformasi dan pemfilteran ruang warna.