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

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

الأنواع

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

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

النوع الوصف
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 2x2 و 3x3 و 4x4
half2x2, half3x3, half4x4 مكافئة لـ mediump float نوع من المصفوفة

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

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

أداة التعديل "float" (عائم) النطاق المستهدَف "float" (عائم) نطاق المقدار "float" (عائم) مقياس صحة النموذج "int" النطاق المستهدَف
عالي \(\left\{-2^{62},2^{62}\right\}\) \(\left\{2^{-62},2^{62}\right\}\) القريب: \(2^{-16}\) \(\left\{-2^{16},2^{16}\right\}\)
متوسطp \(\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:

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

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

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

التصفيات

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

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

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

if (condition)
    int y = 0;

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

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

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

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

لاحظ أنه، على عكس GLSL، فإن الدوال الإنشائية التي تقلل من عدد مكونات لا يكون الخط المتجه الذي تم تمريره مدعومًا، ولكن يمكنك استخدام swsling للحصول على التأثير. لإنشاء 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;

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

يتم ترقيمها حسب الأولوية. العلاقة العلائقية والمساواة المشغلات > &lt; <= >= == != قم بالتقييم إلى قيمة منطقية. لمقارنة المتجهات من حيث المكوّنات، استخدِم دوال مثل 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\over{\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) تعرض 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، وother 1.0
GT step(float edge, GT x) عرض 0.0 إذا كانت x < Edge، وother 1.0
GT smoothstep(GT edge0, GT edge1, GT x) لإجراء استقراء هيرميت بين 0 و1 عندما تكون Edge0 < x < الحافة 1
GT smoothstep(float edge0, float edge1, GT x) لإجراء استقراء هيرميت بين 0 و1 عندما تكون Edge0 < x < الحافة 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، وإلا -N.
GT reflect(GT I, GT N) اتجاه الانعكاس I - 2 * نقطة(N,I) * شمال
GT refract(GT I, GT N, float/half eta) تعرض متّجه الانكسار

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

النوع حصيرة هو أي نوع مصفوفة مربعة.

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

الدوال العلائقية المتجهة

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

الوظيفة الوصف
BV lessThan(T x, T y) x < نعم
BV lessThanEqual(T x, T y) x <= y
BV greaterThan(T x, T y) x > نعم
BV greaterThanEqual(T x, T y) x >= y
BV equal(T x, T y) x == y
BV equal(BV x, BV y) x == 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 دون تحويلها إلى أداة يُرجى استخدام صورة Bitmap أولاً، بما في ذلك البيانات الأخرى كائنات RuntimeShader. هذا يسمح على قدر كبير من المرونة، لكن أدوات التظليل المعقدة قد تكون مكلفة إجراء تقييم، خاصة في التكرار الحلقي.

uniform shader image;

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

أخذ العينات من المخزن المؤقت الأولية

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