AGSL クイック リファレンス

AGSL は、GLSL ES 1.0 と大きな互換性を持つように設計されています。詳しくは 対応する関数については、 OpenGL ES シェーディング言語のドキュメント このドキュメントでは、可能な限り AGSL の GLSL の 3 つです

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 行列型と同等です。

適合率と範囲の最小値

これらは、それぞれに関連付けられた最小保証精度と範囲です。 記述する必要があります。ほとんどのデバイスは 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\}\)
中レベル \(\left\{-2^{14},2^{14}\right\}\) \(\left\{2^{-14},2^{14}\right\}\) 親戚: \(2^{-10}\) \(\left\{-2^{10},2^{10}\right\}\)
低い \(\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.

明示的な配列サイズでは、1 次元の配列のみがサポートされます。 C スタイルまたは GLSL スタイルの構文のいずれかになります。

<ベースタイプ>[<配列サイズ>] 変数名 - 例: half[10] x;

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

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

識別子

タイプ 説明
const コンパイル時の定数または読み取り専用関数 パラメータを指定します。
uniform プリミティブ全体で値は変更されない あります。 ユニフォームは、次のコマンドを使用して Android から渡します。 RuntimeShader setColorUniformsetFloatUniformsetIntUniformsetInputBuffersetInputShader
in 渡される関数パラメータの場合。これがデフォルトです。
out 渡される関数パラメータの場合。必須 関数定義と同じ精度になります。
inout 渡されるパラメータと出力されるパラメータの両方 説明します。次と同じ精度を使用する必要があります。 必要があります。

変数の宣言

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

if (condition)
    int y = 0;

行列、構造、配列の基本

行列コンストラクタの例

行列が単一の値で構成されている場合、 対角線にその値、残りに 0 が与えられます。float2x2(1.0) さんは次の行動をとるでしょう 2 行 2 の単位行列を作成します。

複数の値を持つ行列を構成する場合、最初に列が入力されます (列優先順)。

なお、GLSL とは異なり、コンストラクタはアプリケーションのコンポーネントの数を減らし、 渡されるベクトルはサポートされませんが、実装入れ替えを使用すると、 できます。AGSL の vec4 から vec3 を、 GLSL の場合は、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 線形代数の乗算

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(汎用型)は、floatfloat2float3float4 または halfhalf2half3half4

これらの関数のほとんどはコンポーネント単位で動作します(関数は あります。そうでない場合は注記します。

角度と三角関数

角度として指定する関数パラメータは、ラジアンの単位とみなされます。 いずれの場合も、いずれの関数もゼロ除算エラーになりません。もし 比率の除数が 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) 余弦が x 軸である角度を返します。 $ \left[0,\pi\right] $ の範囲
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 < の場合、0.0 を返しますエッジ、それ以外は 1.0
GT smoothstep(GT edge0, GT edge1, GT x) Hermite 補間を実行します。 0 と 1 の間(edge0 <× <エッジ 1
GT smoothstep(float edge0, float edge1, GT x) Hermite 補間を実行します。 0 と 1 の間(edge0 <× <エッジ 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。
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) × <
BV lessThanEqual(T x, T y) x <= y
BV greaterThan(T x, T 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 オブジェクトを作成し、 あります。この処理はどのシェーダーでも行え、 すべての Android シェーダーを まずはビットマップ RuntimeShader オブジェクト。これにより、 非常に柔軟性がありますが、複雑なシェーダーの場合、 特にループで評価できます。

uniform shader image;

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

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

ほとんどの画像には色管理が必要な色が含まれていますが、一部の画像には、 法線を格納する画像など、実際には色ではないデータが含まれている マテリアル プロパティ(粗さなど)、ハイトマップ、その他の純粋な 数学的データをたまたま画像に格納することこれらの種類を使用する場合 使用する場合、BitmapShader を汎用 RAW バッファとして使用できます。 RuntimeShader#setInputBuffer に作成します。 これにより、色空間変換とフィルタリングを回避できます。