الاختلافات بين AGSL وGLSL

تتشابه لغة AGSL وGLSL جدًا في بناء الجملة، ما يتيح إمكانية نقل العديد من تأثيرات أداة تظليل الأجزاء GLSL إلى Android مع إجراء تغييرات طفيفة عليها. يعمل AGSL على إصلاح ميزة GLSL المعيّنة في GLSL ES 1.0 (لغة التظليل التي تستخدمها OpenGL ES 2.0) لتوفير أقصى مدى للوصول إلى الجهاز.

تتحكم أداة تظليل أجزاء GLSL في السلوك الكامل لوحدة معالجة الرسومات بين أداة تحويل نقطي وأجهزة المزج. يقوم هذا التظليل بكل الأعمال لحساب اللون، واللون الذي يولده هو بالضبط ما يتم تغذيته إلى مرحلة المزج من خط الأنابيب. عندما تكتب أداة تظليل بلغة AGSL، يعني ذلك أنك برمجة مرحلة من مسار رسومات Android. ويرجع ذلك إلى العديد من الاختلافات اللغوية.

تنفيذ التظليل

تمامًا كما هو الحال في أداة تظليل GLSL، يبدأ برنامج تظليل AGSL في التنفيذ في دالة رئيسية. على عكس GLSL، تأخذ الدالة موضع التظليل في الإحداثيات "المحلية" كمعلمة. يشبه ذلك gl_FragCoord، ولكن بدلاً من إحداثيات المخزن المؤقت للإطارات، قد تكون هذه الإحداثيات قد تمت ترجمتها قبل استدعاء التظليل الذي تستخدمه. بعد ذلك يعرض أداة التظليل لون البكسل كـ vec4 بدقة متوسطة أو عالية (مشابهة لـ out vec4 color أو gl_FragColor في GLSL).

mediump vec4 main(in vec2 fragCoord)

تنسيق المساحة

مسافات الإحداثيات في GLSL مقابل مساحات إحداثيات AGSL

Shader مرسوم باستخدام GLSL مقارنةً بأداة تظليل متطابقة قريبة مرسومة باستخدام AGSL

تستخدم لغة AGSL وGLSL مساحات إحداثيات مختلفة بشكل افتراضي. في GLSL، يكون إحداثي الجزء (fragCoord) نسبيًا إلى أسفل اليسار. يطابق AGSL نظام إحداثيات الشاشة لوحة الرسم، مما يعني أن المحور 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)

الدقة والأنواع

يمكن استخدام معدِّلات الدقة المتوافقة مع GLSL، إلا أنّ لغة AGSL توفّر نوعَي half وshort اللذين يمثّلان أيضًا دقة متوسطة.

يمكن تعريف أنواع المتجهات باسم <base type><columns>. يمكنك استخدام float2 بدلاً من vec2 وbool4 بدلاً من bvec4. يمكن تعريف أنواع المصفوفة باسم <base type><columns>x<rows>، وبالتالي float3x3 بدلاً من mat3. تسمح لغة AGSL أيضًا باستخدام تعريفات بنمط GLSL لـ mat وvec، ويتم ربط هذه الأنواع بمكافئاتها العائمة.

المعالج الأولي

لا يدعم لغة AGSL توجيهات المعالج المسبق بنمط GLSL. تحويل عبارات #define إلى متغيرات ثابتة. يدعم المحول البرمجي لـ AGSL الطي المستمر وإزالة الفروع للمتغيرات الثابتة، لذلك ستكون هذه فعالة.

مساحات الألوان

تطبيقات Android مُدارة بالألوان. تحدد مساحة لون لوحة الرسم مساحة لون العمل للرسم. يحتوي محتوى المصدر (مثل أدوات التظليل، بما في ذلك BitmapShader) على مسافات لونية أيضًا.

بالنسبة إلى بعض التأثيرات، مثل الإضاءة الدقيقة من الناحية المادية، يجب أن يتم إجراء العمليات الحسابية في مساحة لونية خطية. للمساعدة في ذلك، يوفر AGSL الدوال الأساسية التالية:

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

وتؤدي هذه الميزات إلى تحويل الألوان بين مساحة اللون النشطة ومساحة الألوان LINEAR_EXTENDED_SRGB في نظام التشغيل Android. تستخدم هذه المساحة الألوان الأساسية بنموذج sRGB (مجموعة ألوان)، ودالة نقل خطية. وهو يمثل قيمًا خارج السلسلة sRGB باستخدام قيم النطاق الموسع (أقل من 0.0 وأعلى من 1.0).

أزياء موحدة

نظرًا لأن AGSL لا يعرف ما إذا كانت الملابس الموحدة تحتوي على ألوان، فلن يقوم تلقائيًا بتطبيق تحويل لون عليها. يمكنك تصنيف half4/float4/vec4 باستخدام layout(color)، ما يتيح لنظام Android معرفة أنّه سيتم استخدام الزي كلون، ما يسمح لنظام Android بتحويل القيمة الموحّدة إلى مساحة لون عامل.

في لغة AGSL، أعلن عن الزي الرسمي على النحو التالي:

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())