مرجع سريع للغة AGSL

تم تصميم لغة AGSL لتكون متوافقة إلى حد كبير مع GLSL ES 1.0. للحصول على مزيد من المعلومات، راجِع الدالة المكافئة في مستندات لغة التظليل في OpenGL ES. عندما يكون ذلك ممكنًا، تحاول هذه الوثائق توضيح الاختلافات بين AGSL وGLSL.

الأنواع

يدعم AGSL أنواع GLSL ES 1.0 إلى جانب طريقة إضافية لتمثيل أنواع المتجهات والمصفوفة. يدعم AGSL أنواع short وhalf إضافية لتمثيل الدقة المتوسطة.

الأنواع الأساسية

Type الوصف
void لا توجد قيمة لعرض الدالة أو قائمة معلمات فارغة. على عكس GLSL، يجب أن تعرض الدوال التي لا يكون لها نوع إرجاع فارغ قيمةً.
bool, bvec2, bvec3, bvec4
(bool2, bool3, bool4).
مقياس/متجه منطقي
int, ivec2, ivec3, ivec4
(int2, int3, int4)
عدد صحيح/متجه بعلامة highp
float, vec2, vec3, vec4
(float2, float3, float4)
النقطة العائمة لـ highp (دقة واحدة) المتجه/العدد القياسي
short, short2, short3, short4 مكافئ للعدد الصحيح/المتجه بعلامة mediump int
half, half2, half3, half4 يعادل قيمة عددية/متجه mediump float
mat2, mat3, mat4
(float2x2, float3x3, float4x4)
مصفوفة float 2×2 و3×3 و4×4
half2x2, half3x3, half4x4 يعادل mediump float نوع من المصفوفات

الدقة والحد الأدنى للنطاق

هذه هي الحد الأدنى من الدقة المضمونة والنطاق المرتبط بكل معدِّل استنادًا إلى مواصفات OpenGL ES 2.0. وبما أنّ معظم الأجهزة تتوافق مع الإصدار 3.0 من معيار ES، سيكون لديها نطاق/دقة highp أكثر ونطاق int mediump أكثر ضمانًا. يمكن تطبيق معدِّلات الدقة على متغيرات ومعاملات العدد القياسي والمتجهات والمصفوفة. القيم الصغرى الواردة أدناه هي فقط مضمونة، فليس بالضرورة أن تكون الدقة lowp أقل من mediump، وليس بالضرورة أن تكون الدقة mediump أقل من highp. تعمل لغة AGSL حاليًا على تحويل lowp إلى mediump في الإخراج النهائي.

أداة التعديل نطاق "عائم" نطاق المقدار "العائم" الدقة "العائمة" نطاق "عدد صحيح"
مرتفع \(\left\{-2^{62},2^{62}\right\}\) \(\left\{2^{-62},2^{62}\right\}\) قريب: \(2^{-16}\) \(\left\{-2^{16},2^{16}\right\}\)
متوسط \(\left\{-2^{14},2^{14}\right\}\) \(\left\{2^{-14},2^{14}\right\}\) قريب: \(2^{-10}\) \(\left\{-2^{10},2^{10}\right\}\)
منخفض \(\left\{-2,2\right\}\) \(\left\{2^{-8},2\right\}\) القيمة المطلقة: \(2^{-8}\) \(\left\{-2^{8},2^{8}\right\}\)

بالإضافة إلى بنية نص منخفض رقمي لصفيف، مثلاً: var[num], names of vector components for vectors of length 2 - 4 are denoted by a single letter. Components can be swizzled and replicated. ex:vect.yx,vect.yy`

vect.xyzw - الاستخدام عند الوصول إلى المتجهات التي تمثل نقاطًا/وحدات عادية

vect.rgba - استخدمه عند الوصول إلى المتجهات التي تمثل الألوان

vect.LTRB - تُستخدم عندما يمثل المتجه مستطيلاً (وليس في GLSL)

في لغة AGSL، يمكن استخدام 0 و1 لإنتاج 0 أو 1 ثابت في تلك القناة. مثال: vect.rgb1 == vec4(vect.rgb,1)

المنشآت والمصفوفات

يتم تعريف المنشآت باستخدام نفس بناء الجملة مثل GLSL، لكن لغة AGSL تدعم فقط البُنى على النطاق العالمي.

struct type-name {
 members
} struct-name; // optional variable declaration.

يمكن استخدام صفائف أحادية البُعد فقط مع حجم صفيف واضح، وذلك باستخدام بنية بنمط C أو GLSL:

<نوع القاعدة>[<array size>] اسم المتغيّر - مثال: half[10] x;

<base type> اسم المتغيّر[<array size>] - مثال: half x[10];

لا يمكن عرض الصفائف من دالة أو نسخها أو تعيينها أو مقارنتها. يتم نشر قيود المصفوفات على البُنى التي تحتوي على مصفوفات. لا يمكن فهرسة الصفائف إلا باستخدام متغير ثابت أو تكرار حلقي.

التصفيات

Type الوصف
const ثابت وقت التجميع، أو معلمة دالة للقراءة فقط.
uniform لا تتغير القيمة عبر العناصر الأساسية التي تتم معالجتها. يتم نقل الأزياء من Android باستخدام طُرق RuntimeShader لـ setColorUniform وsetFloatUniform وsetIntUniform وsetInputBuffer وsetInputShader.
in لمعلمات الدالة التي يتم تمريرها. وهذا هو الخيار التلقائي.
out لمعلمات الدوال التي تم تمريرها. يجب استخدام نفس الدقة مثل تعريف الدالة.
inout بالنسبة إلى المعلمات التي يتم تمريرها داخل دالة وخارجها. يجب استخدام نفس الدقة مثل تعريف الدالة.

تعريف المتغيّر

يجب أن تكون الإقرارات ضِمن نطاق معقّد صريح. إعلان y في النموذج التالي غير مسموح به:

if (condition)
    int y = 0;

أساسيات المصفوفة/البنية/الصفيف

أمثلة على دالة إنشاء المصفوفة

عند إنشاء مصفوفة بقيمة واحدة، يتم إعطاء جميع القيم على طول القطر هذه القيمة، بينما يتم إعطاء الباقي أصفار. وبالتالي، تنشئ float2x2(1.0) مصفوفة هوية 2×2.

عند إنشاء مصفوفة بقيم متعددة، يتم ملء الأعمدة أولاً (ترتيب الأعمدة الرئيسي).

لاحظ أنه على عكس GLSL، لا يتم دعم المنشئات التي تقلل من عدد مكونات المتجه العابر، ولكن يمكنك استخدام الضغط للحصول على التأثير ذاته. لإنشاء vec3 من vec4 بلغة AGSL بنفس سلوك GLSL، حدِّد vec3 nv = quadVec.xyz.

مثال على الدالة الإنشائية للبنية

struct light { float intensity; float3 pos; };
// literal integer constants auto-converted to floating point
light lightVar = light(3, float3(1, 2, 3.0));

مكونات المصفوفة

الوصول إلى مكونات المصفوفة ذات بناء الجملة المرتبط بصفيف.

float4x4 m; // represents a matrix
m[1] = float4(2.0); // sets second column to all 2.0
m[0][0] = 1.0; // sets upper left element to 1.0
m[2][3] = 2.0; // sets 4th element of 3rd column to 2.0

بنية الحقول

اختَر حقول البنية باستخدام عامل التشغيل النقطة .. وتشمل عوامل التشغيل ما يلي:

المشغل الوصف
. أداة اختيار الحقول
==, != المساواة
= مهمة

عناصر المصفوفة

يمكن الوصول إلى عناصر المصفوفة باستخدام عامل تشغيل الصفيفة المنخفض [ ]. مثلاً:

diffuseColor += lightIntensity[3] * NdotL;

عوامل التشغيل

يتم ترقيمها بترتيب الأسبقية. يتم تقييم عوامل التشغيل الارتباطية والمساواة > < <= >= == != إلى قيمة منطقية. للمقارنة بين المتجهات من حيث المكوّنات، استخدِم دوال مثل lessThan() وequal() وما إلى ذلك.

المشغل الوصف الارتباط
1 () تجميع بين قوسين لا ينطبق
2 [] () . ++ -- صفيف من اليسار إلى اليمين
3 ++ -- + - ! زيادة في البادئة وإنقاص الأحادي من اليمين إلى اليسار
4 * / الضرب والقسمة من اليسار إلى اليمين
5 + - الجمع والطرح من اليسار إلى اليمين
7 < > <= >= ارتباطية من اليسار إلى اليمين
8 == != المساواة/عدم المساواة من اليسار إلى اليمين
12 && المنطقي AND من اليسار إلى اليمين
13 ^^ XOR منطقي من اليسار إلى اليمين
14 || منطقي OR من اليسار إلى اليمين
15 ?\: التحديد (معامل واحد كامل) من اليسار إلى اليمين
16 = += -= *= /= مهمة حسابية مهمة حسابية مهمة من اليسار إلى اليمين
17 , sequence من اليسار إلى اليمين

عمليات المصفوفة والمتجهات

وعند تطبيقها على القيم العددية، ينتج عن العوامل الحسابية مقياس. بالنسبة للعوامل بخلاف باقي القسمة، إذا كان أحد المعاملين مقياسًا والآخر كان متجهًا أو مصفوفة، يتم تنفيذ العملية مكونًا من مكونات مختلفة وينتج عنها نفس نوع المتجه أو المصفوفة. إذا كانت كلتا العمليتين متجهتين من نفس الحجم، يتم تنفيذ العملية مكونة من أجزاء (وتُرجع نفس نوع المتجه).

العملية الوصف
m = f * m ضرب المصفوفة من حيث المكونات في قيمة عددية
v = f * v ضرب الخط المتجه في مكونات الحساب في قيمة عددية
v = v * v ضرب الخط المتجه في المكونات في قيمة متجه
m = m + m إضافة مكونات المصفوفة
m = m - m عملية الطرح من مكونات المصفوفة
m = m * m الضرب الجبري الخطي

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

العملية الوصف
m = v * m متّجه الصف * مصفوفة الضرب الجبري الخطي
m = m * v الضربة الجبرية الخطية لمتّجه المصفوفة * العمود

استخدم الدوال المضمنة لمنتج النقطة المتجهة، وحاصل الضرب الاتجاهي، والضرب على مستوى المكونات:

الوظيفة الوصف
f = dot(v, v) ضرب نقطي متّجه
v = cross(v, v) حاصل ضرب الضرب الاتجاهي المتّجه
m = matrixCompMult(m, m) الضرب في المكونات

التحكم في البرنامج

استدعاء الدالة الاتصال حسب القيمة العائدة
التكرار for (<init>;<test>;<next>)
{ break, continue }
الاختيار if ( ) { }
if ( ) { } else { }
switch () { break, case } - آخر حالة للحالة التلقائية
قفز break, continue, return
(غير مسموح بالرفض)
الإدخال half4 main(float2 fragCoord)

لقيود التكرار

على غرار GLSL ES 1.0، تكون حلقات "for" محدودة للغاية؛ حيث يجب أن يكون المحول البرمجي قادرًا على عرض التكرار الحلقي. وهذا يعني أنّ المُبدأ وحالة الاختبار وعبارة next يجب أن تستخدم ثوابت حتى يمكن حساب كل شيء في وقت التجميع. تقتصر عبارة next على استخدام السمة ++, --, +=, or -= أيضًا.

الدوال المضمنة

GT (النوع العام) هو float أو float2 أو float3 أو float4 أو half أو half2 أو half3 أو half4.

تعمل معظم هذه الدوال من ناحية المكونات (يتم تطبيق الدالة لكل مكون). وتتم ملاحظتها عندما لا يكون الأمر كذلك.

الزاوية والدوال المثلثية

يُفترض أن تكون معلمات الدالة المحددة كزاوية بوحدات الراديان. لن ينتج عن أي من هذه الدوال بأي حال من الأحوال خطأ القسمة على صفر. إذا كان قاسم النسبة 0، ستكون النتائج غير محددة.

الوظيفة الوصف
GT radians(GT degrees) لتحويل الدرجات إلى وحدات راديان
GT degrees(GT radians) لتحويل وحدات الراديان إلى درجات
GT sin(GT angle) جيب الزاوية العادي
GT cos(GT angle) جيب التمام العادي
GT tan(GT angle) ظل عادي
GT asin(GT x) لعرض زاوية يكون جيبها س في نطاق $ \left[-{\pi\over 2},{\pi\over 2}\right] $
GT acos(GT x) لعرض زاوية جيب التمام فيها س في نطاق $ \left[0,\pi\right] $
GT atan(GT y, GT x) لعرض زاوية قوس قوس الظل المثلثي $ \left[{y\over x}\right] $ في نطاق $ \left[-\pi,\pi\right] $
GT atan(GT y_over_x) لعرض زاوية يكون قوس ظلها المثلثي y_over_x في نطاق $ \left[-{\pi\over 2},{\pi\over 2}\right] $

الدوال الأُسيّة

الوظيفة الوصف
GT pow(GT x, GT y) عرض $ x^y $
GT exp(GT x) تؤدي إلى إرجاع $ e^x $
GT log(GT x) إرجاع $ ln(x) $
GT exp2(GT x) عرض $ 2^x $
GT log2(GT x) لعرض $ log_2(x) $
GT sqrt(GT x) عرض $ \sqrt{x} $
GT inversesqrt(GT x) عرض $ 1\أكثر{\sqrt{x}} $

الدوال الشائعة

الوظيفة الوصف
GT abs(GT x) قيمة مطلقة
GT sign(GT x) عرض -1.0 أو 0.0 أو 1.0 بناءً على علامة x
GT floor(GT x) أقرب عدد صحيح <= x
GT ceil(GT x) أقرب عدد صحيح >= x
GT fract(GT x) عرض الجزء الكسري من x
GT mod(GT x, GT y) لعرض قيمة x modulo y
GT mod(GT x, float y) لعرض قيمة x modulo y
GT min(GT x, GT y) لعرض القيمة الصغرى x أو y
GT min(GT x, float y) لعرض القيمة الصغرى x أو y
GT max(GT x, GT y) لعرض القيمة القصوى x أو y
GT max(GT x, float y) لعرض القيمة القصوى x أو y
GT clamp(GT x, GT minVal, GT maxVal) لعرض x مثبّت بين minVal وmaxVal.
GT clamp(GT x, float minVal, float maxVal) لعرض x مثبتة بين minVal وmaxVal
GT saturate(GT x) لعرض × ثابت بين 0.0 و1.0
GT mix(GT x, GT y GT a) عرض مزيج خطي لـ x وy
GT mix(GT x, GT y, float a) عرض مزيج خطي لـ x وy
GT step(GT edge, GT x) عرض 0.0 إذا كانت x < Edge, else 1.0
GT step(float edge, GT x) عرض 0.0 إذا كانت x < Edge, else 1.0
GT smoothstep(GT edge0, GT edge1, GT x) يتم تنفيذ إقحام هيرميت بين 0 و1 عند الحافة0 < س < حافة1
GT smoothstep(float edge0, float edge1, GT x) يتم تنفيذ إقحام هيرميت بين 0 و1 عند الحافة0 < س < حافة1

الدوال الهندسية

تعمل هذه الدوال على المتجهات كمتجهات، وليس من حيث المكونات. GT عبارة عن متجهات عائمة/نصف متجهة بأحجام 2-4.

الوظيفة الوصف
float/half length (GT x) لعرض طول المتّجه
float/half distance(GT p0, GT p1) لعرض المسافة بين النقاط
float/half dot(GT x, GT y) إرجاع المنتجات النقطية
float3/half3 cross(float3/half3 x, float3/half3 y) عرض المنتَجات المتقاطعة
GT normalize(GT x) مواءمة الخط المتجه إلى الطول 1
GT faceforward(GT N, GT I, GT Nref) تعرض N إذا كانت dot(Nref, I) < 0, else -N.
GT reflect(GT I, GT N) اتجاه الانعكاس I - 2 * dot(N,I) * N.
GT refract(GT I, GT N, float/half eta) عرض متّجه الانكسار

دوال المصفوفة

Type mat هي أي نوع مصفوفة مربعة.

الوظيفة الوصف
mat matrixCompMult(mat x, mat y) ضرب x في y على مستوى المكوِّن
mat inverse(mat m) لعرض معكوس m

الدوال الارتباطية المتجهة

المقارنة بين مكوّنات س وص. يجب أن تتطابق أحجام متجهات الإدخال والإرجاع لاستدعاء معين. T هو اتحاد الأعداد الصحيحة وأنواع متجهات النقطة العائمة. BV هو متجه منطقي يتطابق مع حجم متجهات الإدخال.

الوظيفة الوصف
BV lessThan(T x, T y) س < ص
BV lessThanEqual(T x, T y) س <= ص
BV greaterThan(T x, T y) س > ص
BV greaterThanEqual(T x, T y) x >= y
BV equal(T x, T y) س == ص
BV equal(BV x, BV y) س == ص
BV notEqual(T x, T y) x != y
BV notEqual(BV x, BV y) x != y
bool any(BV x) true إذا كان أي مكون في x هو true
bool all(BV x) true إذا كانت جميع عناصر x true.
BV not(BV x) التكامل المنطقي لـ x

دوال الألوان

الوظيفة الوصف
vec4 unpremul(vec4 color) لتحويل قيمة اللون إلى ألفا غير مضاعفة مسبقًا
half3 toLinearSrgb(half3 color) تحويل مساحة اللون إلى تنسيق SRGB الخطي
half3 fromLinearSrgb(half3 color) تحويل مساحة اللون

تحليل العيّنات (التقييم)

أنواع العينات غير متوافقة، ولكن يمكنك تقييم أدوات التظليل الأخرى. إذا كنت بحاجة إلى عيّنة من زخرفة، يمكنك إنشاء كائن BitmapShader وإضافته بشكل موحد. ويمكنك إجراء ذلك مع أي أداة تظليل، أي أنّه يمكنك تقييم أي جهاز Android Shader مباشرةً بدون تحويله إلى صورة نقطية أولاً، بما في ذلك عناصر RuntimeShader الأخرى. يتيح ذلك قدرًا كبيرًا من المرونة، ولكن تقييم أدوات التظليل المعقّدة قد يكون مكلفًا، خاصةً في حلقة مفرغة.

uniform shader image;

image.eval(coord).a   // The alpha channel from the evaluated image shader

عيّنة من المورد الاحتياطي الأولي

على الرغم من أن معظم الصور تحتوي على ألوان يجب إدارتها حسب الألوان، إلا أن بعض الصور تحتوي على بيانات ليست ألوانًا في الواقع، بما في ذلك الصور التي تخزن القيم العادية أو الخصائص المادية (مثل الخشنة) أو خرائط الارتفاع أو أي بيانات رياضية أخرى يتم تخزينها في صورة. عند استخدام هذه الأنواع من الصور في AGSL، يمكنك استخدام BitmapShader كمخزن مؤقّت عام للبيانات باستخدام RuntimeShader#setInputBuffer. سيؤدي هذا إلى تجنب تحويل مساحة اللون والتصفية.