AGSL بهگونهای طراحی شده است که تا حد زیادی با GLSL ES 1.0 سازگار باشد. برای اطلاعات بیشتر، تابع معادل را در سند OpenGL ES Shading Language ببینید. درصورت امکان، این مستندات تلاش میکند تفاوتهای بین AGSL و GLSL را برجسته کند.
انواع
AGSL از انواع GLSL ES 1.0 بههمراه روشی اضافی برای نمایش انواع بردار و ماتریس پشتیبانی میکند. AGSL از انواع short و half اضافی برای نشان دادن
دقت متوسط پشتیبانی میکند.
انواع اصلی
| نوع | شرح |
|---|---|
void
|
مقدار برگشتی تابع وجود ندارد یا فهرست پارامتر خالی است. برخلاف GLSL، توابع بدون نوع پاسخ void باید مقداری را برگردانند. |
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 ۲×۲، ۳×۳، ۴×۴
|
half2x2, half3x3, half4x4 |
معادل با mediump float نوع ماتریس |
حداقلهای دقت و محدوده
اینها حداقل دقت و محدوده تضمینشده مرتبط با هر اصلاحکننده براساس مشخصات OpenGL ES 2.0 است. ازآنجاییکه اکثر دستگاهها
از ES 3.0 پشتیبانی میکنند، دقت/محدوده highp و محدوده int mediump تضمینشدهتری خواهند داشت. اصلاحکنندههای دقت را میتوان برای متغیرها و پارامترهای اسکالر، بردار، و ماتریس اعمال کرد. فقط حداقلهای فهرستشده در زیر تضمین میشوند؛
lowp لزوماً دقت کمتری نسبتبه mediump ندارد، و mediump
لزوماً دقت کمتری نسبتبه highp ندارد. AGSL درحالحاضر lowp را در خروجی نهایی به mediump تبدیل میکند.
| اصلاحکننده | محدوده «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]، نام مؤلفههای بردار برای بردارهای با طول ۲ تا ۴ با یک حرف نشان داده میشود. میتوان مؤلفهها را
تغییر داد و تکرار کرد. برای مثال: vect.yx، vect.yy
vect.xyzw - هنگام دسترسی به بردارهایی که نشاندهنده نقاط/بردار نرمال هستند استفاده کنید
vect.rgba - هنگام دسترسی به بردارهایی که رنگها را نشان میدهند استفاده کنید
vect.LTRB - زمانی استفاده میشود که بردار نشاندهنده مستطیل باشد (نه در GLSL)
در AGSL، میتوان از ۰ و ۱ برای تولید ۰ یا ۱ ثابت در آن کانال استفاده کرد.
مثال: vect.rgb1 == vec4(vect.rgb,1)
ساختارها و آرایهها
ساختارها با همان نحو GLSL اعلام میشوند، اما AGSL فقط از ساختارها در دامنه جهانی پشتیبانی میکند.
struct type-name {
members
} struct-name; // optional variable declaration.
فقط آرایههای ۱ بعدی با اندازه آرایه صریح پشتیبانی میشوند، بااستفاده از نحو سبک C یا سبک GLSL:
<base type>[<array size>] variable name - ex: half[10] x;
<base type> variable name[<array size>] - ex: half x[10];
آرایهها را نمیتوان از تابع برگرداند، کپی کرد، اختصاص داد، یا مقایسه کرد. محدودیتهای آرایه به ساختارهای حاوی آرایه گسترش مییابد. آرایهها را فقط میتوان بااستفاده از یک ثابت یا متغیر حلقه نمایهگذاری کرد.
دور انتخابی
| نوع | شرح |
|---|---|
const
|
ثابت زمان ترجمه، یا پارامتر تابع فقط خواندنی. |
uniform
|
مقدار در سراسر پردازش اولیه تغییر نمیکند.
یونیفرمها از Android بااستفاده از روشهای
RuntimeShader
برای setColorUniform، setFloatUniform،
setIntUniform، setInputBuffer، و
setInputShader منتقل میشوند. |
in
|
برای پارامترهای تابع ارسالشده. این گزینه پیشفرض است. |
out
|
برای پارامترهای تابع ارسالشده. باید از همان دقت تعریف تابع استفاده کند. |
inout
|
برای پارامترهایی که هم به تابع ارسال میشوند و هم از آن خارج میشوند. باید از همان دقت تعریف تابع استفاده کند. |
اعلام متغیر
اعلامها باید در یک محدوده صریح با آکولاد باشند. اعلام y در
نمونه زیر مجاز نیست:
if (condition)
int y = 0;
مبانی ماتریس/ساختار/آرایه
نمونههای سازنده ماتریس
وقتی ماتریسی با یک مقدار ساخته میشود، همه مقادیر درطول قطر آن مقدار را میگیرند، درحالیکه بقیه صفر میشوند. float2x2(1.0)
بنابراین یک ماتریس همانی ۲×۲ ایجاد میکند.
وقتی ماتریسی با چند مقدار ساخته میشود، ابتدا ستونها پر میشوند (ترتیب ستونمحور).
توجه داشته باشید که برخلاف GLSL، سازندههایی که تعداد مؤلفههای بردار ورودی را کاهش میدهند پشتیبانی نمیشوند، اما میتوانید از swizzling برای داشتن همان اثر استفاده کنید. برای ساختن 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));
عناصر Matrix
دسترسی به مؤلفههای ماتریس با نحو زیرنویس آرایه.
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 | && |
و منطقی | چپ به راست |
| 13 | ^^ |
یا انحصاری منطقی | چپ به راست |
| 14 | || |
یا منطقی | چپ به راست |
| 15 | ?\:
|
انتخاب (یک عملوند کامل) | چپ به راست |
| 16 | = += -= *= /=
|
تکلیف حساب تکلیف حساب تکلیف | چپ به راست |
| 17 | , |
توالی | چپ به راست |
عملیات ماتریس و بردار
وقتی عملگرهای حسابی روی مقادیر نردهای اعمال میشوند، نتیجه یک نردهای است. برای عملگرهای غیر از باقیمانده، اگر یک عملوند اسکالر و دیگری بردار یا ماتریس باشد، عملیات بهصورت مؤلفهای انجام میشود و نتیجه آن همان نوع بردار یا ماتریس است. اگر هر دو عملوند بردار هماندازه باشند، عمل بهصورت مؤلفهای انجام میشود (و همان نوع بردار را برمیگرداند).
| عملیات | شرح |
|---|---|
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 }
- default case last |
| پرش | break, continue, return (صرفنظر کردن مجاز نیست) |
| ورودی | half4 main(float2 fragCoord) |
محدودیتهای حلقه For
مشابه 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)
|
زاویهای را برمیگرداند که سینوس آن 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) |
براساس علامت x، مقدار -۱٫۰، ۰٫۰، یا ۱٫۰ را برمیگرداند |
GT floor(GT x) |
نزدیکترین عدد صحیح <= x |
GT ceil(GT x) |
نزدیکترین عدد صحیح >= x |
GT fract(GT x) |
بخش کسری x را برمیگرداند |
GT mod(GT x, GT y) |
مقدار x به پیمانه y را برمیگرداند |
GT mod(GT x, float y) |
مقدار x به پیمانه 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 را که بین ۰٫۰ و ۱٫۰ محدود شده است برمیگرداند |
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) |
اگر x < edge باشد، مقدار 0.0 را برمیگرداند، درغیراینصورت مقدار 1.0 را برمیگرداند |
GT step(float edge,
GT x) |
اگر x < edge باشد، مقدار 0.0 را برمیگرداند، درغیراینصورت مقدار 1.0 را برمیگرداند |
GT smoothstep(GT edge0,
GT edge1, GT x) |
وقتی edge0 < x < edge1 باشد، درونیابی هرمیت را بین ۰ و ۱ انجام میدهد |
GT smoothstep(float
edge0, float edge1,
GT x) |
درونیابی هرمیت را بین ۰ و ۱ وقتی edge0 < x < edge1 است انجام میدهد |
توابع هندسی
این توابع روی بردارها بهعنوان بردار عمل میکنند، نه بهصورت مؤلفهای. GT بردارهای اعشاری/نیمه در اندازههای ۲ تا ۴ است.
| عملکرد | شرح |
|---|---|
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) |
نرمالسازی بردار به طول ۱ |
GT faceforward(GT N,
GT I, GT Nref) |
اگر dot(Nref, I) < 0 باشد، N را برمیگرداند، درغیراینصورت 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» را بدون تبدیل کردن آن به Bitmap ارزیابی کنید، ازجمله دیگر اشیای RuntimeShader. این امر انعطافپذیری بسیار زیادی را فراهم میکند، اما ارزیابی سایهزنهای پیچیده میتواند پرهزینه باشد، بهویژه در یک حلقه.
uniform shader image;
image.eval(coord).a // The alpha channel from the evaluated image shader
نمونهبرداری میانگیر خام
اگرچه اکثر تصاویر حاوی رنگهایی هستند که باید مدیریت رنگ شوند، برخی تصاویر حاوی دادههایی هستند که درواقع رنگ نیستند، ازجمله تصاویری که نرمالها، ویژگیهای مواد (مثلاً زبری)، نقشههای ارتفاع، یا هر داده کاملاً ریاضی دیگری را که بهطور اتفاقی در تصویر ذخیره شده است ذخیره میکنند. هنگام استفاده از این نوع تصاویر در AGSL، میتوانید از BitmapShader بهعنوان میانگیر خام عمومی بااستفاده از RuntimeShader#setInputBuffer استفاده کنید. این کار از فیلتر کردن و تبدیل فضای رنگ جلوگیری میکند.