Android Graphics Shading Language (AGSL) digunakan oleh Android 13 dan yang lebih baru untuk
menentukan perilaku objek
RuntimeShader
yang dapat diprogram. AGSL
berbagi banyak sintaksisnya dengan shader fragmen GLSL, tetapi berfungsi dalam
sistem rendering grafis Android untuk menyesuaikan paint dalam Canvas
dan memfilter konten View
.
Teori operasi
Efek AGSL ada sebagai bagian dari pipeline grafis Android yang lebih besar. Saat mengeluarkan operasi menggambar yang dipercepat GPU, Android akan menyusun satu shader fragmen GPU untuk melakukan pekerjaan yang diperlukan. Shader ini biasanya mencakup beberapa bagian. Misalnya, ini mungkin mencakup:
- Mengevaluasi apakah piksel berada di dalam atau di luar bentuk yang digambar (atau di batas, yang mungkin menerapkan anti-aliasing).
- Mengevaluasi apakah piksel berada di dalam atau di luar area klip (sekali lagi, dengan kemungkinan logika anti-aliasing untuk piksel batas).
- Logika untuk
Shader
diPaint
. Shader sebenarnya dapat berupa hierarki objek (karenaComposeShader
dan fitur lain yang dijelaskan di bawah ini). - Logika serupa untuk
ColorFilter
. - Menggabungkan kode (untuk jenis
BlendMode
tertentu). - Kode konversi ruang warna, sebagai bagian dari pengelolaan warna Android.
- Jika
Paint
memiliki hierarki objek yang kompleks di kolomShader
,ColorFilter
, atauBlendMode
, hanya akan ada satu shader fragmen GPU. Setiap node dalam hierarki tersebut membuat fungsi tunggal. Masing-masing kode {i>clipping<i} dan kode geometri menciptakan sebuah fungsi. Kode penggabungan dapat membuat fungsi. Keseluruhan shader fragmen kemudian memanggil semua fungsi tersebut (yang dapat memanggil fungsi lain, misalnya dalam kasus hierarki shader).
Efek AGSL Anda berkontribusi pada fungsi (atau beberapa fungsi) ke shader fragmen GPU.
Sintaksis dasar
AGSL (dan GLSL) adalah bahasa khusus domain bergaya C. Jenis seperti bool
dan
int
melacak dengan cermat padanan C-nya; ada jenis tambahan untuk
mendukung vektor dan matriks yang mendukung fungsi domain.
Qualifier dapat diterapkan ke jenis untuk petunjuk presisi dengan cara yang unik untuk bahasa bayangan. Struktur kontrol seperti pernyataan if-else
berfungsi mirip seperti di C; bahasa ini juga memberikan dukungan untuk pernyataan switch
dan loop for
dengan batasan. Beberapa struktur kontrol memerlukan ekspresi konstan yang dapat dievaluasi pada waktu kompilasi.
AGSL mendukung fungsi; setiap program shader dimulai dengan fungsi main
.
Fungsi yang ditetapkan pengguna didukung, tanpa dukungan untuk rekursi apa pun.
Fungsi menggunakan konvensi pemanggilan "nilai-nilai"; nilai yang diteruskan ke fungsi disalin ke dalam parameter saat fungsi dipanggil, dan output disalin kembali; ini ditentukan oleh penentu in
, out
, dan inout
.