AGSL 快速參考指引

AGSL 經過特別設計,與 GLSL ES 1.0 相容。如需更多資訊 您可在 OpenGL ES 著色語言說明文件。 如果可能,本說明文件會嘗試指出不同 AGSL 之間的差異 以及 GLSL

類型

AGSL 支援 GLSL ES 1.0 型別,並提供另一種呈現向量的方式 以及矩陣類型AGSL 支援額外的 shorthalf 類型來代表 中等精確度

基本類型

類型 說明
void 沒有函式傳回值或空白參數 請參考閱讀清單,進一步瞭解 如何選擇 Kubeflow Pipelines SDK 或 TFX與 GLSL 不同,函式中不使用空白字元 傳回類型必須傳回一個值。

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,其保證精確度/範圍為 highpint 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 僅支援 部署 Kubernetes 叢集

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

只有明確陣列大小支援 1 維陣列,使用 C 樣式或 GLSL 樣式語法:

<base type>[<array size>]變數名稱 - 例如:half[10] x;

<基礎類型>變數名稱 [<array size>] - 例如:half x[10];

您無法透過函式傳回陣列,也無法複製、指派或比較陣列。 陣列限制適用於包含陣列的結構。陣列可以 就必須使用常數或迴圈變數建立索引

資格賽

類型 說明
const 編譯時間常數或唯讀函式 參數。
uniform 值在基元之間不會改變 或圖片。 系統會透過 RuntimeShader setColorUniformsetFloatUniform 的方法 setIntUniformsetInputBuffersetInputShader
in 適用於傳入的函式參數。此為預設值。
out 適用於傳遞的函式參數。必須使用 與函式定義相同精確度
inout 適用於傳入及傳出的參數 函式必須使用與 函式定義。

變數宣告

宣告必須在明確的外圍範圍內。宣告中 y 以下為不允許的做法:

if (condition)
    int y = 0;

矩陣/結構/陣列基本概念

矩陣建構函式範例

以單一值建構矩陣時,所有值與 對對角線的值表示,其他值則為零。float2x2(1.0)會 因此,請建立 2x2 身分矩陣

以多個值建構矩陣時,系統會先填入資料欄 (依資料欄的主要順序)。

請注意,與 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 ?\: 選取 (單一 運算元) 由左至右
16 分 = += -= *= /= 指派算術 指派算術 作業 由左至右
17 , 順序 從左至右

矩陣和向量作業

套用至純量值時,算術運算子會得出純量。適用對象 如果一個運算元是純量,另一個則是純運算子 就會以元件形式執行此作業, 同一個向量或矩陣類型如果兩項運算都是相同大小的向量 作業就會元件執行 (並傳回相同的向量類型)。

作業 說明
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 } - 預設案例姓氏
Jump 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) 傳回正弦是範圍 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}\r 可能] $ 範圍 $ \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 <否則為 1.0
GT step(float edge, GT x) 如果 x <否則為 1.0
GT smoothstep(GT edge0, GT edge1, GT x) 執行 Hermite 內插 介於 0 到 1 之間 (例如 Edge0 <x <Edge1
GT smoothstep(float edge0, float edge1, GT x) 執行 Hermite 內插 介於 0 到 1 之間 (例如 Edge0 <x <Edge1

幾何函式

這些函式會以向量形式運作,而非以元件的形式運作。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) 會傳回 N,則傳回 N0 其他 -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 <年
BV lessThanEqual(T x, T y) x <= y
BV greaterThan(T x, T y) X 鍵 >年
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) 將顏色值轉換成非預先乘積 Alpha 版
half3 toLinearSrgb(half3 color) 將色域轉換為線性 SRGB
half3 fromLinearSrgb(half3 color) 色彩空間轉換

著色器取樣 (評估)

不支援取樣器類型,但可以評估其他著色器。如果需要 模型可以建立 BitmapShader 物件,並將其新增為 統一您可以針對任何著色器執行這項作業,也就是說,您可以直接評估 不必轉換成 點陣圖,包括其他 RuntimeShader 物件。這樣一來, 但由於著色器較複雜 尤其是在迴圈中評估

uniform shader image;

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

原始緩衝區取樣

雖然大部分的圖片都含有應依顏色管理的顏色,但仍有部分圖片 包含的資料不是實際顏色,包括那些存有常態的圖片 材質屬性 (例如粗糙度)、高度圖或任何其他純粹的 圖片中儲存的數學資料使用這些類型時 可讓您使用 BitmapShader 做為一般原始緩衝區 RuntimeShader#setInputBuffer。 這可避免色彩空間轉換和篩選問題。