يستخدم نظام التشغيل 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
.