שפת הצללה של גרפיקה ב-Android (AGSL)
קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
Android Graphics Shading Language (AGSL) משמשת ב-Android 13 ומעלה כדי להגדיר את ההתנהגות של אובייקטים RuntimeShader
שניתנים לתכנות. התחביר של AGSL דומה מאוד לזה של GLSL fragment shaders, אבל הוא פועל במערכת עיבוד הגרפיקה של Android כדי להתאים אישית את הציור ב-Canvas
ולסנן תוכן ב-View
.
תיאוריית הפעולה
אפקטים של AGSL הם חלק מצינור העיבוד הגרפי הגדול יותר של Android. כשמערכת Android מנפיקה פעולת ציור מואצת GPU, היא מרכיבה shader של פרגמנט GPU יחיד כדי לבצע את העבודה הנדרשת. בדרך כלל, שיידר כזה כולל כמה חלקים.
לדוגמה, יכול להיות שהיא תכלול:
- הערכה אם פיקסל נמצא בתוך הצורה שמציירים או מחוצה לה (או על הגבול, במקרה כזה יכול להיות שיוחל עליו החלקת קצוות).
- הערכה אם פיקסל נמצא בתוך אזור החיתוך או מחוצה לו
(שוב, עם לוגיקה אפשרית של החלקת קצוות לפיקסלים בגבול).
- הלוגיקה של
Shader
בPaint
. ה-Shader יכול להיות למעשה עץ של אובייקטים (בגלל ComposeShader
ותכונות אחרות שמתוארות בהמשך).
- לוגיקה דומה חלה על
ColorFilter
.
- קוד מיזוג (לסוגים מסוימים של
BlendMode
).
- קוד להמרת מרחב צבעים, כחלק מניהול הצבעים ב-Android.
- גם אם ל-
Paint
יש עץ מורכב של אובייקטים בשדות Shader
, ColorFilter
או BlendMode
, עדיין יש רק shader אחד של שבר GPU. כל צומת בעץ הזה יוצר פונקציה אחת. קוד החיתוך וקוד הגיאומטריה יוצרים כל אחד פונקציה. יכול להיות שקוד המיזוג ייצור פונקציה.
לאחר מכן, ה-fragment shader הכולל קורא לכל הפונקציות האלה (שיכולות לקרוא לפונקציות אחרות, למשל במקרה של עץ shader).
אפקט AGSL תורם פונקציה (או פונקציות) ל-fragment shader של ה-GPU.
תחביר בסיסי
AGSL (ו-GLSL) הן שפות ספציפיות לדומיין בסגנון C. סוגים כמו bool
ו-int
עוקבים אחרי המקבילים שלהם בשפת C; יש סוגים נוספים לתמיכה בווקטורים ובמטריצות שתומכים בפונקציונליות של הדומיין.
אפשר להחיל מסננים על סוגים כדי לתת רמזים מדויקים, באופן ייחודי לשפות הצללה. מבני בקרה כמו הצהרות if-else
פועלים בדומה לאופן שבו הם פועלים ב-C. השפה גם תומכת בהצהרות switch
ובלולאות for
עם מגבלות. חלק ממבני הבקרה דורשים ביטויים קבועים שאפשר להעריך בזמן ההידור.
AGSL תומך בפונקציות. כל תוכנית Shader מתחילה בפונקציה main
.
יש תמיכה בפונקציות שהוגדרו על ידי המשתמש, אבל אין תמיכה ברקורס מכל סוג שהוא.
הפונקציות משתמשות במוסכמת קריאה מסוג 'החזרת ערך'. הערכים שמועברים לפונקציות מועתקים לפרמטרים כשהפונקציה נקראת, והפלט מועתק בחזרה. זה נקבע על ידי המאפיינים in
, out
ו-inout
.
דוגמאות התוכן והקוד שבדף הזה כפופות לרישיונות המפורטים בקטע רישיון לתוכן. Java ו-OpenJDK הם סימנים מסחריים או סימנים מסחריים רשומים של חברת Oracle ו/או של השותפים העצמאיים שלה.
עדכון אחרון: 2025-07-27 (שעון UTC).
[[["התוכן קל להבנה","easyToUnderstand","thumb-up"],["התוכן עזר לי לפתור בעיה","solvedMyProblem","thumb-up"],["סיבה אחרת","otherUp","thumb-up"]],[["חסרים לי מידע או פרטים","missingTheInformationINeed","thumb-down"],["התוכן מורכב מדי או עם יותר מדי שלבים","tooComplicatedTooManySteps","thumb-down"],["התוכן לא עדכני","outOfDate","thumb-down"],["בעיה בתרגום","translationIssue","thumb-down"],["בעיה בדוגמאות/בקוד","samplesCodeIssue","thumb-down"],["סיבה אחרת","otherDown","thumb-down"]],["עדכון אחרון: 2025-07-27 (שעון 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."]]