ภาษาการแรเงากราฟิกของ Android (AGSL)

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