Metal組み込み関数

Metalのシェーダで利用できる関数のまとめ

HLSL/GLSLは各言語との対比

共通関数

Metal HLSL GLSL
T clamp(T x, T min, T max) x を [min, max] の範囲にクランプする
fmin(fmax(x, min), max) を返す
min > maxは不定
T mix(T x, T y, T a) [x, y] の間の a で線形補間
x + (y – x) * a を返す
a は 0.0 から 1.0。それ以外は不定
lerp
T saturate(T x) x を [0.0, 1.0] の範囲にクランプして返す
T sign(T x) x > 0 で 1.0, x < 0 で -1.0,
x = -0.0 で -0.0, x = +0.0 で +0.0,
x = NaN で 0.0 を返す
T smoothstep(T e0, T e1, T x) x <= e0 で 0.0, x >= e1 で 1.0
それ以外は [0.0, 1.0] の範囲でエルミート補間した値を返す
スムーズなトランジションに便利
t = clamp((x – e0)/(e1 – e0), 0, 1);
return t * t * (3 – 2 * t);と等価
e0 >= e1 または
x, e0, e1 のいずれかが NaN は不定
T step(T edge, T x) x < edge で 0.0
それ以外は 1.0 を返す

整数関数

Metal HLSL GLSL
T abs(T x)
T fabs(T x)
x の絶対値を返す
Tu absdiff(T x, T y) オーバーフローなしで x - y の絶対値を返す
T clz(T x) x の先頭ビットから連続する 0 の個数
x = 0 で x の型のビットのサイズを返す
T ctz(T x) x の末尾ビットから連続する 0 の個数
x = 0 で x の型のビットのサイズを返す
T hadd(T x, T y) (x + y) >> 1 を返す
中間合計はオーバーフローしない
T madhi(T a, T b, T c) mulhi(a, b) + c を返す
T madsat(T a, T b, T c) saturate(a * b + c) を返す
T max(T x, T y) x と y の最大値を返す
T min(T x, T x) x と y の最小値を返す
T mulhi(T x, T y) x * y の結果の上位半分のビットを返す
T popcount(T x) x の 0 ではないビットの数を返す
T rhadd(T x, T y) (x + y + 1) >> 1 を返す
中間合計はオーバーフローしない
T rotate(T v, T i) v の各要素に対し対応する i の要素の値のビット数分左へシフトした値を返す
あふれたビットは右端から挿入される
T subsat(T x, T y) saturate(x - y) を返す

関係関数

Metal HLSL GLSL
bool all(Tb x) x の全ての要素が true の時に true を返す
bool any(Tb x) x のいずれかの要素が true の時に true を返す
Tb isfinite(T x) x が有限の場合は true を返す
Tb isinf(T x) x が無限大(+/-)であれば true を返す
Tb isnan(T x) x がNanであれば true を返す
Tb isnormal(T x) x が正規化数であれば true を返す
Tb isordered(T x, T y) x と y の引数が順序付けられているか
(x == x) && (y == y) を返す
Tb isunordered(T x, T y) x と y の引数が順序付けられていないか
x か y が NaN であれば true を返す
T select(T a, T b, Tb c) result[i] = c[i] ? b[i] : a[i] を返す
Ti select(Ti a, Ti b, Tb c) result = c ? b : a を返す
Tb signbit(T x) 符号ビットをテストする
x に浮動小数点数がセットされている場合は true

数学関数

Metal HLSL GLSL
T acos(T x) x のアークコサインを返す
T acosh(T x) x のハイパボリックアークコサインを返す
T asin(T x) x のアークサインを返す
T asinh(T x) x のハイパボリックアークサインを返す
T atan(T x) x のアークタンジェントを返す
T atan2(T y, T x) y と x のアークタンジェントを返す
T atanh(T x) x のハイパボリックアークタンジェントを返す
T ceil(T x) x を正の無限大に近いほうの整数に丸めた値を返す
T copysign(T x, T y) y の符号に変えた x を返す
T cos(T x) x のコサインを返す
T cosh(T x) x のハイパボリックコサインを返す
T cospi(T x) pi * x のコサインを返す
T exp(T x) e ^ x を返す
T exp2(T x) 2 ^ x を返す
T exp10(T x) 10 ^ x を返す
T fdim(T x, T y) x > y で x - y,
x <= y で +0 を返す
T floor(T x) x を負の無限大に近いほうの整数に丸めた値を返す
T fma(T a, T b, T c) a * b + c を返す
融合積和演算(IEEE 754-2008準拠)
T fmod(T x, T y) x - y * trunc(x / y) を返す
T fract(T x) x の小数部を返す frac
T frexp(T x, Ti &exp) x = [返り値] * 2 ^ exp となる
返り値は[12, 1]の範囲か 0 となる
Ti ilogb(T x) x の指数を整数で返す
T ldexp(T x, Ti k) x * 2 ^ k を返す
T log(T x) x の自然対数を返す
T log2(T x) x の 2 を底とする対数を返す
T log10(T x) x の 10 を底とする対数を返す
T fmax(T x, T y) x と y の最大値を返す
片方の引数が NaN なら NaN では無い方の値を返す
両方が NaN なら NaN を返す
T fmin(T x, T y) x と y の最小値を返す
片方の引数が NaN なら NaN では無い方の値を返す
両方が NaN なら NaN を返す
T modf(T x, T &intval) x を同じ符号を持つ整数部と少数部に分ける
少数部を返り値で、整数部を intval で返す
T pow(T x, T y) x ^ y を返す
T powr(T x, T y) x >= 0 の x ^ y を返す
T rint(T x) x を最近接偶数へ丸めた整数値を返す
T round(T x) x を直近の整数値に丸めて返す
半分の場合は 0 に近い方となる
T rsqrt(T x) x の平方根の逆数を返す
T sin(T x) x のサインを返す
T sincos(T x, T &cosval) x のサインとコサインを計算する
サインを返り値で、コサインを cosval で返す
T sinh(T x) x のハイパボリックサインを返す
T sinpi(T x) pi * x のサインを返す
T sqrt(T x) x の平方根を返す
T tan(T x) x のタンジェントを返す
T tanh(T x) x のハイパボリックタンジェントを返す
T tanpi(T x) pi * x のタンジェントを返す
T trunc(T x) x を 0 に近い方向へ丸めた値を返す

行列関数

Metal HLSL GLSL
float determinant(floatnxn)
half determinant(halfnxn)
行列式を返す
行列は正方行列でなければならない
floatmxn transpose(floatnxm)
halfmxn transpose(halfnxm)
転置行列を返す

幾何関数

Metal HLSL GLSL
T cross(T x, T y) x と y の外積を返す
T は3次元ベクトルでなければならない
Ts distance(T x, T y) x と y の距離を求める
length(x - y) を返す
Ts distance_squared(T x, T y) x と y の距離の平方を返す
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 のベクトルの長さの平方を返す
T normalize(T x) x の正規化した値を返す
T reflect(T I, T N) 入射ベクトル I と面の法線ベクトル N から、反射ベクトル I – 2 * dot(N, I) * N を返す
N は正規されていなければならない
T refract(T I, T N, Ts eta) 入射ベクトル I と面の法線ベクトル N と屈折率 eta から、屈折ベクトルを返す
I と N は正規されていなければならない

グラフィック関数

フラグメントシェーダ

Metal HLSL GLSL
T dfdx(T p) スクリーン空間の指定された x 座標に対する高精度の偏微分を返す ddx dFdxFine
T dfdy(T p) スクリーン空間の指定された y 座標に対する高精度の偏微分を返す ddy dFdyFine
T fwidth(T p) fabs(dfdx(p)) + fabs(dfdy(p)) を返す

感想

さすが後発なだけあって、全部入り。GLSLをベースにHLSLやらOpenCLからありったけ詰め込んだような感じ。

参考リンク