Android 13 trở lên sử dụng Ngôn ngữ tạo bóng đồ hoạ Android (AGSL) để xác định hành vi của các đối tượng RuntimeShader
lập trình được. AGSL sử dụng chung nhiều cú pháp với chương trình đổ bóng mảnh GLSL, nhưng hoạt động trong hệ thống kết xuất đồ hoạ Android để tuỳ chỉnh tính năng vẽ trong Canvas
và lọc nội dung View
.
Lý thuyết hoạt động
Hiệu ứng AGSL tồn tại như một phần của quy trình đồ hoạ Android rộng lớn hơn. Khi phát hành thao tác vẽ được tăng tốc GPU, Android sẽ tập hợp một chương trình đổ bóng mảnh GPU để thực hiện công việc cần thiết. Chương trình đổ bóng này thường bao gồm một số phần. Ví dụ: nội dung này có thể bao gồm:
- Đánh giá xem một pixel nằm bên trong hay bên ngoài hình dạng đang được vẽ (hoặc trên đường viền, nơi pixel có thể áp dụng tính năng khử răng cưa).
- Đánh giá xem một pixel nằm trong hay ngoài vùng cắt (xin nhắc lại, với logic khử răng cưa có thể có cho pixel đường viền).
- Logic cho
Shader
trênPaint
. Thực tế, Chương trình đổ bóng có thể là một cây đối tượng (doComposeShader
và các tính năng khác được mô tả bên dưới). - Logic tương tự cho
ColorFilter
. - Mã kết hợp (đối với một số loại
BlendMode
). - Mã chuyển đổi không gian màu, nằm trong tính năng quản lý màu của Android.
- Khi
Paint
có cây đối tượng phức tạp trong trườngShader
,ColorFilter
hoặcBlendMode
, thì vẫn chỉ có một chương trình đổ bóng mảnh GPU. Mỗi nút trong cây đó sẽ tạo một hàm duy nhất. Mã cắt và mã hình học sẽ tạo ra một hàm. Mã kết hợp có thể tạo ra một hàm. Sau đó, chương trình đổ bóng mảnh tổng thể sẽ gọi tất cả các hàm này (có thể gọi các hàm khác, ví dụ: trong trường hợp cây chương trình đổ bóng).
Hiệu ứng AGSL đóng góp một (hoặc nhiều hàm) cho chương trình đổ bóng mảnh của GPU.
Cú pháp cơ bản
AGSL (và GLSL) là các ngôn ngữ đặc thù của miền kiểu C. Các loại như bool
và int
theo dõi chặt chẽ các phần tử tương đương trong C; có thêm các loại khác để hỗ trợ vectơ và ma trận hỗ trợ chức năng của miền.
Bạn có thể áp dụng bộ hạn định cho các loại để có gợi ý chính xác theo cách độc đáo cho ngôn ngữ tô bóng. Các cấu trúc điều khiển như câu lệnh if-else
hoạt động tương tự như trong C; ngôn ngữ này cũng hỗ trợ các câu lệnh switch
và vòng lặp for
có giới hạn. Một số cấu trúc điều khiển yêu cầu biểu thức không đổi có thể được đánh giá trong thời gian biên dịch.
AGSL hỗ trợ các hàm; mọi chương trình đổ bóng đều bắt đầu bằng hàm main
.
Các hàm do người dùng xác định được hỗ trợ mà không hỗ trợ việc đệ quy dưới bất kỳ hình thức nào.
Các hàm sử dụng quy ước gọi "value-return" (trả về giá trị); các giá trị được chuyển đến hàm được sao chép thành tham số khi hàm được gọi và dữ liệu đầu ra được sao chép ngược lại. Điều này được xác định bởi bộ hạn định in
, out
và inout
.