ภาษาการแรเงากราฟิกของ 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
ตัวอย่างเนื้อหาและโค้ดในหน้าเว็บนี้ขึ้นอยู่กับใบอนุญาตที่อธิบายไว้ในใบอนุญาตการใช้เนื้อหา Java และ OpenJDK เป็นเครื่องหมายการค้าหรือเครื่องหมายการค้าจดทะเบียนของ Oracle และ/หรือบริษัทในเครือ
อัปเดตล่าสุด 2025-07-27 UTC
[[["เข้าใจง่าย","easyToUnderstand","thumb-up"],["แก้ปัญหาของฉันได้","solvedMyProblem","thumb-up"],["อื่นๆ","otherUp","thumb-up"]],[["ไม่มีข้อมูลที่ฉันต้องการ","missingTheInformationINeed","thumb-down"],["ซับซ้อนเกินไป/มีหลายขั้นตอนมากเกินไป","tooComplicatedTooManySteps","thumb-down"],["ล้าสมัย","outOfDate","thumb-down"],["ปัญหาเกี่ยวกับการแปล","translationIssue","thumb-down"],["ตัวอย่าง/ปัญหาเกี่ยวกับโค้ด","samplesCodeIssue","thumb-down"],["อื่นๆ","otherDown","thumb-down"]],["อัปเดตล่าสุด 2025-07-27 UTC"],[],[],null,["# Android Graphics Shading Language (AGSL) is used by Android 13 and above to\ndefine the behavior of programmable\n[`RuntimeShader`](/reference/android/graphics/RuntimeShader) objects. AGSL\nshares much of its syntax with GLSL fragment shaders, but works within the\nAndroid graphics rendering system to both customize painting within `Canvas`\nand filter `View` content.\n\nTheory of operation\n-------------------\n\nAGSL effects exist as part of the larger Android graphics pipeline. When Android\nissues a GPU accelerated drawing operation, it assembles a single GPU fragment\nshader to do the required work. This shader typically includes several pieces.\nFor example, it might include:\n\n- Evaluating whether a pixel falls inside or outside of the shape being drawn (or on the border, where it might apply anti-aliasing).\n- Evaluating whether a pixel falls inside or outside of the clipping region (again, with possible anti-aliasing logic for border pixels).\n- Logic for the [`Shader`](/reference/android/graphics/Shader) on the [`Paint`](/reference/android/graphics/Paint). The Shader can actually be a tree of objects (due to [`ComposeShader`](/reference/android/graphics/ComposeShader) and other features described below).\n- Similar logic for the [`ColorFilter`](/reference/android/graphics/ColorFilter).\n- Blending code (for certain types of [`BlendMode`](/reference/android/graphics/BlendMode)).\n- Color space conversion code, as part of Android's color management.\n- When the `Paint` has a complex tree of objects in the `Shader`, `ColorFilter`, or `BlendMode` fields, there is still only a single GPU fragment shader. Each node in that tree creates a single function. The clipping code and geometry code each create a function. The blending code might create a function. The overall fragment shader then calls all of these functions (which may call other functions, e.g. in the case of a shader tree).\n\nYour AGSL effect contributes a function (or functions) to the GPU's fragment shader.\n\nBasic syntax\n------------\n\nAGSL (and GLSL) are C-style domain specific languages. Types such as `bool` and\n`int` closely track their C equivalents; there are additional types to\nsupport vectors and matrices that support domain functionality.\n\nQualifiers can be applied to types for precision hints in a way that's unique to shading languages. Control structures such as `if-else` statements work much\nlike they do in C; the language also provides support for `switch` statements\nand `for` loops with limitations. Some control structures require constant expressions that can be evaluated at compile time.\n\nAGSL supports functions; every shader program begins with the `main` function.\nUser defined functions are supported, without support for recursion of any kind.\nFunctions use a \"value-return\" calling convention; values passed to functions are\ncopied into parameters when the function is called, and outputs are copied\nback; this is determined by the `in`, `out`, and `inout` qualifiers."]]