Android Graphics Shading Language (AGSL)

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 di Paint. Shader sebenarnya dapat berupa hierarki objek (karena ComposeShader 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 kolom Shader, ColorFilter, atau BlendMode, 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.