AGSL طوری طراحی شده است که تا حد زیادی با GLSL ES 1.0 سازگار باشد. برای اطلاعات بیشتر، تابع معادل در اسناد OpenGL ES Shading Language را ببینید. در صورت امکان، این اسناد تلاش میکند تا تفاوتهای بین 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 signed integer/vector |
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
تبدیل می کند.
اصلاح کننده | محدوده "شناور". | محدوده قدر "شناور". | دقت شناور | محدوده "int". |
---|---|---|---|---|
بالا | \(\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 پشتیبانی میشوند:
<نوع پایه>[<اندازه آرایه>] نام متغیر - مثال: half[10] x;
<base type> نام متغیر[<اندازه آرایه>] - ex: half x[10];
آرایه ها را نمی توان از یک تابع برگرداند، کپی کرد، اختصاص داد یا مقایسه کرد. محدودیت های آرایه به ساختارهای حاوی آرایه انتشار می یابد. آرایه ها را فقط می توان با استفاده از یک متغیر ثابت یا حلقه نمایه کرد.
مقدماتی
تایپ کنید | توضیحات |
---|---|
const | پارامتر تابع ثابت زمان کامپایل یا تابع فقط خواندنی. |
uniform | ارزش در سراسر پردازش اولیه تغییر نمی کند. یونیفرمها با استفاده از روشهای RuntimeShader برای setColorUniform ، setFloatUniform ، setIntUniform ، setInputBuffer و setInputShader از اندروید ارسال میشوند. |
in | برای پارامترهای تابع منتقل شده این پیش فرض است. |
out | برای پارامترهای تابع حذف شده باید از همان دقت تعریف تابع استفاده کرد. |
inout | برای پارامترهایی که هم به داخل و هم از یک تابع ارسال می شوند. باید از همان دقت تعریف تابع استفاده کرد. |
اعلام متغیر
اعلامیه ها باید در یک محدوده مهاربندی صریح باشند. اعلان y
در نمونه زیر مجاز نیست:
if (condition)
int y = 0;
مبانی ماتریس/ساختار/آرایه
نمونه های سازنده ماتریس
هنگامی که یک ماتریس با یک مقدار واحد ساخته می شود، به تمام مقادیر در امتداد مورب آن مقدار داده می شود، در حالی که به بقیه مقادیر صفر داده می شود. بنابراین float2x2(1.0)
یک ماتریس هویت 2x2 ایجاد می کند.
هنگامی که یک ماتریس با مقادیر متعدد ساخته می شود، ابتدا ستون ها پر می شوند (ستون-ترتیب اصلی).
توجه داشته باشید که برخلاف 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));
اجزای ماتریس
به اجزای یک ماتریس با نحو اشتراک آرایه دسترسی پیدا کنید.
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 | () | گروه بندی پرانتزی | N/A |
2 | [] () . ++ -- | فراخوانی تابع زیرنویس آرایه و فیلد ساختار سازنده یا انتخابگر روش، افزایش و کاهش swizzle postfix | از چپ به راست |
3 | ++ -- + - ! | پیشوند افزایش و کاهش unary | راست به چپ |
4 | * / | ضرب و تقسیم | از چپ به راست |
5 | + - | جمع و تفریق | از چپ به راست |
7 | < > <= >= | رابطه ای | از چپ به راست |
8 | == != | برابری/نابرابری | از چپ به راست |
12 | && | منطقی و | از چپ به راست |
13 | ^^ | XOR منطقی | از چپ به راست |
14 | || | منطقی OR | از چپ به راست |
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 } - پیش فرض آخرین مورد |
پرش کنید | 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) | زاویه ای را برمی گرداند که سینوس آن 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، -1.0، 0.0 یا 1.0 را برمیگرداند |
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) | اگر x < لبه، دیگری 1.0 باشد، 0.0 برمیگرداند |
GT step(float edge, GT x) | اگر x < لبه، دیگری 1.0 باشد، 0.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) | اگر نقطه (Nref، I) < 0، در غیر این صورت -N، N را برمیگرداند. |
GT reflect(GT I, GT N) | جهت بازتاب I - 2 * نقطه (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) | اگر هر جزء x true باشد 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 ایجاد کنید و آن را به صورت یکنواخت اضافه کنید. شما میتوانید این کار را برای هر شیدر انجام دهید، به این معنی که میتوانید مستقیماً هر شیدر اندرویدی را بدون اینکه ابتدا آن را به بیت مپ تبدیل کنید، از جمله دیگر اشیاء RuntimeShader ، ارزیابی کنید. این امکان انعطاف پذیری زیادی را فراهم می کند، اما ارزیابی سایه بان های پیچیده، به ویژه در یک حلقه، می تواند گران باشد.
uniform shader image;
image.eval(coord).a // The alpha channel from the evaluated image shader
نمونه برداری بافر خام
اگرچه بیشتر تصاویر حاوی رنگهایی هستند که باید با رنگها مدیریت شوند، برخی از تصاویر حاوی دادههایی هستند که در واقع رنگ نیستند، از جمله تصاویر ذخیرهسازی نرمال، ویژگیهای مواد (به عنوان مثال، ناهمواری)، نقشههای ارتفاع، یا هر داده کاملاً ریاضی دیگری که اتفاقاً در آن ذخیره میشود. یک تصویر هنگام استفاده از این نوع تصاویر در AGSL، می توانید از BitmapShader به عنوان یک بافر خام عمومی با استفاده از RuntimeShader#setInputBuffer استفاده کنید. با این کار از تغییر فضای رنگی و فیلتر جلوگیری می شود.