WebGLの精度について教えて下さい
知りたいこと
GLSLで2の23乗より大きい値を扱うときに期待通りの結果を得られないのですが、その理由が知りたいです。
背景
画像(png)の色をデータとして扱い、今まではJavaScriptのcanvas-2dで処理していたのですが、高速化したくて最近はWebGLで処理するようにしています。
画像の各ピクセルのrgbを以下の計算式で値に変換しています。
value = r * 256 * 256 + g * 256 + b;
rgbそれぞれ8ビットですので24ビット(16,777,216)まで表現することが出来ます。
GLSLでいろいろ記述していて気づいたこと
いろいろシェーダを記述して試行錯誤しているのですが、今日気づいたことがありました。
//パターン1
floor( 1.0 ) == floor( 1.5 )
//パターン2
floor( 8388608.0 ) == floor( 8388608.5 )
//パターン3
floor( 8388609.0 ) == floor( 8388609.5 )
いろいろな判定式を書いていて期待通りに動いてくれないので追試していました。例えば上記で自分の期待としてはいずれのパターンもture
になってほしかったのですが、結果はパターン1とパターン2のみture
でパターン3はfalse
になることに気づきました。整数部が8,388,608つまり2の23乗を超えると期待通りの動作をしてくれないことがわかりました。
webglreport.comで確認
最初はいろいろ検索してみたのですがよくわからず、WebGLに関する各種情報を表示してくれるサイトを確認して、あることに気づきました。
https://webglreport.com/
自分の環境では以下の結果が表示されました。
ここで青い楕円で示した部分に注目しました。Best float precisionとして[-2^127, 2^127]である点は良いのですが、その下にカッコ書きで23と表示されています。
結論:わからないこと
自分には上記の記述が何を意味しているかわからないのですが、これはもしかして整数部が2の23乗より大きい場合は「Best」じゃない、ということでしょうか。
どなたか詳しい方がいらっしゃったらご教示頂けないでしょうか。
どうぞよろしくお願いいたします。