Android ग्राफ़िक्स शेडिंग लैंग्वेज (एजीएसएल)

Android 13 और इसके बाद के वर्शन, Android Graphics Shading Language (AGSL) का इस्तेमाल करते हैं. इससे प्रोग्राम किए जा सकने वाले RuntimeShader ऑब्जेक्ट के व्यवहार को तय किया जाता है. AGSL का सिंटैक्स, GLSL फ़्रैगमेंट शेडर के सिंटैक्स से काफ़ी मिलता-जुलता है. हालांकि, यह Android के ग्राफ़िक्स रेंडरिंग सिस्टम के साथ काम करता है. इससे Canvas में पेंटिंग को पसंद के मुताबिक बनाया जा सकता है. साथ ही, View कॉन्टेंट को फ़िल्टर किया जा सकता है.

काम करने का सिद्धांत

AGSL इफ़ेक्ट, Android की बड़ी ग्राफ़िक्स पाइपलाइन का हिस्सा होते हैं. जब Android, जीपीयू की मदद से ड्राइंग ऑपरेशन करता है, तो वह ज़रूरी काम करने के लिए एक ही जीपीयू फ़्रैगमेंट शेडर को इकट्ठा करता है. इस शेडर में आम तौर पर कई हिस्से शामिल होते हैं. उदाहरण के लिए, इसमें यह शामिल हो सकता है:

  • यह आकलन करना कि कोई पिक्सल, बनाई जा रही शेप के अंदर है या बाहर. इसके अलावा, यह भी आकलन करना कि वह बॉर्डर पर है या नहीं, जहां एंटी-एलियासिंग लागू हो सकती है.
  • यह आकलन करना कि कोई पिक्सल, क्लिपिंग क्षेत्र के अंदर है या बाहर (बॉर्डर पिक्सल के लिए, एंटी-एलियासिंग लॉजिक का इस्तेमाल किया जा सकता है).
  • Paint पर Shader के लिए लॉजिक. ComposeShader और यहां बताई गई अन्य सुविधाओं की वजह से, Shader असल में ऑब्जेक्ट का ट्री हो सकता है.
  • ColorFilter के लिए भी इसी तरह का लॉजिक इस्तेमाल किया जाता है.
  • ब्लेंडिंग कोड (कुछ तरह के BlendMode के लिए).
  • Android के कलर मैनेजमेंट का हिस्सा, कलर स्पेस कन्वर्ज़न कोड.
  • जब Paint में Shader, ColorFilter या BlendMode फ़ील्ड में ऑब्जेक्ट का जटिल ट्री होता है, तब भी सिर्फ़ एक जीपीयू फ़्रैगमेंट शेडर होता है. उस ट्री में मौजूद हर नोड, एक फ़ंक्शन बनाता है. क्लिपिंग कोड और ज्यामिति कोड, दोनों एक फ़ंक्शन बनाते हैं. ब्लेंडिंग कोड, फ़ंक्शन बना सकता है. इसके बाद, पूरा फ़्रैगमेंट शेडर इन सभी फ़ंक्शन को कॉल करता है.ये फ़ंक्शन, अन्य फ़ंक्शन को कॉल कर सकते हैं. उदाहरण के लिए, शेडर ट्री के मामले में.

आपका AGSL इफ़ेक्ट, जीपीयू के फ़्रैगमेंट शेडर में एक या उससे ज़्यादा फ़ंक्शन जोड़ता है.

बेसिक सिंटैक्स

AGSL (और GLSL), C-स्टाइल वाली डोमेन से जुड़ी खास भाषाएं हैं. bool और int जैसे टाइप, अपने C वर्शन को बारीकी से ट्रैक करते हैं. इसके अलावा, ऐसे अन्य टाइप भी हैं जो डोमेन फ़ंक्शन को सपोर्ट करने वाले वेक्टर और मैट्रिक्स को सपोर्ट करते हैं.

शेडिंग लैंग्वेज के लिए, सटीक जानकारी देने वाले हिंट के तौर पर क्वालिफ़ायर को टाइप पर लागू किया जा सकता है. कंट्रोल स्ट्रक्चर, जैसे कि if-else स्टेटमेंट, C की तरह ही काम करते हैं. यह भाषा, कुछ सीमाओं के साथ switch स्टेटमेंट और for लूप के लिए भी सहायता उपलब्ध कराती है. कुछ कंट्रोल स्ट्रक्चर के लिए, कॉन्स्टेंट एक्सप्रेशन की ज़रूरत होती है. इनका आकलन कंपाइल टाइम पर किया जा सकता है.

AGSL में फ़ंक्शन काम करते हैं. हर शेडर प्रोग्राम, main फ़ंक्शन से शुरू होता है. इसमें उपयोगकर्ता के तय किए गए फ़ंक्शन इस्तेमाल किए जा सकते हैं. हालांकि, इसमें किसी भी तरह के रिकर्सन का इस्तेमाल नहीं किया जा सकता. फ़ंक्शन, "वैल्यू-रिटर्न" कॉलिंग कन्वेंशन का इस्तेमाल करते हैं. फ़ंक्शन को पास की गई वैल्यू, फ़ंक्शन को कॉल किए जाने पर पैरामीटर में कॉपी की जाती हैं. साथ ही, आउटपुट वापस कॉपी किए जाते हैं. यह in, out, और inout क्वालिफ़ायर से तय होता है.