Android グラフィック シェーディング言語(AGSL)

Android グラフィック シェーディング言語(AGSL)は、Android 13 以降でプログラム可能な RuntimeShader オブジェクトの動作を定義するために使用されます。AGSL は、その構文の多くを GLSL フラグメント シェーダーと共有しますが、Android グラフィック レンダリング システム内で機能し、Canvas 内のペイントのカスタマイズと View コンテンツのフィルタリングを行います。

運用理論

AGSL エフェクトは、より大規模な Android グラフィック パイプラインの一部として存在します。Android は、GPU アクセラレーションによる描画オペレーションを実行すると、必要な処理を実行するために単一の GPU フラグメント シェーダーをアセンブルします。通常、このシェーダーには複数のピースが含まれています。 たとえば、次のような情報です。

  • ピクセルが描画されるシェイプの内側か外側か(または、アンチ エイリアスを適用する可能性のある境界上)にあるかを評価します。
  • ピクセルがクリッピング領域の内側か外側にあるかを評価します(これもまた、境界ピクセルのアンチ エイリアス ロジックの可能性あり)。
  • PaintShader のロジック。シェーダーは、実際にはオブジェクトのツリーにすることができます(ComposeShader と、以下で説明するその他の機能により)。
  • ColorFilter についても同様のロジックを使用します。
  • 統合コード(特定のタイプの BlendMode 用)。
  • Android のカラー マネージメントの一部である色空間変換コード。
  • PaintShaderColorFilter、または BlendMode フィールドにオブジェクトの複雑なツリーがある場合でも、GPU フラグメント シェーダーは 1 つだけです。そのツリー内の各ノードが単一の関数を作成します。クリッピング コードとジオメトリ コードそれぞれで関数を作成します。ブレンディングのコードで関数を作成することもできます。その後、フラグメント シェーダー全体がこれらの関数をすべて呼び出します(シェーダー ツリーなどでは、他の関数を呼び出すことができます)。

AGSL 効果は、GPU のフラグメント シェーダーに 1 つまたは複数の関数を提供します。

基本的な構文

AGSL(および GLSL)は、C スタイルのドメイン固有言語です。boolint などの型は C の同等のものを厳密に追跡します。ドメインの機能をサポートするベクトルと行列をサポートする追加の型があります。

修飾子は、シェーディング言語に固有の方法で精度ヒントの型に適用できます。if-else ステートメントなどの制御構造は、C とよく似ています。この言語では switch ステートメントと for ループもサポートされています(制限付き)。制御構造によっては、コンパイル時に評価できる定数式が必要です。

AGSL は関数をサポートしています。すべてのシェーダー プログラムは main 関数から始まります。ユーザー定義関数はサポートされていますが、どのような再帰もサポートされていません。関数は「値リターン」呼び出し規則を使用します。関数に渡される値は、関数の呼び出し時にパラメータにコピーされ、出力はコピーされます。これは、inoutinout の修飾子によって決まります。