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
よりも精度が低いわけではありません。また、mediump
の精度は highp
よりも必ずしも低いとは限りません。AGSL は現在、最終出力で lowp
を mediump
に変換します。
修飾子 | 「浮動小数点数」の範囲 | 「浮動小数点数」の大きさの範囲 | 「浮動小数点数」の精度 | 「int」範囲 |
---|---|---|---|---|
最高 | \(\left\{-2^{62},2^{62}\right\}\) | \(\left\{2^{-62},2^{62}\right\}\) | 相対: \(2^{-16}\) | \(\left\{-2^{16},2^{16}\right\}\) |
mediump | \(\left\{-2^{14},2^{14}\right\}\) | \(\left\{2^{-14},2^{14}\right\}\) | 相対: \(2^{-10}\) | \(\left\{-2^{10},2^{10}\right\}\) |
Lowp | \(\left\{-2,2\right\}\) | \(\left\{2^{-8},2\right\}\) | 絶対的: \(2^{-8}\) | \(\left\{-2^{8},2^{8}\right\}\) |
配列数値のサブスクリプト構文(例: 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.
明示的な配列サイズでは、C スタイルまたは GLSL スタイルの構文を使用して、1 次元配列のみがサポートされます。
<基本型>[<配列サイズ>] 変数名 - 例: half[10] x;
<基本型> 変数名 [<配列サイズ>] - 例: half x[10];
関数から配列を返すことや、コピー、代入、比較することはできません。配列の制限は、配列を含む構造体にも適用されます。配列のインデックスには、定数変数またはループ変数を使用する必要があります。
予選
タイプ | 説明 |
---|---|
const
|
コンパイル時の定数または読み取り専用の関数パラメータ。 |
uniform
|
値は処理中のプリミティブ間で変更されません。
ユニフォームは、setColorUniform 、setFloatUniform 、setIntUniform 、setInputBuffer 、setInputShader の RuntimeShader メソッドを使用して Android から渡されます。 |
in
|
渡された関数パラメータ用。これがデフォルトです。 |
out
|
渡された関数パラメータ用。関数の定義と同じ精度を使用する必要があります。 |
inout
|
関数との間で受け渡されるパラメータ用。関数の定義と同じ精度を使用する必要があります。 |
変数の宣言
宣言は明示的な中かっこのスコープ内に記述する必要があります。次のサンプルで y
を宣言することはできません。
if (condition)
int y = 0;
行列/構造/配列の基本
行列コンストラクタの例
行列が単一の値で構成される場合、対角線上のすべての値にその値が割り当てられ、残りの値にはゼロが割り当てられます。したがって、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 | ++ -- + - !
|
1 つの接頭辞の増分と増分を | 右から左 |
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 |
線形代数乗算 |
1 つのオペランドが行列サイズまたは行列サイズと一致するベクトルの場合、乗算演算子を使用して行と列の代数乗算を行うことができます。
オペレーション | 説明 |
---|---|
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
(汎用型)は、float
、float2
、float3
、float4
、または half
、half2
、half3
、half4
です。
これらの関数のほとんどは、コンポーネント単位で動作します(関数はコンポーネント単位で適用されます)。そうでない場合はその旨が明記されています。
角度と三角関数
角度として指定された関数パラメータは、ラジアン単位であると想定されます。いかなる場合であっても、これらの関数によってゼロ除算のエラーが発生することはありません。比率の除数が 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)
|
正弦が x で、$ \left[-{\pi\over 2},{\pi\over 2}\right] $ の範囲の角度を返します |
GT acos(GT x)
|
余弦が $ \left[0,\pi\right] $ の範囲内の x である角度を返します |
GT atan(GT y, GT x)
|
三角逆接線が $ \left[{y\over x}\right] $ の角度を $ \left[-\pi,\pi\right] $ の範囲で返す |
GT atan(GT y_over_x)
|
三角逆接線が y_over_x で、$ \left[-{\pi\over 2},{\pi\over 2}\right] $ の範囲内の角度を返します |
指数関数
機能 | 説明 |
---|---|
GT pow(GT x, GT y) |
戻り値 $ x^y $ |
GT exp(GT x) |
$ e^x $ を返します |
GT log(GT x) |
戻り値 $ ln(x) $ |
GT exp2(GT x) |
$ 2^x $ を返します |
GT log2(GT x) |
戻り値 $ log_2(x) $ |
GT sqrt(GT x) |
$ \sqrt{x} $ を返します |
GT inversesqrt(GT x) |
$ 1\over{\sqrt{x}} $ を返します |
一般的な機能
機能 | 説明 |
---|---|
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 < エッジの場合は 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 の間でエルミート補間を行う |
GT smoothstep(float
edge0, float edge1,
GT x) |
edge0 < x < edge1 の場合、0 ~ 1 の間でエルミート補間を実行する |
等比関数
これらの関数は、要素単位ではなく、ベクトルとしてベクトルに作用します。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) |
ドット(Nref, I) < 0 の場合は N を返し、それ以外の場合は -N を返します。 |
GT reflect(GT I, GT N) |
反射方向 I - 2 * ドット(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 オブジェクトを含め、最初に Bitmap に変換することなく、任意の Android Shader を直接評価できます。これにより非常に高い柔軟性が得られますが、複雑なシェーダーは、特にループ内では、評価にコストがかかる可能性があります。
uniform shader image;
image.eval(coord).a // The alpha channel from the evaluated image shader
未加工バッファのサンプリング
ほとんどの画像には色管理が必要な色が含まれていますが、一部の画像には、法線、マテリアル プロパティ(ラフネスなど)、高さマップを格納する画像、または画像に保存される純粋な数学的データなど、実際には色ではないデータが含まれています。このような画像を AGSL で使用する場合、RuntimeShader#setInputBuffer を使用することで、BitmapShader を汎用の RAW バッファとして使用できます。これにより、色空間の変換やフィルタリングを回避できます。