Android 13 ขึ้นไปใช้ Android Graphics Shading Language (AGSL) เพื่อ
กำหนดลักษณะการทำงานของออบเจ็กต์RuntimeShader
ที่ตั้งโปรแกรมได้ AGSL
มีไวยากรณ์หลายอย่างที่คล้ายกับ GLSL Fragment Shader แต่ทำงานภายใน
ระบบการแสดงกราฟิกของ Android เพื่อปรับแต่งการวาดภาพภายใน Canvas
และกรองเนื้อหา View
ทฤษฎีการทำงาน
เอฟเฟกต์ AGSL เป็นส่วนหนึ่งของไปป์ไลน์กราฟิก Android ที่ใหญ่ขึ้น เมื่อ Android ออกคำสั่งการวาดภาพที่เร่งด้วย GPU ระบบจะประกอบโปรแกรม Shader ของ GPU Fragment เดียว เพื่อทำงานที่จำเป็น โดยปกติแล้ว Shader นี้จะมีหลายชิ้น เช่น
- การประเมินว่าพิกเซลอยู่ภายในหรือภายนอกรูปร่างที่วาด (หรือบนเส้นขอบ ซึ่งอาจใช้การลบรอยหยัก)
- ประเมินว่าพิกเซลอยู่ภายในหรือภายนอกภูมิภาคการตัด (อีกครั้งที่มีตรรกะการป้องกันรอยหยักที่เป็นไปได้สำหรับพิกเซลขอบ)
- ตรรกะสำหรับ
Shader
ในPaint
โดยที่ Shader อาจเป็นโครงสร้างของออบเจ็กต์ (เนื่องจากComposeShader
และฟีเจอร์อื่นๆ ที่อธิบายไว้ด้านล่าง) - ตรรกะที่คล้ายกันสำหรับ
ColorFilter
- รหัสการผสม (สำหรับ
BlendMode
บางประเภท) - โค้ดการแปลงพื้นที่สี ซึ่งเป็นส่วนหนึ่งของการจัดการสีของ Android
- เมื่อ
Paint
มีโครงสร้างออบเจ็กต์ที่ซับซ้อนในฟิลด์Shader
,ColorFilter
หรือBlendMode
ก็จะยังมีเพียง GPU Fragment Shader เดียว แต่ละโหนดในแผนผังนั้นจะสร้างฟังก์ชันเดียว โค้ดการตัดและโค้ดรูปทรงเรขาคณิตจะสร้างฟังก์ชันขึ้นมา โค้ดการผสมอาจสร้างฟังก์ชัน จากนั้น Fragment Shader โดยรวมจะเรียกใช้ฟังก์ชันทั้งหมดนี้ (ซึ่งอาจเรียกใช้ฟังก์ชันอื่นๆ เช่น ในกรณีของ Shader Tree)
เอฟเฟกต์ AGSL จะมีฟังก์ชัน (หรือฟังก์ชันต่างๆ) ที่มีส่วนร่วมใน Fragment Shader ของ GPU
ไวยากรณ์พื้นฐาน
AGSL (และ GLSL) เป็นภาษาเฉพาะโดเมนในรูปแบบภาษา C ประเภทต่างๆ เช่น bool
และ
int
จะติดตามค่าเทียบเท่าใน C อย่างใกล้ชิด นอกจากนี้ยังมีประเภทอื่นๆ ที่
รองรับเวกเตอร์และเมทริกซ์ที่รองรับฟังก์ชันการทำงานของโดเมน
คุณสามารถใช้ตัวระบุกับประเภทสำหรับคำแนะนำความแม่นยำในลักษณะเฉพาะของภาษาการแรเงา โครงสร้างควบคุม เช่น คำสั่ง if-else
จะทำงานคล้ายกับในภาษา C มาก ภาษา Go ยังรองรับคำสั่ง switch
และลูป for
โดยมีข้อจำกัด โครงสร้างการควบคุมบางอย่างต้องมีนิพจน์ค่าคงที่ที่ประเมินได้ในเวลาคอมไพล์
AGSL รองรับฟังก์ชัน โดยโปรแกรมเชดเดอร์ทุกโปรแกรมจะเริ่มต้นด้วยฟังก์ชัน main
ระบบรองรับฟังก์ชันที่ผู้ใช้กำหนดโดยไม่รองรับการเรียกซ้ำทุกประเภท
ฟังก์ชันใช้รูปแบบการเรียก "ส่งคืนค่า" โดยค่าที่ส่งไปยังฟังก์ชันจะ
คัดลอกไปยังพารามิเตอร์เมื่อมีการเรียกใช้ฟังก์ชัน และจะคัดลอกเอาต์พุต
กลับ ซึ่งจะกำหนดโดยตัวระบุ in
, out
และ inout