ちょっと探せば出てくると言えば出てくるんですが、 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); }
グラフで表すと、下の画像のような結果になります。
ということで、メモでした。