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 วิธีนี้จะช่วยหลีกเลี่ยงการเปลี่ยนรูปแบบและกรองพื้นที่สี