Metal組み込み関数
Jan 28, 2016 · oldmetalgpgpu
Metalのシェーダで利用できる関数のまとめ
HLSL/GLSLは各言語との対比
- (空白) : 同じ
 - ー : 該当なし
 - △ : 同等の関数があるが詳細が異なる
 - (関数名) : 挙動は同じだが、名前が別の関数がある
 
共通関数
- T は浮動小数点数のスカラーかベクター
 
| 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 を返す  | 
整数関数
- T は整数のスカラーかベクター
 - Tu は符号なし整数のスカラーかベクター
 
| 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) を返す | ー | ー | 
関係関数
- T は浮動小数点数のスカラーかベクター
 - Ti は整数かブーリアン型のスカラーかベクター
 - Tb はブーリアン型のスカラーかベクター
 
| 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  | 
ー | ー | 
数学関数
- T は浮動小数点数のスカラーかベクター
 - Ti は整数のスカラーかベクター
 
| 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 となる 返り値は[1⁄2, 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)  | 
転置行列を返す | 
幾何関数
- T は浮動小数点数(floatn / halfn)のベクター
 - Ts はベクターに対応するスカラー
 
| 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 は正規されていなければならない  | 
グラフィック関数
フラグメントシェーダ
- T はfloat, float2, float3, float4, half, half2, half3, half4
 
| 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からありったけ詰め込んだような感じ。
参考リンク
- 公式:Metal Standard Library
 - OpenGL4.5:API Reference Card
 - DirectX:組み込み関数 (DirectX HLSL)
 
