لغة تظليل رسومات Android (AGSL)
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
يستخدم نظام التشغيل Android 13 والإصدارات الأحدث لغة تظليل رسومات Android (AGSL) لتحديد سلوك عناصر RuntimeShader
القابلة للبرمجة. تشارك لغة AGSL
الكثير من تركيبتها مع أدوات تظليل أجزاء GLSL، ولكنّها تعمل ضمن
نظام عرض رسومات Android لتخصيص الرسم داخل Canvas
وفلترة محتوى View
.
نظرية العمليات
توجد تأثيرات AGSL كجزء من مسار رسومات Android الأكبر. عندما يُصدر Android
عملية رسم مسرَّع لوحدة معالجة الرسومات، فإنه يجمّد جزءًا واحدًا من أجزاء وحدة معالجة الرسومات
للقيام بالعمل المطلوب. تتضمن أداة التظليل عادةً عدة قطع.
على سبيل المثال، قد يتضمن:
- تقييم ما إذا كان البكسل يقع داخل الشكل الذي يتم رسمه أو خارجه
(أو على الحدود، حيث يمكن تطبيق تنقيح)
- تقييم ما إذا كان البكسل يقع داخل منطقة الاقتصاص أو خارجها
(نكرّر ذلك مع منطق منع التشويش في وحدات البكسل الحدودية)
- منطق
Shader
على Paint
. ويمكن أن يكون Shader
شجرة من الكائنات (بسبب
ComposeShader
وميزات أخرى موضّحة أدناه).
- منطق مماثل لـ
ColorFilter
.
- الرمز المختلط (لأنواع معيّنة من
BlendMode
)
- رمز تحويل مساحة اللون، كجزء من إدارة الألوان على Android
- إذا كانت السمة
Paint
تحتوي على مجموعة من العناصر المعقّدة في الحقول Shader
أو ColorFilter
أو BlendMode
، سيظل هناك فاصل واحد فقط من أجزاء وحدة معالجة الرسومات. تنشئ كل عقدة في هذه الشجرة دالة واحدة. تنشئ كل من كود الاقتصاص
والتعليمة البرمجية الهندسية دالة. قد تنشئ التعليمة البرمجية للمزج دالة.
بعد ذلك، تستدعي أداة تظليل الأجزاء الشاملة جميع هذه الدوال (والتي قد تستدعي دوال أخرى، على سبيل المثال في حالة استخدام شجرة تظليل).
يساهم تأثير AGSL في وظيفة (أو وظائف) في أداة تظليل الأجزاء بوحدة معالجة الرسومات.
البنية الأساسية
لغة AGSL (وGLSL) هي لغات خاصة بالنطاق بأسلوب C. تتتبّع أنواع مثل bool
وint
مكافئات C عن كثب، وهناك أنواع إضافية لدعم المتجهات والمصفوفات التي تتوافق مع وظائف النطاق.
يمكن تطبيق المؤهِّلات على الأنواع للحصول على تلميحات الدقة بطريقة فريدة في لغات التظليل. إنّ بُنى التحكّم، مثل عبارات if-else
، تعمل بالطريقة
التي تعمل بها في لغة C، وتتوافق اللغة أيضًا مع عبارات switch
وتكرارات for
مع قيود مفروضة. تتطلب بعض بنى التحكم تعبيرات ثابتة يمكن تقييمها في وقت التجميع.
يدعم AGSL الدوال؛ يبدأ كل برنامج تظليل بالدالة main
.
يمكن استخدام الدوال التي يحدّدها المستخدم، بدون إتاحة أي نوع من الدوال الاسترجاعية.
تستخدم الدوال اصطلاح استدعاء "value-return"؛ ويتم نسخ القيم التي يتم تمريرها إلى الدوال
إلى معلَمات عند استدعاء الدالة، ويتم نسخ المخرجات مرة أخرى. ويتم تحديد ذلك من خلال المؤهِّلات in
وout
وinout
.
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-26 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","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-26 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],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."]]