-
Shaderから呼ぶsin/cos関数の精度誤差について調べてる記事。
そう言えばあったなそういう誤差。2017年頃、上と同じTokyoDemoFest用の4kb intro作ってるときに遭遇した。
メガデモ用にShaderで音楽書いてたとき、ハイハットの音について高音が鳴る環境とそうでない環境が存在した。
元々ハイハットはsin関数だけで実装していた。高周波にして値をサンプリングする段階でまばらにプロットすることで、擬似的にノイズっぽく音を設定することができる。流石に耳を爆発させるようなもん作るわけにはいかないので、調整はしていたけど。
で、入力範囲が制御の関係上かなり大きい値になるため、記事と同じような誤差が発生してたと思われる。記事の記述のとおり「sin(time*x)」での実装だったよ!w
会場だと高音が鳴らないけど、家の環境だと鳴るとかそういうやつだった気がした。
これはShadertoyで鳴らしたときに顕著だった気がする。
WebGLでテクスチャに書き込んでそこからWAVデータを読み込んで鳴らせる仕組みだけど、GPU処理自体はローカルPCで行うから差異が出てくるものと思われる。
あと作った当時ブラウザでの動作がOpenGLES準拠だった気もするのでそこらへんが関係してるかも。