Android グラフィック シェーディング言語(AGSL)は、Android 13 以降でプログラム可能な RuntimeShader
オブジェクトの動作を定義するために使用されます。AGSL は、その構文の多くを GLSL フラグメント シェーダーと共有しますが、Android グラフィック レンダリング システム内で機能し、Canvas
内のペイントのカスタマイズと View
コンテンツのフィルタリングを行います。
運用理論
AGSL エフェクトは、より大規模な Android グラフィック パイプラインの一部として存在します。Android は、GPU アクセラレーションによる描画オペレーションを実行すると、必要な処理を実行するために単一の GPU フラグメント シェーダーをアセンブルします。通常、このシェーダーには複数のピースが含まれています。 たとえば、次のような情報です。
- ピクセルが描画されるシェイプの内側か外側か(または、アンチ エイリアスを適用する可能性のある境界上)にあるかを評価します。
- ピクセルがクリッピング領域の内側か外側にあるかを評価します(これもまた、境界ピクセルのアンチ エイリアス ロジックの可能性あり)。
Paint
のShader
のロジック。シェーダーは、実際にはオブジェクトのツリーにすることができます(ComposeShader
と、以下で説明するその他の機能により)。ColorFilter
についても同様のロジックを使用します。- 統合コード(特定のタイプの
BlendMode
用)。 - Android のカラー マネージメントの一部である色空間変換コード。
Paint
のShader
、ColorFilter
、またはBlendMode
フィールドにオブジェクトの複雑なツリーがある場合でも、GPU フラグメント シェーダーは 1 つだけです。そのツリー内の各ノードが単一の関数を作成します。クリッピング コードとジオメトリ コードそれぞれで関数を作成します。ブレンディングのコードで関数を作成することもできます。その後、フラグメント シェーダー全体がこれらの関数をすべて呼び出します(シェーダー ツリーなどでは、他の関数を呼び出すことができます)。
AGSL 効果は、GPU のフラグメント シェーダーに 1 つまたは複数の関数を提供します。
基本的な構文
AGSL(および GLSL)は、C スタイルのドメイン固有言語です。bool
や int
などの型は C の同等のものを厳密に追跡します。ドメインの機能をサポートするベクトルと行列をサポートする追加の型があります。
修飾子は、シェーディング言語に固有の方法で精度ヒントの型に適用できます。if-else
ステートメントなどの制御構造は、C とよく似ています。この言語では switch
ステートメントと for
ループもサポートされています(制限付き)。制御構造によっては、コンパイル時に評価できる定数式が必要です。
AGSL は関数をサポートしています。すべてのシェーダー プログラムは main
関数から始まります。ユーザー定義関数はサポートされていますが、どのような再帰もサポートされていません。関数は「値リターン」呼び出し規則を使用します。関数に渡される値は、関数の呼び出し時にパラメータにコピーされ、出力はコピーされます。これは、in
、out
、inout
の修飾子によって決まります。