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

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 ที่ลงนามแล้ว จำนวนเต็ม/เวกเตอร์
half, half2, half3, half4 เทียบเท่ากับสเกลาร์/เวกเตอร์ mediump float
mat2, mat3, mat4
(float2x2, float3x3, float4x4)
เมทริกซ์ 2x2, 3x3, 4x4 float
half2x2, half3x3, half4x4 เทียบเท่ากับเมทริกซ์ mediump float ประเภท

ความแม่นยำและค่าต่ำสุดของช่วง

ซึ่งก็คือความแม่นยำขั้นต่ำและช่วงที่รับประกันซึ่งเชื่อมโยงกับการแสดงผล แป้นกดร่วมตามข้อกำหนด OpenGL ES 2.0 เนื่องจากอุปกรณ์ส่วนใหญ่ รองรับ ES 3.0 ก็จะมีการรับประกันความแม่นยํา/ช่วงของ highp และ ช่วง int mediump ตัวปรับแต่งความแม่นยำสามารถใช้กับสเกลาร์ เวกเตอร์ และ ตัวแปรและพารามิเตอร์ของเมทริกซ์ เรารับประกันจำนวนเงินขั้นต่ำที่แสดงด้านล่างนี้เท่านั้น lowp ไม่จำเป็นต้องมีความแม่นยำต่ำกว่า mediump และ mediump ไม่จำเป็นต้องมีความแม่นยำต่ำกว่า highp ขณะนี้ AGSL แปลง lowp เป็น mediump ในเอาต์พุตสุดท้าย

ตัวขยาย "Flo" ช่วง "Flo" ช่วงแมกนิจูด "Flo" ความแม่นยำ "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;

<ประเภทฐาน> ชื่อตัวแปร [<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 ที่ลดจำนวนส่วนประกอบของ ไม่สนับสนุนเวกเตอร์ที่ส่งผ่าน แต่คุณสามารถใช้ 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

ช่องโครงสร้าง

เลือกช่องโครงสร้างโดยใช้โอเปอเรเตอร์เครื่องหมายจุด . ผู้ให้บริการ ได้แก่

โอเปอเรเตอร์ คำอธิบาย
. ตัวเลือกช่อง
==, != Equality
= งาน

องค์ประกอบอาร์เรย์

คุณเข้าถึงองค์ประกอบอาร์เรย์ได้โดยใช้โอเปอเรเตอร์ตัวห้อยของอาร์เรย์ [ ] เช่น

diffuseColor += lightIntensity[3] * NdotL;

ผู้ให้บริการ

เรียงลำดับเลขตามลำดับความสำคัญ ด้านความสัมพันธ์และความเท่าเทียม โอเปอเรเตอร์ > &lt; <= >= == != ประเมินเป็นบูลีน วิธีเปรียบเทียบเวกเตอร์ ใช้ฟังก์ชันต่างๆ เช่น lessThan(), equal() ฯลฯ

โอเปอเรเตอร์ คำอธิบาย การเชื่อมโยง
1 () การจัดกลุ่มวงเล็บ ไม่มี
2 [] () . ++ -- ตัวห้อยอาร์เรย์ การเรียกใช้ฟังก์ชันและ โครงสร้างเครื่องมือสร้าง ฟิลด์หรือเมธอด ตัวเลือก, วิดีโอสั้นๆ ส่วนเพิ่มของ Postfix และ การลดลง ซ้ายไปขวา
3 ++ -- + - ! การเพิ่มคำนำหน้าและ การลดลงแบบรวม ขวาไปซ้าย
4 * / คูณและหาร ซ้ายไปขวา
5 + - บวกและลบ ซ้ายไปขวา
7 < > <= >= เชิงสัมพันธ์ ซ้ายไปขวา
8 == != ความเท่าเทียม/ไม่เท่ากัน ซ้ายไปขวา
12 && ใช้ตรรกะ AND ซ้ายไปขวา
13 ^^ XOR เชิงตรรกะ ซ้ายไปขวา
14 || มีเหตุผล หรือ ซ้ายไปขวา
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, "สำหรับ" ลูปค่อนข้างจำกัด คอมไพเลอร์จะต้องสามารถ เพื่อยกเลิกการวนซ้ำ ซึ่งหมายความว่าตัวเริ่มต้น เงื่อนไขการทดสอบ และ คำสั่ง 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 < ขอบ1
GT smoothstep(float edge0, float edge1, GT x) แสดงการประมาณค่า Hermite ระหว่าง 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 if จุด(Nref, I) < 0, else -N
GT reflect(GT I, GT N) ทิศทางการสะท้อน I - 2 * จุด(N,I) * N
GT refract(GT I, GT N, float/half eta) แสดงเวกเตอร์การหักเห

ฟังก์ชันเมตริกซ์

ประเภทเมทริกซ์คือเมทริกซ์สี่เหลี่ยมจัตุรัสประเภทใดก็ได้

การทำงาน คำอธิบาย
mat matrixCompMult(mat x, mat y) คูณ x ด้วย 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 ใดก็ได้โดยไม่ต้องเปลี่ยนให้เป็น บิตแมปก่อน รวมถึงรายการอื่นๆ ออบเจ็กต์ RuntimeShader วิธีนี้ช่วยให้ เพื่อความยืดหยุ่นอย่างมาก แต่เครื่องมือใส่เฉดสีที่ซับซ้อนอาจมีราคาแพง ประเมิน โดยเฉพาะในการทำงานแบบวนซ้ำ

uniform shader image;

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

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

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