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