main() blog

プログラムやゲーム、旅、愛する家族について綴っていきます。

【Metal】Metal Shading Language 仕様 Version2.2

Metal のシェーダー言語の仕様は以下のURLにあります。

https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf

必要なところから抜粋して翻訳してみます。

6 Metal Standard Library

この章では Metal Standard Library(MSLib)の関数について説明します。

6.1 Namespace and Header Files

MSLib関数と列挙は、metal名前空間で宣言されています。
MSLib関数で説明されているヘッダーファイル<metal_stdlib>ヘッダーが利用可能で、
MSLibでサポートされているすべての関数にアクセスできます。

6.2 Common Functions

表6.1の関数は、ヘッダー <metal_common> で定義されています。
Tはスカラーまたはベクトル浮動小数点型です。

ビルトイン共通関数 説明
T clamp(T x, T minval, T maxval) fmin(fmax(x, minval), maxval) を返す。
minval>maxvalの場合、結果は未定義。
T mix(T x, T y, T a) xとyの線形ブレンドの値を返す。
x +(y – x)* a

aは0.0から1.0の範囲の値でなければならない。
0.0から1.0の範囲でない場合は戻り値は未定義。
T saturate(T x) 指定された値を0.0から1.0の範囲内にクランプする。
T sign(T x) x> 0の場合は1.0、x = -0.0の場合は-0.0、x = +0.0の場合は+0.0、またはx <0の場合は-1.0を返す。
xがNaNの場合は0.0を返す。
T smoothstep(T edge0, T edge1m T x) x <= edge0の場合は0.0を、x >= edge1の場合は1.0を返す。
edge0 < x <edge1の場合はエルミート補間を実行し、0から1の値を返す。

以下と同等。
t = clamp( (x – edge0) / (edge1 – edge0), 0, 1);
return t * t * (3 – 2 * t);

edge0> = edge1の場合、またはx、edge0もしくはedge1がNaNの場合は結果は未定義。
T step(T edge, T x) x < edgeの場合は0.0を返し、それ以外の場合は1.0を返す。

6.3 Integer Functions

ビルトイン整数関数 説明
T abs(T x) |x|を返す。
Tu absdiff(T x, T y) 剰余オーバーフローなしで|x-y|を返す。
T addsat(T x, T y) x+yのsaturateした結果を返す。
T clamp(T x, T minval, T maxval) min(max(x, minval), maxval)を返す。

minval > maxvalの場合、結果は未定義。
T clz(T x) 最上位ビット位置から開始して、xの先頭の0ビットの数を返す。
T ctz(T x) xの末尾の0ビットの数を返す。
T extract_bits(T x, uint offset, uint bits)
T hadd(T x, T y) (x + y) >> 1を返す。
The intermediate sum does not modulo overflow.
T insert_bits(T base, T insert, uint offset, uint bits)
T32 mad24(T32 x, T32 y, T32 z)
T madhi(T a, T b, T c) mulhi(a, b) + cを返す。
T madsat(T a, T b, T c) a * b + cのsaturateした結果を返す。
T max(T x, T y) x < yの場合はyを返し、それ以外の場合はxを返す。
T max3(T x, T y, T z) max(x, max(y, z))を返す。
T median3(T x, T y, T z)
T min(T x, T y) y < xの場合はyを返し、それ以外の場合はxを返す。
T min3(T x, T y, T z) min(x, min(y, z))を返す。
T32 mul24(T32 x, T32 y)
T mulhi(T x, T y) x * yを計算し、xとyの積の上位半分を返す。
T popcount(T x) xの非ゼロビットの数を返す。
T reverse_bits(T x)
T rhadd(T x, T y) (x + y + 1) >> 1を返す。
The intermediate sum does not modulo overflow.
T rotate(T v, T i)
T subsat(T x, T y) x – yのsaturateした結果を返す。

6.4 Relational Functions

ビルトイン共通関数 説明
bool all(Tb x) xのすべてのコンポーネントがtrueの場合にのみtrueを返す。
bool any(Tb x) xのいずれかのコンポーネントがtrueの場合にのみtrueを返す。
Tb isfinite(T x) 有限値をテストする。
Tb isinf(T x) 無限値(正または負)をテストする。
Tb isnan(T x) NaNのテスト。
Tb isnormal(T x)
Tb isordered(T x, T y)
Tb isunordered(T x, T y)
Tb not(Tb x) xのコンポーネント単位の論理補数を返す。
T select(T a, T b, Tb c)
Ti select(Ti a, Ti b, Tb c)
ベクトル型の各コンポーネントについて
result [i] = c [i]? b [i]:a [i]

スカラー型の場合
result = c? b:a
Tb signbit(T x) 符号ビットをテスト。

xの浮動小数点値に符号ビットが設定されている場合はtrueを返す。
それ以外の場合はfalseを返す。

6.5 Math Functions

ビルトイン数学関数 説明
T acos(T x) xの逆余弦を計算。
T acosh(T x) xの逆双曲線余弦を計算。
T asin(T x) xの逆正弦を計算。
T asinh(T x) xの逆双曲線正弦を計算。
T atan(T y_over_x) xの逆正接を計算。
T atan2(T y, T x) xに対するyの逆正接を計算。
T atanh(T x) xの双曲線逆正接を計算。
T ceil(T x) xを整数値に丸める。
T copysign(T x, T y)
T cos(T x) xの余弦を計算。
T cosh(T x) xの双曲線余弦を計算。
T cospi(T x) cos(πx)を計算。
T divide(T x, T y) x / yを計算。
T exp(T x) eが底の指数関数。
T exp2(T x) 2が底の指数関数。
T exp10(T x) 10が底の指数関数。
T fabs(T x)
T abs(T x)
浮動小数点数の絶対値を計算。
T fdim(T x, T y)
T floor(T x)
T fma(T a, T b, T c)
T fmax(T x, T y)
T max(T x, T y)
fmax(x, fmax(y, z))を返す。
T fmax3(T x, T y, T z)
T max3(T x, T y, T z)
T fmedian3(T x, T y, T z)
T median3(T x, T y, T z)
T fmin(T x, T y)
T min(T x, T y)
T fmin3(T x, T y, T z)
T min3(T x, T y, T z)
fmin(x, fmin(y, z))を返す。
T fmod(T x, T y) x – y * trunc(x / y)を返す。
T fract(T x)
T frexp(T x, Ti &exponent)
Ti ilogb(T x)
T ldexp(T x, Ti k)
T log(T x) xの自然対数を計算。
T log2(T x) xの2を底とする対数を計算。
T log10(T x) xの10を底とする対数を計算
T modf(T x, T &intval)
T pow(T x, T y) xのy乗を計算。
T powr(T x, T y) x >= 0の時、xのy乗を計算。
T rint(T x)
T round(T x)
T rsqrt(T x) xの逆平方根を計算。
T sin(T x) xの正弦を計算。
T sincos(T x, T &cosval)
T sinh(T x) xの双曲線正弦を計算。
T sinpi(T x) sin(πx)を計算。
T sqrt(T x) xの平方根を計算。
T tan(T x) xの正接を計算。
T tanh(T x) xの双曲線正接を計算。
T tanpi(T x) tan(πx)を計算。
T trunc(T x) xを整数値に丸める。
定数名 説明
MAXFLOAT
HUGE_VALF
INFINITY
NAN
M_E_F
M_LOG2E_F
M_LOG10E_F
M_LN2_F
M_LN10_F
M_PI_F
M_PI_2_F
M_PI_4_F
M_1_PI_F
M_2_PI_F
M_2_SQRTPI_F
M_SQRT2_F
M_SQRT1_2_F
定数名 説明
MAXHALF
M_E_H
M_LOG2E_H
M_LOG10E_H
M_LN2_H
M_LN10_H
M_PI_H
M_PI_2_H
M_PI_4_H
M_1_PI_H
M_2_PI_H
M_2_SQRTPI_H
M_SQRT2_H
M_SQRT1_2_H

6.6 Matrix Functions

ビルトインマトリクス関数 説明
float determinant(floatnxn)
half determinant(halfnxn)
floatmxn transpose(floatnxm)
halfmxn transpose(halfnxm)

6.7 Geometric Functions

ビルトイン幾何関数 説明
T cross(T x, T y) xとyの外積を返す。

Tは3成分のベクトル型でなければならない。
Ts distance(T x, T y) xとyの間の距離を返す。
Ts distance_squared(T x, T y) xとyの間の距離の2乗を返す。
Ts dot(T x, T y) xとyの内積を返す。
T faceforward(T N, T I, T Nref) dot(Nref, I) < 0.0はNを返し、それ以外は–Nを返す。
Ts length(T x) ベクトルxの長さを返す。
Ts length_squared(T x) ベクトルxの長さの2乗を返す。
T normalize(T x) xと同じ方向で長さが1のベクトルを返す。
T reflect(T I, T N) 入射ベクトルIと表面方向Nについて、正規化されたN(NN)を計算し、反射方向を返す。
I – 2 * dot(NN, I) * NN
T refract(T I, T N, Ts eta) 入射ベクトルIと表面法線N、および屈折率etaの屈折ベクトルを返す。

6.8 Compute Functions

6.9 Graphics Functions

6.10 Texture Functions

6.11 Imageblock Functions

6.12 Pack and Unpack Functions

6.13 Atomic Functions

6.14 Encoding Commands for Indirect Command Buffers

6.15 Variable Rasterization Rate

7 Numerical Compliance

7.1 INF, NaN, and Denormalized Numbers

7.2 Rounding Mode

7.3 Floating-Point Exceptions

7.4 Relative Error as ULPs

7.5 Edge Case Behavior in Flush to Zero Mode

7.6 Conversion Rules for Floating-Point and Integer Types

7.7 Texture Addressing and Conversion Rules

7.7.1 Conversion Rules for Normalized Integer Pixel Data Types
7.7.2 Conversion Rules for Half-Precision Floating-Point Pixel Data Type
7.7.3 Conversion Rules for Single-Precision Floating-Point Pixel Data Type
7.7.4 Conversion Rules for 10- and 11-bit Floating-Point Pixel Data Type
7.7.5 Conversion Rules for 9-bit Floating-Point Pixel Data Type with a 5-bit Exponent
7.7.6 Conversion Rules for Signed and Unsigned Integer Pixel Data Types
7.7.7 Conversion Rules for sRGBA and sBGRA Textures