Android 13 و بالاتر از «زبان سایهزنی گرافیک Android» (AGSL) برای تعریف رفتار اشیاء
RuntimeShader
برنامهپذیر استفاده میکنند. AGSL
بخش زیادی از نحو خود را با سایهزنهای قطعه GLSL بهاشتراک میگذارد، اما در
سیستم پردازش گرافیک Android کار میکند تا هم نقاشی را در Canvas سفارشیسازی کند
و هم محتوای View را فیلتر کند.
تئوری عملکرد
جلوههای AGSL بهعنوان بخشی از خط لوله گرافیکی بزرگتر Android وجود دارند. وقتی Android عملیات طراحی شتابیافته GPU را صادر میکند، یک سایهزن قطعه GPU واحد را برای انجام کار موردنیاز مونتاژ میکند. این سایهزن معمولاً شامل چند قطعه است. برای مثال، ممکن است شامل موارد زیر باشد:
- ارزیابی اینکه آیا پیکسل داخل یا خارج از شکل درحال ترسیم قرار میگیرد (یا روی مرز، جایی که ممکن است هموارسازی اعمال شود).
- ارزیابی اینکه آیا پیکسل داخل یا خارج از منطقه برش قرار میگیرد (مجدداً، با منطق احتمالی ضدپلگی برای پیکسلهای مرزی).
- منطق برای
ShaderدرPaint. Shader میتواند درواقع درختی از اشیاء باشد (بهدلیلComposeShaderو ویژگیهای دیگری که در زیر شرح داده شده است). - منطق مشابه برای
ColorFilter. - کد ترکیب (برای انواع خاصی از
BlendMode). - کد تبدیل فضای رنگ، بهعنوان بخشی از مدیریت رنگ Android.
- وقتی
Paintدرخت پیچیدهای از اشیاء در فیلدهایShader،ColorFilter، یاBlendModeداشته باشد، همچنان فقط یک سایهزن قطعه GPU وجود دارد. هر گره در آن درخت یک تابع ایجاد میکند. کد برش و کد هندسه هرکدام یک تابع ایجاد میکنند. کد ترکیبی ممکن است تابعی ایجاد کند. سپس سایهزن قطعه کلی همه این توابع را فراخوانی میکند (که ممکن است توابع دیگری را فراخوانی کند، مثلاً درمورد درخت سایهزن).
جلوه AGSL شما یک تابع (یا توابع) را به سایهزن قطعه GPU اضافه میکند.
نحو پایه
AGSL (و GLSL) زبانهای مختص دامنه به سبک C هستند. انواعی مانند bool و
int معادلهای C خود را بهدقت دنبال میکنند؛ انواع دیگری برای
پشتیبانی از بردارها و ماتریسها وجود دارد که از عملکرد دامنه پشتیبانی میکنند.
میتوان توصیفکنندهها را برای راهنماییهای دقیق به انواع اعمال کرد، بهگونهای که برای زبانهای سایهزنی منحصربهفرد باشد. ساختارهای کنترلی مانند دستورات if-else بسیار شبیه به عملکردشان در C کار میکنند؛ این زبان همچنین از دستورات switch و حلقههای for با محدودیتهایی پشتیبانی میکند. برخیاز ساختارهای کنترلی به عبارتهای ثابتی نیاز دارند که بتوان آنها را در زمان ترجمه ارزیابی کرد.
AGSL از توابع پشتیبانی میکند؛ هر برنامه سایهزن با تابع main شروع میشود.
توابع تعریفشده توسط کاربر پشتیبانی میشوند، اما هیچ نوع بازگشتی پشتیبانی نمیشود.
توابع از قرارداد فراخوانی «مقدار-بازگشت» استفاده میکنند؛ مقادیری که به توابع منتقل میشوند
هنگام فراخوانی تابع در پارامترها کپی میشوند و خروجیها دوباره کپی میشوند؛
این امر توسط توصیفکنندههای in، out، و inout تعیین میشود.