なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

GLSL の mod と HLSL の fmod は同等ではない話

ちょっと探せば出てくると言えば出てくるんですが、 GLSL コード (主に ShaderToy とか) を HLSL コード (主に Unity とか) に書き換える際、
以下のように解説しているサイトがあります (もしくは HLSL から GLSL パターンでも)。

GLSL の mod は HLSL の fmod に置き換えられる

実際、いくつかの GLSL to HLSL コンバーターでも、 GLSL の mod を渡すと HLSL では fmod を使うことがあるのですが、
これらの関数は負数を与えた場合の挙動がそれぞれ異なっています。
それぞれの関数をそれぞれのプラットフォームで表すとすると、以下のようにするのが正確です。

// HLSL

float mod(float a, float b) {
    return x - y * floor(x / y);
}

// float fmod(float a, float b) { ... }
// GLSL

// float mod(float a, float b) { ... }

float fmod(float a, float b) {
    return x - y * trunc(x / y);
}

グラフで表すと、下の画像のような結果になります。

オレンジが GLSL の mod、黄色が HLSL の fmod と同等

ということで、メモでした。