AGSL dirancang agar sebagian besar kompatibel dengan GLSL ES 1.0. Untuk informasi selengkapnya, lihat fungsi ekuivalen di Dokumentasi OpenGL ES Shading Language. Jika memungkinkan, dokumentasi ini mencoba menyampaikan perbedaan antara AGSL dan GLSL.
Jenis
AGSL mendukung jenis GLSL ES 1.0 beserta cara tambahan untuk merepresentasikan vektor
jenis matriks. AGSL mendukung jenis short
dan half
tambahan untuk mewakili
presisi sedang.
Jenis dasar
Jenis | Deskripsi |
---|---|
void
|
Tidak ada nilai yang ditampilkan fungsi atau parameter kosong daftar. Tidak seperti dalam GLSL, fungsi tanpa kekosongan jenis nilai yang ditampilkan harus menampilkan nilai. |
bool, bvec2, bvec3, bvec4 (bool2, bool3, bool4) |
Skalar/vektor Boolean |
int, ivec2, ivec3, ivec4 (int2, int3, int4) |
highp bilangan bulat/vektor bertanda tangan
|
float, vec2, vec3, vec4 (float2, float3, float4)
|
Floating point highp (presisi tunggal)
skalar/vektor |
short, short2, short3, short4
|
setara dengan yang ditandatangani mediump int
bilangan bulat/vektor |
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 mediump float jenis matriks |
Presisi dan rentang minimum
Nilai ini adalah presisi dan rentang minimum yang dijamin yang terkait dengan masing-masing
pengubah berdasarkan spesifikasi OpenGL ES 2.0. Karena sebagian besar perangkat
mendukung ES 3.0, presisi/rentang highp
yang lebih terjamin dan
Rentang int mediump
. Pengubah presisi dapat
diterapkan pada skalar, vektor, dan
parameter dan variabel matriks. Hanya nilai minimum yang tercantum di bawah yang dijamin;
lowp
belum tentu lebih rendah presisi dari mediump
, dan mediump
presisinya belum tentu lebih rendah dari highp
. Saat ini AGSL mengonversi lowp
ke mediump
dalam output akhir.
Pengubah | 'float' rentang | 'float' rentang magnitudo | 'float' presisi | 'int' rentang |
---|---|---|---|---|
tinggi | \(\left\{-2^{62},2^{62}\right\}\) | \(\left\{2^{-62},2^{62}\right\}\) | Kerabat: \(2^{-16}\) | \(\left\{-2^{16},2^{16}\right\}\) |
mediap | \(\left\{-2^{14},2^{14}\right\}\) | \(\left\{2^{-14},2^{14}\right\}\) | Kerabat: \(2^{-10}\) | \(\left\{-2^{10},2^{10}\right\}\) |
rendah | \(\left\{-2,2\right\}\) | \(\left\{2^{-8},2\right\}\) | Absolut: \(2^{-8}\) | \(\left\{-2^{8},2^{8}\right\}\) |
Selain sintaksis subskrip numerik array, mis.: 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 merepresentasikan titik/normal
vect.rgba
- Gunakan saat mengakses vektor yang merepresentasikan warna
vect.LTRB
- Gunakan jika vektor merepresentasikan persegi panjang (bukan dalam GLSL)
Dalam AGSL, 0 dan 1 dapat digunakan untuk menghasilkan konstanta 0 atau 1 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 organisasi pada ruang lingkup global.
struct type-name {
members
} struct-name; // optional variable declaration.
Hanya array 1 dimensi yang didukung dengan ukuran array eksplisit, menggunakan baik sintaks gaya C atau GLSL:
nama variabel <base type>[<array size>] - misalnya: half[10] x;
<jenis dasar> nama variabel[<array size>] - misalnya: half x[10];
Array tidak dapat ditampilkan dari fungsi, disalin, ditetapkan, atau dibandingkan. Pembatasan array disebarkan ke struktur yang berisi array. Array dapat hanya diindeks menggunakan variabel konstan atau loop.
Kualifikasi
Jenis | Deskripsi |
---|---|
const
|
Konstanta waktu kompilasi, atau fungsi hanya baca . |
uniform
|
Nilai tidak berubah di seluruh primitif
sedang diproses.
Seragam yang diteruskan dari Android menggunakan
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 dan dikeluarkan dari suatu fungsi. Harus menggunakan presisi yang sama dengan definisi fungsi. |
Deklarasi variabel
Pernyataan harus berada dalam cakupan dengan kurung kurawal yang eksplisit. Deklarasi y
di
contoh berikut tidak diizinkan:
if (condition)
int y = 0;
Dasar-dasar matriks/struktur/array
Contoh konstruktor matriks
Ketika matriks dibuat dengan satu nilai, semua nilai beserta
diagonal diberi nilai tersebut, sedangkan sisanya diberi angka nol. float2x2(1.0)
akan
Oleh karena itu buat matriks identitas 2x2.
Ketika matriks dibuat dengan beberapa nilai, kolom akan diisi terlebih dahulu (urutan kolom-utama).
Perhatikan bahwa, tidak seperti GLSL, konstruktor yang mengurangi jumlah komponen
tidak didukung, tapi Anda bisa menggunakan {i>swizzling<i} untuk
pengaruh tersebut. Untuk membuat vec3
dari vec4
dalam 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 |
= |
penetapan |
Elemen array
Elemen array diakses menggunakan operator subskrip array [ ]
. Contoh:
diffuseColor += lightIntensity[3] * NdotL;
Operator
Dinomori sesuai urutan prioritas. Relasional dan kesetaraan
operator > < <= >= == != mengevaluasi ke Boolean. Untuk membandingkan vektor
berdasarkan komponen, gunakan fungsi seperti lessThan()
, equal()
, dll.
Operator | Deskripsi | Asosiativitas | |
---|---|---|---|
1 | () |
pengelompokan dalam tanda kurung | T/A |
2 | [] () . ++ --
|
subskrip array panggilan fungsi & struktur konstruktor kolom atau metode pemilih, swizzle penambahan postfix dan pengurangan | Kiri ke Kanan |
3 | ++ -- + - !
|
penambahan awalan dan pengurangan unary | Kanan ke Kiri |
4 | * / |
kali dan bagi | Kiri ke Kanan |
5 | + - |
tambah dan kurangi | Kiri ke Kanan |
7 | < > <= >= |
relasional | Kiri ke Kanan |
8 | == != |
kesetaraan/ketidaksetaraan | Kiri ke Kanan |
12 | && |
AND logis | Kiri ke Kanan |
13 | ^^ |
XOR logis | Kiri ke Kanan |
14 | || |
OR logis | Kiri ke Kanan |
15 | ?\:
|
pilihan (satu seluruh operand) | Kiri ke Kanan |
16 | = += -= *= /=
|
penetapan aritmatika penetapan aritmatika penetapan | Kiri ke Kanan |
17 | , |
urutan | Kiri ke Kanan |
Operasi matriks dan vektor
Ketika diterapkan pada nilai skalar, operator aritmatika akan menghasilkan skalar. Sebagai operator selain modulo, jika satu operand adalah skalar dan yang lainnya adalah vektor atau matriks, operasi ini dilakukan berdasarkan komponen dan menghasilkan jenis vektor atau matriks yang sama. Jika kedua operasi adalah vektor dengan ukuran yang sama, akan dijalankan berdasarkan komponen (dan mengembalikan jenis vektor yang sama).
Operasi | Deskripsi |
---|---|
m = f * m |
Perkalian matriks berbasis komponen dengan nilai skalar |
v = f * v |
Perkalian vektor berbasis komponen dengan nilai skalar |
v = v * v |
Perkalian vektor berbasis komponen dengan nilai vektor |
m = m + m |
Penambahan berbasis komponen matriks |
m = m - m |
Pengurangan {i>component-wise<i} di matriks |
m = m * m |
Perkalian aljabar linear |
Jika satu operand adalah vektor yang sesuai dengan ukuran baris atau kolom matriks kita, 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 * vektor kolom perkalian aljabar linear |
Gunakan fungsi bawaan untuk perkalian titik vektor, perkalian silang, dan perkalian {i>component-wise<i}:
Fungsi | Deskripsi |
---|---|
f = dot(v, v) |
Produk vektor titik |
v = cross(v, v) |
Perkalian silang vektor |
m = matrixCompMult(m, m) |
Pengalian {i>component-wise<i} |
Kontrol program
Panggilan fungsi | Panggil berdasarkan nilai-return |
---|---|
Iterasi/Pengulangan | for (<init>;<test>;<next>) { break, continue } |
Pemilihan | if ( ) { } if ( ) { } else { } switch () { break, case }
- huruf besar/kecil default di akhir |
Lompat | break, continue, return (buang tidak diizinkan) |
Entri | half4 main(float2 fragCoord) |
Batasan loop For
Mirip dengan GLSL ES 1.0, 'for' loop sangat terbatas; compiler harus dapat
untuk membuka loop. Ini berarti bahwa penginisialisasi, kondisi pengujian, dan metode
Pernyataan next
harus menggunakan konstanta agar semuanya dapat dikomputasi saat kompilasi
baik. Pernyataan next
lebih lanjut dibatasi untuk penggunaan ++, --, +=, or -=
.
Fungsi bawaan
GT
(jenis generik) adalah float
, float2
, float3
, float4
, atau
half
, half2
, half3
, half4
.
Sebagian besar fungsi ini mengoperasikan {i>component-wise<i} (fungsi tersebut diterapkan per komponen). Perlu dicatat jika tidak demikian.
Sudut & fungsi trigonometri
Parameter fungsi yang ditentukan sebagai sudut diasumsikan dalam satuan radian. Tidak akan ada satu pun dari fungsi-fungsi ini yang menghasilkan kesalahan pembagian dengan angka nol. Jika pembagi rasio adalah 0, maka hasilnya tidak akan terdefinisi.
Fungsi | Deskripsi |
---|---|
GT radians(GT degrees) |
Mengubah derajat ke radian |
GT degrees(GT radians) |
Mengubah radian ke derajat |
GT sin(GT angle) |
Sinus standar |
GT cos(GT angle) |
Kosinus standar |
GT tan(GT angle) |
Garis tangen standar |
GT asin(GT x)
|
Menampilkan sudut yang sinusnya adalah x dalam rentang dari $ \left[-{\pi\over 2},{\pi\over 2}\right] $ |
GT acos(GT x)
|
Mengembalikan sudut yang kosinusnya adalah x dalam rentang $ \left[0,\pi\tight] $ |
GT atan(GT y, GT x)
|
Mengembalikan sudut yang arctangen trigonometri adalah $ \left[{y\over x}\right] $ di rentang $ \left[-\pi,\pi\right] $ |
GT atan(GT y_over_x)
|
Menampilkan sudut yang trigonometrinya
arctangen adalah y_over_x dalam rentang
dari $ \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) |
Mengembalikan $ e^x $ |
GT log(GT x) |
Mengembalikan $ ln(x) $ |
GT exp2(GT x) |
Mengembalikan $ 2^x $ |
GT log2(GT x) |
Mengembalikan $ log_2(x) $ |
GT sqrt(GT x) |
Mengembalikan $ \sqrt{x} $ |
GT inversesqrt(GT x) |
Kembalikan $ 1\over{\sqrt{x}} $ |
Fungsi umum
Fungsi | Deskripsi |
---|---|
GT abs(GT x) |
Nilai mutlak |
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 dibulatkan antara minVal dan maxVal. |
GT clamp(GT x, float
minVal, float maxVal) |
Mengembalikan x yang dibulatkan antara minVal dan maxVal |
GT saturate(GT x) |
Mengembalikan x dibulatkan 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) |
Mengembalikan 0.0 jika x < edge, 1,0 |
GT step(float edge,
GT x) |
Mengembalikan 0.0 jika x < edge, 1,0 |
GT smoothstep(GT edge0,
GT edge1, GT x) |
Melakukan interpolasi Hermite antara 0 dan 1 jika edge0 < x < tepi1 |
GT smoothstep(float
edge0, float edge1,
GT x) |
Melakukan interpolasi Hermite antara 0 dan 1 jika edge0 < x < tepi1 |
Fungsi geometris
Fungsi-fungsi ini beroperasi pada vektor sebagai vektor, bukan berdasarkan 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 produk titik |
float3/half3
cross(float3/half3 x,
float3/half3 y) |
Menampilkan lintas produk |
GT normalize(GT x) |
Menormalkan 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 pantulan I - 2 * titik(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 berdasarkan komponen |
mat inverse(mat m) |
Menampilkan invers dari m |
Fungsi relasional vektor
Membandingkan berdasarkan komponen x dan y. Ukuran vektor input dan vektor yang ditampilkan untuk panggilan tertentu harus sesuai. T adalah gabungan jenis vektor bilangan bulat dan vektor floating point. BV adalah vektor boolean yang sesuai dengan ukuran vektor input.
Fungsi | Deskripsi |
---|---|
BV lessThan(T x, T y) |
x < t |
BV lessThanEqual(T x,
T y) |
x <= y |
BV greaterThan(T x,
T y) |
x > t |
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 komponen x adalah true |
bool all(BV x) |
true jika semua komponen x adalah true . |
BV not(BV x) |
komplementer logis dari x |
Fungsi warna
Fungsi | Deskripsi |
---|---|
vec4 unpremul(vec4
color) |
Mengonversi nilai warna menjadi nilai yang tidak dikalikan {i>alpha<i} |
half3 toLinearSrgb(half3
color) |
Transformasi ruang warna ke SRGB linear |
half3 fromLinearSrgb(half3
color) |
Transformasi ruang warna |
Sampling shader (evaluasi)
Jenis sampler tidak didukung, tetapi Anda dapat mengevaluasi shader lainnya. Jika Anda memerlukan untuk mengambil sampel tekstur, Anda dapat membuat BitmapShader, dan menambahkannya sebagai uniform. Anda dapat melakukan ini untuk shader apa pun, yang berarti Anda dapat mengevaluasi Android Shader apa pun tanpa mengubahnya menjadi Bitmap terlebih dahulu, termasuk yang lainnya Objek RuntimeShader. Hal ini memungkinkan memiliki fleksibilitas yang sangat besar, tetapi shader yang kompleks mungkin membutuhkan banyak melakukan evaluasi, terutama dalam sebuah loop.
uniform shader image;
image.eval(coord).a // The alpha channel from the evaluated image shader
Pengambilan sampel buffer mentah
Meskipun sebagian besar gambar mengandung warna yang harus dikelola dengan warna, beberapa gambar berisi data yang sebenarnya bukan warna, termasuk gambar yang menyimpan nilai normal, properti material (mis., kekasaran), peta ketinggian, atau properti data matematis yang kebetulan disimpan dalam sebuah gambar. Saat menggunakan jenis gambar dalam AGSL, Anda dapat menggunakan BitmapShader sebagai buffer mentah generik RuntimeShader#setInputBuffer. Tindakan ini akan menghindari transformasi dan pemfilteran ruang warna.