ข้อมูลอ้างอิงด่วนของ AGSL

AGSL ได้รับการออกแบบมาให้เข้ากันได้กับ GLSL ES 1.0 ส่วนใหญ่ ดูข้อมูลเพิ่มเติมได้ที่ฟังก์ชันที่เทียบเท่าในเอกสารประกอบภาษาการจัดแสง OpenGL ES เอกสารนี้จะพยายามระบุความแตกต่างระหว่าง AGSL และ GLSL หากเป็นไปได้

ประเภท

AGSL รองรับประเภท GLSL ES 1.0 พร้อมกับวิธีเพิ่มเติมในการแสดงประเภทเวกเตอร์และเมทริกซ์ AGSL รองรับ short และ half ประเภทอื่นๆ เพื่อแสดงค่าที่มีความแม่นยำปานกลาง

ประเภทพื้นฐาน

ประเภท คำอธิบาย
void ไม่มีค่าที่แสดงผลของฟังก์ชันหรือรายการพารามิเตอร์ว่าง ฟังก์ชันที่ไม่มีประเภทการคืนค่า 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 จึงมีความแม่นยำ/ระยะและint mediumpระยะที่รับประกันมากขึ้นhighp ตัวแก้ไขความแม่นยำสามารถใช้กับตัวแปรและพารามิเตอร์ที่เป็นสเกลาร์ เวกเตอร์ และเมทริกซ์ เรารับประกันเฉพาะค่าขั้นต่ำที่ระบุไว้ด้านล่างเท่านั้น 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.

ระบบรองรับเฉพาะอาร์เรย์ 1 มิติที่มีขนาดอาร์เรย์ที่ชัดเจน โดยใช้ไวยากรณ์สไตล์ 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;

ข้อมูลเบื้องต้นเกี่ยวกับเมทริกซ์/โครงสร้าง/อาร์เรย์

ตัวอย่างตัวสร้างเมทริกซ์

เมื่อสร้างเมทริกซ์ด้วยค่าเดียว ค่าทั้งหมดตามแนวทแยงจะได้รับค่านั้น ส่วนที่เหลือจะได้รับค่า 0 float2x2(1.0) จะสร้างเมทริกซ์เอกลักษณ์ 2x2

เมื่อสร้างเมทริกซ์ด้วยค่าหลายค่า ระบบจะกรอกข้อมูลในคอลัมน์ก่อน (ลําดับหลักตามคอลัมน์)

โปรดทราบว่าระบบไม่รองรับตัวสร้างที่ลดจํานวนคอมโพเนนต์ของเวกเตอร์ที่ส่งเข้ามา ซึ่งต่างจาก 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 [] () . ++ -- ตัวห้อยของอาร์เรย์ การเรียกใช้ฟังก์ชันและ โครงสร้างคอนสตรัคเตอร์ ช่องหรือเมธอด ตัวเลือก, swizzle การเพิ่มและลดลงต่อท้าย ซ้ายไปขวา
3 ++ -- + - ! คำนำหน้าการเพิ่มขึ้นและการลดลงแบบยูนาร์ ขวาไปซ้าย
4 * / คูณและหาร ซ้ายไปขวา
5 + - บวกและลบ ซ้ายไปขวา
7 < > <= >= เชิงสัมพันธ์ ซ้ายไปขวา
8 == != เท่ากับ/ไม่เท่ากับ ซ้ายไปขวา
12 && มีเหตุผลและ ซ้ายไปขวา
13 ^^ XOR เชิงตรรกะ ซ้ายไปขวา
14 || OR แบบตรรกะ ซ้ายไปขวา
15 ?\: การเลือก (Operand ทั้งหมด 1 รายการ) ซ้ายไปขวา
16 = += -= *= /= assignment arithmetic assignment arithmetic assignment ซ้ายไปขวา
17 , sequence ซ้ายไปขวา

การดำเนินการกับเมทริกซ์และเวกเตอร์

เมื่อใช้กับค่าสเกลาร์ โอเปอเรเตอร์ทางคณิตศาสตร์จะให้ผลลัพธ์เป็นค่าสเกลาร์ สำหรับโอเปอเรเตอร์ที่ไม่ใช่โมดูโล หากโอเปอเรนดหนึ่งเป็นสกัลาร์และอีกโอเปอเรนดหนึ่งเป็นเวกเตอร์หรือเมทริกซ์ ระบบจะดำเนินการกับองค์ประกอบต่างๆ และผลลัพธ์จะเป็นเวกเตอร์หรือเมทริกซ์ประเภทเดียวกัน หากการดำเนินการทั้ง 2 รายการเป็นเวกเตอร์ที่มีขนาดเท่ากัน ระบบจะดำเนินการกับองค์ประกอบ (และแสดงผลเวกเตอร์ประเภทเดียวกัน)

การดำเนินการ คำอธิบาย
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

ลูป "for" มีข้อจํากัดค่อนข้างมากเช่นเดียวกับ GLSL ES 1.0 เนื่องจากคอมไพเลอร์ต้องสามารถยกเลิกการวนลูปได้ ซึ่งหมายความว่าตัวเริ่มต้น เงื่อนไขการทดสอบ และคำสั่ง next ต้องใช้ค่าคงที่เพื่อให้ระบบประมวลผลทุกอย่างได้เมื่อคอมไพล์ คำสั่ง next จะจํากัดให้ใช้ ++, --, +=, or -= เท่านั้น

ฟังก์ชันในตัว

GT (ประเภททั่วไป) คือ float, float2, float3, float4 หรือ half, half2, half3, half4

ฟังก์ชันเหล่านี้ส่วนใหญ่จะทำงานแบบคอมโพเนนต์ (ใช้ฟังก์ชันต่อคอมโพเนนต์) ระบบจะระบุไว้หากไม่ใช่

มุมและฟังก์ชันตรีโกณมิติ

ระบบจะถือว่าพารามิเตอร์ฟังก์ชันที่ระบุเป็นมุมเป็นหน่วยเรเดียน ฟังก์ชันเหล่านี้จะไม่ทำให้เกิดข้อผิดพลาดหารด้วย 0 ไม่ว่าในกรณีใดก็ตาม หากตัวหารของอัตราส่วนเป็น 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 หารด้วย 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 ที่จำกัดระหว่าง 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) การเปลี่ยนรูปแบบพื้นที่สี

การสุ่มตัวอย่างชิดเดอร์ (การประเมิน)

ระบบไม่รองรับประเภท Sampler แต่คุณประเมิน Shader อื่นๆ ได้ หากต้องการสุ่มตัวอย่างพื้นผิว คุณสามารถสร้างออบเจ็กต์ BitmapShader แล้วเพิ่มเป็นยูนิฟอร์ม คุณทําเช่นนี้ได้กับเชดเดอร์ใดก็ได้ ซึ่งหมายความว่าคุณสามารถประเมินเชดเดอร์ Android ใดก็ได้โดยตรงโดยไม่ต้องเปลี่ยนเป็น Bitmap ก่อน รวมถึงออบเจ็กต์ RuntimeShader อื่นๆ วิธีนี้มีความยืดหยุ่นสูงมาก แต่การประเมินชิเดอร์ที่ซับซ้อนอาจใช้ทรัพยากรมาก โดยเฉพาะในลูป

uniform shader image;

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

การสุ่มตัวอย่างบัฟเฟอร์ดิบ

แม้ว่ารูปภาพส่วนใหญ่จะมีสีที่ควรจัดการสี แต่รูปภาพบางรูปก็มีข้อมูลที่ไม่ใช่สีจริงๆ ซึ่งรวมถึงรูปภาพที่จัดเก็บข้อมูลปกติ คุณสมบัติของวัสดุ (เช่น ความขรุขระ) แผนที่ความสูง หรือข้อมูลทางคณิตศาสตร์ล้วนๆ อื่นๆ ที่เก็บอยู่ในรูปภาพ เมื่อใช้รูปภาพประเภทเหล่านี้ใน AGSL คุณสามารถใช้ BitmapShader เป็นบัฟเฟอร์ดิบทั่วไปได้โดยใช้ RuntimeShader#setInputBuffer วิธีนี้จะช่วยหลีกเลี่ยงการเปลี่ยนรูปแบบและกรองพื้นที่สี