एजीएसएल और जीएलएसएल के बीच अंतर

एजीएसएल और जीएलएसएल सिंटैक्स में काफ़ी मिलते-जुलते हैं. इसकी वजह से, कई जीएलएसएल फ़्रैगमेंट शेडर को अनुमति मिलती है Android पर कम से कम बदलाव के साथ इफ़ेक्ट लागू करने होंगे. एजीएसएल ने अपनी जीएलएसएल को ठीक किया GLSL ES 1.0 (OpenGL ES 2.0 में इस्तेमाल की जाने वाली शेडिंग भाषा) पर सेट की गई सुविधा ज़्यादा से ज़्यादा डिवाइस पहुंच के लिए उपलब्ध कराएं.

जीएलएसएल फ़्रैगमेंट शेडर, जीपीयू के पूरे व्यवहार को रास्टराइज़र और ब्लेंडिंग हार्डवेयर. यह शेडर रंग, और जो रंग इससे जनरेट होता है वह ब्लेंडिंग चरण में दिया जाता है तक ले जाया जा सकता है. एजीएसएल में शेडर लिखने का मतलब है कि Android ग्राफ़िक्स पाइपलाइन. भाषा में कई अंतर इसकी वजह हैं.

शेडर एक्ज़ीक्यूशन

जीएलएसएल शेडर की तरह ही, एजीएसएल शेडर भी मुख्य फ़ंक्शन में एक्ज़ीक्यूशन शुरू करता है. जीएलएसएल (जीएलएसएल) से अलग, यह फ़ंक्शन "स्थानीय" में शेडर का पोज़िशन लेता है निर्देशांक पैरामीटर. यह gl_FragCoord के जैसा है, लेकिन फ़्रेमबफ़र के बजाय अगर इन निर्देशांकों का अनुवाद किया गया है, तो शायद शेडर. इसके बाद, आपका शेडर पिक्सल का रंग vec4 के तौर पर मीडियम या ज़्यादा सटीक (जीएलएसएल में out vec4 color या gl_FragColor की तरह).

mediump vec4 main(in vec2 fragCoord)

जगह को व्यवस्थित करें

जीएलएसएल बनाम एजीएसएल कोऑर्डिनेट स्पेस

जीएलएसएल का इस्तेमाल करके बनाए गए शेडर बनाम एजीएसएल का इस्तेमाल करके बनाए गए करीब-करीब एक जैसे शेडर

एजीएसएल और जीएलएसएल, डिफ़ॉल्ट रूप से अलग-अलग कोऑर्डिनेट स्पेस का इस्तेमाल करते हैं. जीएलएसएल में, फ़्रैगमेंट निर्देशांक (frackCoord), नीचे बाईं ओर के सापेक्ष है. एजीएसएल, स्क्रीन से मेल खाता है कैनवस का कोऑर्डिनेट सिस्टम है, इसका मतलब है कि Y ऐक्सिस सबसे ऊपर बाएं कोने से शुरू होता है. ज़रूरत पड़ने पर, इन दो स्पेस को एक समान रिज़ॉल्यूशन में पास करके, उसके बीच बदल सकता है और Y ऐक्सिस की वैल्यू के लिए resolution.y - fragCoord.y का इस्तेमाल करें. इसके अलावा, आपके पास आपके शेडर पर लोकल ट्रांसफ़ॉर्मेशन मैट्रिक्स लागू कर सकते हैं.

// AGSL to GLSL coordinate space transformation matrix
val localMatrix = Matrix()
localMatrix.postScale(1.0f, -1.0f)
localMatrix.postTranslate(0.0f, viewHeight)
gridShader.setLocalMatrix(localMatrix)

प्रिसिज़न और टाइप

जीएलएसएल के साथ काम करने वाले सटीक मॉडिफ़ायर इस्तेमाल किए जा सकते हैं, लेकिन एजीएसएल एक साथ काम करता है half और short टाइप, जो मध्यम सटीक जानकारी देते हैं.

वेक्टर टाइप को नाम <base type><columns> के तौर पर बताया जा सकता है. Google Analytics 4 पर माइग्रेट करने के लिए, vec2 के बजाय float2 और bvec4 की जगह bool4. मैट्रिक्स टाइप को <base type><columns>x<rows> नाम से एलान किया जा सकता है, इसलिए mat3 के बजाय float3x3. एजीएसएल, जीएलएसएल शैली के एलानों की भी अनुमति देता है mat और vec के लिए और इन टाइप को उनके फ़्लोट पर मैप किया जाता है के बराबर है.

प्रीप्रोसेसर

एजीएसएल, जीएलएसएल शैली के साथ काम नहीं करता प्रीप्रोसेसर डायरेक्टिव के तौर पर इस्तेमाल किया जा सकता है. #परिभाषित स्टेटमेंट को कॉन्स वैरिएबल (कॉन्सटेंट) में बदलें. एजीएसएल का कंपाइलर कॉन्सट वैरिएबल के लिए, कॉन्सटैंट फ़ोल्डिंग और ब्रांच एलिमिनेशन का इस्तेमाल करें. इसलिए, ये आपके लिए कारगर साबित होगी.

कलर स्पेस

Android ऐप्लिकेशन रंग प्रबंधित किए जाते हैं. कैनवस का कलर स्पेस तय करता है ड्रॉइंग के लिए कलर स्पेस. सोर्स कॉन्टेंट (जैसे कि शेडर, BitmapShader) में कलर स्पेस भी होते हैं.

शारीरिक रूप से सटीक रोशनी जैसे कुछ इफ़ेक्ट के लिए, गणित के हिसाब से गणना की जानी चाहिए लीनियर कलर स्पेस में डालें. इसमें मदद करने के लिए, AGSL, स्थानीय इन्वेंट्री के फ़ंक्शन:

half3 toLinearSrgb(half3 color)
half3 fromLinearSrgb(half3 color)

ये वर्किंग कलर स्पेस और Android के बीच कलर को कन्वर्ट करते हैं LINEAR_EXTENDED_SRGB कलर स्पेस. उस स्पेस में, sRGB में बुनियादी रंग (गामट) और एक लीनियर का इस्तेमाल किया जाता है ट्रांसफ़र फ़ंक्शन. यह एक्सटेंडेड का इस्तेमाल करके, sRGB गेमट से बाहर की वैल्यू दिखाता है रेंज वैल्यू (0.0 से कम और 1.0 से ज़्यादा).

यूनिफ़ॉर्म

AGSL को यह पता नहीं चलता कि यूनिफ़ॉर्म में रंग हैं या नहीं, इसलिए यह अपने-आप लागू नहीं होगा उन्हें कलर कन्वर्ज़न कहते हैं. आप half4/float4/vec4 को इनसे लेबल कर सकते हैं: layout(color), जिससे Android को यह पता चलता है कि इस यूनिफ़ॉर्म का इस्तेमाल रंग, जिससे Android एक जैसी वैल्यू को काम करने वाले रंग में बदल पाता है स्पेस.

एजीएसएल में, यूनिफ़ॉर्म का एलान इस तरह करें:

layout(color) uniform half4 iColor;  // Input color
uniform float2 iResolution;          // Viewport resolution (pixels)

Android कोड में, आप यूनिफ़ॉर्म को इस तरह सेट कर सकते हैं:

shader.setColorUniform("iColor", Color.GREEN)
shader.setFloatUniform("iResolution", canvas.width.toFloat(), canvas.height.toFloat())