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

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

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

تنفيذ Shader

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