AGSL クイック リファレンス

AGSL は、GLSL ES 1.0 とほぼ互換性があるように設計されています。詳細については、OpenGL ES シェーディング言語のドキュメントで同等の関数をご覧ください。このドキュメントでは、可能であれば AGSL と GLSL の違いを説明しています。

AGSL は、GLSL ES 1.0 型と、ベクトルと行列型を表す追加の方法をサポートしています。AGSL は、中精度を表す追加の short 型と half 型をサポートしています。

基本型

タイプ 説明
void 関数の戻り値がない、またはパラメータリストが空である。GLSL とは異なり、void 戻り値型のない関数は値を返す必要があります。
bool, bvec2, bvec3, bvec4
(bool2, bool3, bool4)
ブール値スカラー/ベクトル
int, ivec2, ivec3, ivec4
(int2, int3, int4)
highp 符号付き整数/ベクトル
float, vec2, vec3, vec4
(float2, float3, float4)
highp(単精度)浮動小数点スカラー/ベクトル
short, short2, short3, short4 mediump int 符号付き整数/ベクトルに相当
half, half2, half3, half4 mediump float スカラー/ベクトルに相当
mat2, mat3, mat4
(float2x2, float3x3, float4x4)
2x2、3x3、4x4 の float マトリックス
half2x2, half3x3, half4x4 mediump float マトリックス タイプと同等

精度と範囲の最小値

これらは、OpenGL ES 2.0 仕様に基づく、各修飾子に関連付けられた最小保証精度と範囲です。ほとんどのデバイスは ES 3.0 をサポートしているため、highp の精度/範囲と int mediump の範囲がより保証されます。精度修飾子は、スカラー、ベクトル、行列の変数とパラメータに適用できます。保証されるのは、以下の最小値のみです。lowp が実際に mediump よりも低精度であるとは限りません。また、mediumphighp よりも低精度であるとは限りません。現在、AGSL は最終出力で lowpmediump に変換します。

修飾子 'float' の範囲 浮動小数点数の大きさの範囲 浮動小数点数精度 'int' の範囲
highp {262,262} {262,262} 相対: 216 {216,216}
mediump {214,214} {214,214} 相対: 210 {210,210}
lowp {2,2} {28,2} 絶対値: 28 {28,28}

配列数値サブスクライバー構文(例: var[num], names of vector components for vectors of length 2 - 4 are denoted by a single letter. Components can be swizzled and replicated. ex:vect.yx,vect.yy)に加えて、

vect.xyzw - ポイントや法線を表すベクトルにアクセスする場合に使用

vect.rgba - 色を表すベクトルにアクセスする場合に使用

vect.LTRB - ベクトルが長方形を表す場合に使用(GLSL 以外)

AGSL では、0 と 1 を使用して、そのチャネルに定数 0 または 1 を生成できます。例: vect.rgb1 == vec4(vect.rgb,1)

構造体と配列

構造体は GLSL と同じ構文で宣言されますが、AGSL はグローバル スコープの構造体のみサポートします。

struct type-name {
 members
} struct-name; // optional variable declaration.

明示的な配列サイズを持つ 1 次元配列のみがサポートされます。C スタイルまたは GLSL スタイルの構文を使用します。

<基本型>[<配列サイズ>] 変数名 - 例: half[10] x;

<基本型> 変数名 [<配列サイズ>] - 例: half x[10];

配列は関数から返したり、コピーしたり、割り当てたり、比較したりすることはできません。配列の制限は、配列を含む構造体に伝播されます。配列のインデックスには、定数またはループ変数のみを使用できます。

識別子

タイプ 説明
const コンパイル時定数、または読み取り専用の関数パラメータ。
uniform 値は、処理されるプリミティブ間で変化しません。ユニフォームは、setColorUniformsetFloatUniformsetIntUniformsetInputBuffersetInputShaderRuntimeShader メソッドを使用して Android から渡されます。
in 渡された関数パラメータの場合。これがデフォルトです。
out 渡された関数パラメータの場合。関数の定義と同じ精度を使用する必要があります。
inout 関数の内外で渡されるパラメータに使用します。関数定義と同じ精度を使用する必要があります。

変数の宣言

宣言は明示的な中かっこ付きスコープ内にする必要があります。次のサンプルの y の宣言は許可されません。

if (condition)
    int y = 0;

行列/構造体/配列の基本

行列コンストラクタの例

1 つの値でマトリックスを構築すると、対角線上のすべての値にその値が割り当てられ、残りの値にはゼロが割り当てられます。float2x2(1.0) は 2x2 の単位行列を作成します。

複数の値でマトリックスが作成される場合、列が最初に入力されます(列優先順序)。

GLSL とは異なり、渡されたベクトルのコンポーネント数を減らすコンストラクタはサポートされていませんが、スウィズリングを使用して同じ効果を得ることができます。GLSL と同じ動作で AGSL の vec4 から vec3 を構築するには、vec3 nv = quadVec.xyz を指定します。

構造体コンストラクタの例

struct light { float intensity; float3 pos; };
// literal integer constants auto-converted to floating point
light lightVar = light(3, float3(1, 2, 3.0));

行列コンポーネント

配列のサブスクライブ構文を使用して、行列のコンポーネントにアクセスします。

float4x4 m; // represents a matrix
m[1] = float4(2.0); // sets second column to all 2.0
m[0][0] = 1.0; // sets upper left element to 1.0
m[2][3] = 2.0; // sets 4th element of 3rd column to 2.0

構造フィールド

ピリオド . 演算子を使用して構造フィールドを選択します。演算子には次のようなものがあります。

演算子 説明
. フィールド セレクタ
==, != 平等
= 割り当て

配列要素

配列要素には、配列添字演算子 [ ] を使用してアクセスします。例:

diffuseColor += lightIntensity[3] * NdotL;

演算子

優先順位の高い順に番号が付けられています。関係演算子と等価演算子(>、<、<=、>=、==、!=)はブール値に評価されます。ベクトルをコンポーネントごとに比較するには、lessThan()equal() などの関数を使用します。

演算子 説明 関連性
1 () かっこによるグループ化 なし
2 [] () . ++ -- 配列サブスプリクト関数呼び出しとコンストラクタ構造フィールドまたはメソッド セレクタ、スウィズル ポストフィックスの増分と減分 左から右
3 ++ -- + - ! 接頭辞インクリメントとデクリメント(単項演算子) 右から左
4 * / 乗算と除算 左から右
5 + - 加算と減算 左から右
7 < > <= >= リレーショナル 左から右
8 == != 等式/不等式 左から右
12 && 論理 AND 左から右
13 ^^ 論理 XOR 左から右
14 || 論理 OR 左から右
15 ?\: 選択(1 つのオペランド全体) 左から右
16 = += -= *= /= 代入 算術代入 算術代入 左から右
17 , sequence 左から右

行列とベクトルの演算

スカラー値に適用された算術演算子は、スカラー値になります。剰余以外の演算子の場合、一方のオペランドがスカラーで、もう一方がベクトルまたは行列である場合、演算はコンポーネントごとに実行され、結果は同じベクトルまたは行列型になります。両方の演算が同じサイズのベクトルである場合、演算はコンポーネント単位で実行され(同じベクトル型を返します)。

動作 説明
m = f * m スカラー値による行列の要素ごとの乗算
v = f * v スカラー値によるベクトルの成分ごとの乗算
v = v * v ベクトル値によるベクトルの成分ごとの乗算
m = m + m 行列の要素ごとの加算
m = m - m 行列の要素ごとの減算
m = m * m 線形代数乗算

一方のオペランドが行列の行または列のサイズと一致するベクトルである場合、乗算演算子を使用して、行と列の代数乗算を行うことができます。

動作 説明
m = v * m 行ベクトル * 行列の線形代数乗算
m = m * v 行列 * 列ベクトルの線形代数乗算

ベクトルの内積、外積、要素ごとの乗算には、組み込み関数を使用します。

関数 説明
f = dot(v, v) ベクトルの内積
v = cross(v, v) ベクトルの外積
m = matrixCompMult(m, m) コンポーネントごとの乗算

プログラム制御

関数呼び出し 値渡しによる戻り値
反復 for (<init>;<test>;<next>)
{ break, continue }
選択 if ( ) { }
if ( ) { } else { }
switch () { break, case } - デフォルトのケースが最後
ジャンプ break, continue, return
(破棄は許可されない)
エントリ half4 main(float2 fragCoord)

for ループの制限事項

GLSL ES 1.0 と同様に、「for」ループは非常に制限されています。コンパイラはループを展開できる必要があります。つまり、初期化子、テスト条件、next ステートメントで定数を使用して、すべてをコンパイル時に計算できるようにする必要があります。next ステートメントは、++, --, +=, or -= の使用に制限されています。

組み込み関数

GT(汎用型)は、floatfloat2float3float4halfhalf2half3half4 です。

これらの関数のほとんどはコンポーネント単位で動作します(関数はコンポーネントごとに適用されます)。そうでない場合は、その旨が記載されています。

角度と三角関数

角度として指定された関数パラメータは、ラジアンの単位であると想定されます。いずれの場合も、これらの関数によってゼロ除算エラーが発生することはありません。比率の除数が 0 の場合、結果は未定義になります。

関数 説明
GT radians(GT degrees) 度数をラジアンに変換する
GT degrees(GT radians) ラジアンを度に変換する
GT sin(GT angle) 標準サイン
GT cos(GT angle) 標準コサイン
GT tan(GT angle) 標準接線
GT asin(GT x) [π2,π2] の範囲で正弦が x の角度を返します。
GT acos(GT x) [0,π] の範囲で余弦が x の角度を返します。
GT atan(GT y, GT x) 三角関数の逆正接が [yx] の範囲 [π,π] の角度を返します。
GT atan(GT y_over_x) 三角関数の逆正弦が y_over_x の角度を [π2,π2] の範囲で返します。

指数関数

関数 説明
GT pow(GT x, GT y) xy を返します。
GT exp(GT x) ex を返します。
GT log(GT x) ln(x) を返します。
GT exp2(GT x) 2x を返します。
GT log2(GT x) log2(x) を返します。
GT sqrt(GT x) x を返します。
GT inversesqrt(GT x) 1x を返します。

一般的な機能

関数 説明
GT abs(GT x) 絶対値
GT sign(GT x) x の符号に応じて -1.0、0.0、または 1.0 を返します。
GT floor(GT x) 最も近い整数 <= x
GT ceil(GT x) 最も近い整数 >= x
GT fract(GT x) x の小数部を返します。
GT mod(GT x, GT y) x の剰余を y で返します。
GT mod(GT x, float y) x の剰余を y で返します。
GT min(GT x, GT y) x または y の最小値を返します。
GT min(GT x, float y) x または y の最小値を返します。
GT max(GT x, GT y) x または y の最大値を返します。
GT max(GT x, float y) x または y の最大値を返します。
GT clamp(GT x, GT minVal, GT maxVal) minVal と maxVal の間にクランプされた x を返します。
GT clamp(GT x, float minVal, float maxVal) minVal と maxVal の間にクランプされた x を返します
GT saturate(GT x) 0.0 ~ 1.0 の範囲にクランプされた x を返します。
GT mix(GT x, GT y, GT a) x と y の線形ブレンドを返します
GT mix(GT x, GT y, float a) x と y の線形ブレンドを返します
GT step(GT edge, GT x) x < edge の場合は 0.0、それ以外の場合は 1.0 を返します。
GT step(float edge, GT x) x < edge の場合は 0.0、それ以外の場合は 1.0 を返します
GT smoothstep(GT edge0, GT edge1, GT x) edge0 < x < edge1 の場合、0 ~ 1 の Hermite 補間を行います。
GT smoothstep(float edge0, float edge1, GT x) edge0 < x < edge1 の場合、0 ~ 1 の Hermite 補間を行います。

幾何関数

これらの関数は、ベクトルをコンポーネント単位ではなくベクトルとして操作します。GT は、サイズ 2 ~ 4 の浮動小数点数/半精度ベクトルです。

関数 説明
float/half length (GT x) ベクトルの長さを返します
float/half distance(GT p0, GT p1) ポイント間の距離を返します
float/half dot(GT x, GT y) ドット積を返します
float3/half3 cross(float3/half3 x, float3/half3 y) クロス積を返します
GT normalize(GT x) ベクトルを正規化して長さを 1 にします
GT faceforward(GT N, GT I, GT Nref) dot(Nref, I) < 0 の場合は N を返します。それ以外の場合は -N を返します。
GT reflect(GT I, GT N) 反射方向 I - 2 * dot(N,I) * N。
GT refract(GT I, GT N, float/half eta) 屈折ベクトルを返します。

行列関数

型 mat は任意の正方行列型です。

関数 説明
mat matrixCompMult(mat x, mat y) 成分ごとに x と y を乗算します
mat inverse(mat m) m の逆数を返します。

ベクトル関係関数

x と y をコンポーネントごとに比較します。特定の呼び出しの入力ベクトルと戻りベクトルのサイズは一致している必要があります。T は、整数型と浮動小数点型のベクトル型のユニオンです。BV は、入力ベクトルのサイズと一致するブール値ベクトルです。

関数 説明
BV lessThan(T x, T y) x < y
BV lessThanEqual(T x, T y) x <= y
BV greaterThan(T x, T y) x > y
BV greaterThanEqual(T x, T y) x >= y
BV equal(T x, T y) x == y
BV equal(BV x, BV y) x == y
BV notEqual(T x, T y) x != y
BV notEqual(BV x, BV y) x != y
bool any(BV x) x のいずれかのコンポーネントが true の場合: true
bool all(BV x) x のすべてのコンポーネントが true の場合、true
BV not(BV x) x の論理補集

色関数

関数 説明
vec4 unpremul(vec4 color) 色値を非プレミックス アルファに変換します。
half3 toLinearSrgb(half3 color) 線形 SRGB への色空間変換
half3 fromLinearSrgb(half3 color) 色空間変換

シェーダー サンプリング(評価)

サンプラーのタイプはサポートされていませんが、他のシェーダーを評価できます。テクスチャをサンプリングする必要がある場合は、BitmapShader オブジェクトを作成し、ユニフォームとして追加します。これは任意のシェーダに対して行うことができます。つまり、他の RuntimeShader オブジェクトを含め、Android シェーダーを事前に Bitmap に変換せずに直接評価できます。これにより、非常に柔軟なシェーダーを作成できますが、複雑なシェーダーは、特にループ内で評価するとコストが高くなる可能性があります。

uniform shader image;

image.eval(coord).a   // The alpha channel from the evaluated image shader

未加工バッファ サンプリング

ほとんどの画像には、カラーマネジメントが必要な色が含まれていますが、画像に保存されているノーマル、マテリアル プロパティ(粗さなど)、高さマップ、または画像に保存されている純粋に数学的なデータなど、実際には色ではないデータが含まれている画像もあります。AGSL でこのような画像を使用する場合は、RuntimeShader#setInputBuffer を使用して、BitmapShader を汎用未加工バッファとして使用できます。これにより、色空間の変換とフィルタリングを回避できます。