AGSL 經過特別設計,與 GLSL ES 1.0 相容。如需更多資訊 您可在 OpenGL ES 著色語言說明文件。 如果可能,本說明文件會嘗試指出不同 AGSL 之間的差異 以及 GLSL
類型
AGSL 支援 GLSL ES 1.0 型別,並提供另一種呈現向量的方式
以及矩陣類型AGSL 支援額外的 short
和 half
類型來代表
中等精確度
基本類型
類型 | 說明 |
---|---|
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,其保證精確度/範圍為 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 僅支援 部署 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
setColorUniform 、setFloatUniform 的方法
setIntUniform 、setInputBuffer 和
setInputShader 。 |
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
(一般類型) 為 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)
|
傳回餘弦為 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。 這可避免色彩空間轉換和篩選問題。