تم تصميم 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) |
عدد صحيح/ناقل signed highp
|
float, vec2, vec3, vec4 (float2, float3, float4)
|
highp (دقة واحدة) نقطة عائمة
سلعي/متّجه |
short, short2, short3, short4
|
ما يعادل mediump int signed
عدد صحيح/متّجه |
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. بما أنّ معظم الأجهزة
تتوافق مع ES 3.0، ستتوفّر فيها دقة/نطاق highp
مضمونان أكثر وint mediump
نطاق. يمكن تطبيق مُعدِّلات الدقة على متغيّرات ومقاييس المتّجهات والمصفوفات. لا يمكن ضمان سوى الحدود الدنيا المدرَجة أدناه، ويُرجى العِلم أنّ lowp
ليس بالضرورة أقل دقة من mediump
، وmediump
ليس بالضرورة أقل دقة من highp
. تحوّل AGSL حاليًا lowp
إلى mediump
في الإخراج النهائي.
أداة التعديل | نطاق "float" | نطاق قيمة "float" | دقة "float" | نطاق "int" |
---|---|---|---|---|
highp | \(\left\{-2^{62},2^{62}\right\}\) | \(\left\{2^{-62},2^{62}\right\}\) | النسبية: \(2^{-16}\) | \(\left\{-2^{16},2^{16}\right\}\) |
mediump | \(\left\{-2^{14},2^{14}\right\}\) | \(\left\{2^{-14},2^{14}\right\}\) | النسبية: \(2^{-10}\) | \(\left\{-2^{10},2^{10}\right\}\) |
lowp | \(\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;
<base type> اسم المتغيّر[<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، لا تتوفّر وظائف الإنشاء التي تقلّل من عدد مكوّنات ناقلاً
تم تمريره، ولكن يمكنك استخدام التبديل للحصول على أثر
الشيء نفسه. لإنشاء 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 | ++ -- + - !
|
الزيادة والنقصان البادئة unary | من اليمين إلى اليسار |
4 | * / |
الضرب والقسمة | من اليسار إلى اليمين |
5 | + - |
الجمع والطرح | من اليسار إلى اليمين |
7 | < > <= >= |
ارتباطية | من اليسار إلى اليمين |
8 | == != |
المساواة/عدم المساواة | من اليسار إلى اليمين |
12 | && |
منطقي و | من اليسار إلى اليمين |
13 | ^^ |
XOR منطقي | من اليسار إلى اليمين |
14 | || |
منطقي أو | من اليسار إلى اليمين |
15 | ?\:
|
اختيار (أحد المَعلمات الكاملة ) | من اليسار إلى اليمين |
16 | = += -= *= /=
|
تعيين حسابي تعيين حسابي تعيين | من اليسار إلى اليمين |
17 | , |
sequence | من اليسار إلى اليمين |
عمليات المصفوفات والمتجهات
عند تطبيق عوامل التشغيل الحسابية على القيم السلاسل، تؤدي إلى قيمة سلسة. بالنسبة إلى عوامل التشغيل غير عامل التشغيل modulo، إذا كان أحد الم Operand هو عدد скалري والآخر هو مصفوفة أو متجه، يتم تنفيذ العملية على مستوى المكوّنات وتؤدي إلى نوع المصفوفة أو المتجه نفسه. إذا كانت كلتا العمليتين متجهَين بالحجم نفسه، يتم تنفيذ العملية على مستوى المكوّنات (وتُعرِض نوع المتجه نفسه).
العملية | الوصف |
---|---|
m = f * m |
ضرب المصفوفة عنصرًا تلو الآخر في قيمة عددية |
v = f * v |
ضرب المتجه حسب المكوّنات في قيمة عددية |
v = v * v |
ضرب المتجه على مستوى المكوّنات في قيمة متّجه |
m = m + m |
الإضافة على مستوى مكونات المصفوفة |
m = m - m |
طرح المصفوفة حسب المكوّنات |
m = m * m |
الضرب الحسابي الخطي |
إذا كان أحد الم Operand هو متجه يتطابق مع حجم الصف أو العمود في المصفوفة، يمكن استخدام عامل الضرب للقيام بالضرب الحسابي للصفوف والأعمدة.
العملية | الوصف |
---|---|
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) |
قيود حلقة التكرار for
على غرار GLSL ES 1.0، تكون الحلقات "for" محدودة جدًا، ويجب أن يكون المُجمِّع قادرًا على
إلغاء لفّ الحلقة. وهذا يعني أنّه يجب أن يستخدم المُنشئ وشرط الاختبار وبيان
next
ثوابت حتى يمكن احتساب كل شيء في وقت compiling. تقتصر عبارة 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)
|
لعرض زاوية جيبها x في النطاق $ \left[-{\pi\over 2},{\pi\over 2}\right] $ |
GT acos(GT x)
|
لعرض زاوية جيب تمامها هو 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، وتعرِض 1.0 في الحالات الأخرى. |
GT step(float edge,
GT x) |
تعرِض القيمة 0.0 إذا كان x < edge، وتعرِض 1.0 في الحالات الأخرى. |
GT smoothstep(GT edge0,
GT edge1, GT x) |
تُجري عملية تداخل Hermite بين 0 و1 عندما يكون edge0 < x < edge1 |
GT smoothstep(float
edge0, float edge1,
GT x) |
تُجري عملية تداخل Hermite بين 0 و1 عندما يكون edge0 < x < edge1 |
الدوال الهندسية
تعمل هذه الدوال على المتجهات كمتجهات، وليس على أساس المكوّنات. 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 * dot(N,I) * N |
GT refract(GT I, GT N,
float/half eta) |
تُعرِض متّجه الانكسار. |
دوالّ المصفوفات
النوع mat هو أي نوع من أنواع المصفوفات المربّعة.
الوظيفة | الوصف |
---|---|
mat matrixCompMult(mat
x, mat y) |
ضرب x في y حسب المكوّنات |
mat inverse(mat m) |
عرض معكوس m |
الدوالّ المتعلّقة بالمتجه
قارِن بين المكوّنين x وy. يجب أن تتطابق أحجام متجهات الإدخال والإرجاع لمكالمة معيّنة. T هو تجميع لأنواع المتجهات الصحيحة وذات النقطة العائمة. BV هو متجه منطقي يتطابق مع حجم متجهات الإدخال.
الوظيفة | الوصف |
---|---|
BV lessThan(T x, T y) |
x < y |
BV lessThanEqual(T x,
T y) |
x <= y |
BV greaterThan(T x,
T y) |
x > y |
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 مباشرةً بدون تحويله إلى صورة نقطية أولاً، بما في ذلك عناصر RuntimeShader الأخرى. يتيح ذلك قدرًا كبيرًا من المرونة، ولكن قد يكون تقييم shaders المعقدة مكلفًا، خاصةً في حلقة.
uniform shader image;
image.eval(coord).a // The alpha channel from the evaluated image shader
أخذ عيّنات من مساحة التخزين المؤقت الأوّلية
على الرغم من أنّ معظم الصور تحتوي على ألوان يجب إدارتها، تحتوي بعض الصور على بيانات ليست ألوانًا في الواقع، بما في ذلك الصور التي تخزِّن القيم العادية أو خصائص المواد (مثل الخشونة) أو خرائط الارتفاع أو أي بيانات رياضية أخرى بحت يتم تخزينها في صورة. عند استخدام هذين النوعين من الصور في AGSL، يمكنك استخدام BitmapShader كعازلة أساسية عامة باستخدام RuntimeShader#setInputBuffer. سيؤدي ذلك إلى تجنُّب عمليات تحويل مساحة الألوان والفلترة.