Ngôn ngữ tạo bóng đồ hoạ Android (AGSL)
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
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ên Paint
. Thực tế, Chương trình đổ bóng có thể là một cây đối tượng (do ComposeShader
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ường Shader
, ColorFilter
hoặc BlendMode
, 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
.
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-07-26 UTC.
[null,null,["Cập nhật lần gần đây nhất: 2025-07-26 UTC."],[],[],null,["# Android Graphics Shading Language (AGSL) is used by Android 13 and above to\ndefine the behavior of programmable\n[`RuntimeShader`](/reference/android/graphics/RuntimeShader) objects. AGSL\nshares much of its syntax with GLSL fragment shaders, but works within the\nAndroid graphics rendering system to both customize painting within `Canvas`\nand filter `View` content.\n\nTheory of operation\n-------------------\n\nAGSL effects exist as part of the larger Android graphics pipeline. When Android\nissues a GPU accelerated drawing operation, it assembles a single GPU fragment\nshader to do the required work. This shader typically includes several pieces.\nFor example, it might include:\n\n- Evaluating whether a pixel falls inside or outside of the shape being drawn (or on the border, where it might apply anti-aliasing).\n- Evaluating whether a pixel falls inside or outside of the clipping region (again, with possible anti-aliasing logic for border pixels).\n- Logic for the [`Shader`](/reference/android/graphics/Shader) on the [`Paint`](/reference/android/graphics/Paint). The Shader can actually be a tree of objects (due to [`ComposeShader`](/reference/android/graphics/ComposeShader) and other features described below).\n- Similar logic for the [`ColorFilter`](/reference/android/graphics/ColorFilter).\n- Blending code (for certain types of [`BlendMode`](/reference/android/graphics/BlendMode)).\n- Color space conversion code, as part of Android's color management.\n- When the `Paint` has a complex tree of objects in the `Shader`, `ColorFilter`, or `BlendMode` fields, there is still only a single GPU fragment shader. Each node in that tree creates a single function. The clipping code and geometry code each create a function. The blending code might create a function. The overall fragment shader then calls all of these functions (which may call other functions, e.g. in the case of a shader tree).\n\nYour AGSL effect contributes a function (or functions) to the GPU's fragment shader.\n\nBasic syntax\n------------\n\nAGSL (and GLSL) are C-style domain specific languages. Types such as `bool` and\n`int` closely track their C equivalents; there are additional types to\nsupport vectors and matrices that support domain functionality.\n\nQualifiers can be applied to types for precision hints in a way that's unique to shading languages. Control structures such as `if-else` statements work much\nlike they do in C; the language also provides support for `switch` statements\nand `for` loops with limitations. Some control structures require constant expressions that can be evaluated at compile time.\n\nAGSL supports functions; every shader program begins with the `main` function.\nUser defined functions are supported, without support for recursion of any kind.\nFunctions use a \"value-return\" calling convention; values passed to functions are\ncopied into parameters when the function is called, and outputs are copied\nback; this is determined by the `in`, `out`, and `inout` qualifiers."]]