Android 圖形著色語言 (AGSL)

Android 13 以上版本會使用 Android 圖形著色語言 (AGSL) 定義可設定程式的 RuntimeShader 物件行為。AGSL 與 GLSL 片段著色器共用大部分的語法,但可在 Android 圖形轉譯系統中自訂 Canvas 中的繪製作業,以及篩選 View 內容。

運算理論

AGSL 效果屬於大型 Android 圖形管道的一部分。Android 發出 GPU 加速繪圖作業時,會組合單一 GPU 片段著色器來執行必要工作。這個著色器通常包含數個部分。例如:

  • 評估像素是否位於繪製的形狀內部或外部 (或邊框上可能會套用反鋸齒)。
  • 評估像素是否位於裁切區域內部或外部 (同樣可以對邊框像素有可能的反鋸齒邏輯)。
  • Paint 中的 Shader 邏輯。著色器實際上可以是物件的樹狀結構 (由於 ComposeShader 和下文所述的其他功能)。
  • ColorFilter 的類似邏輯。
  • 混合程式碼 (適用於特定類型的 BlendMode)。
  • 色域轉換程式碼,這是 Android 色彩管理的一部分。
  • PaintShaderColorFilterBlendMode 欄位中含有複雜的物件樹狀結構時,仍然只有一個 GPU 片段著色器。該樹狀結構中的每個節點都會建立一個函式。剪輯程式碼和幾何圖形程式碼會建立一個函式。混合程式碼可能會建立函式。接著,整體片段著色器會呼叫所有這些函式 (可能會呼叫其他函式,例如使用著色器樹狀結構的情況)。

AGSL 效果會為 GPU 的片段著色器提供函式 (或函式)。

基本語法

AGSL (和 GLSL) 是 C 式網域語言。boolint 等類型會密切追蹤其 C 的對等項目;您還可以使用其他類型支援網域功能的向量和矩陣。

限定詞可套用至類型以提供精確度提示,這是對語言底色的獨特方式。if-else 陳述式等控制結構的運作方式與在 C 中非常類似,語言也支援 switch 陳述式和 for 迴圈,但有限制。部分控制項結構需要可在編譯期間評估的常數運算式。

AGSL 支援函式;每個著色器程式都是從 main 函式開頭。支援使用者定義函式,不支援任何類型的遞迴。函式採用「值傳回」的呼叫慣例;傳送至函式的值會在呼叫函式時複製到參數中,並複製輸出內容 (取決於 inoutinout 限定詞)。