こんにちは。つんあーです。
あんまり意識していなかったのですが、シェーダを書く時って頭に演算精度を示す精度修飾子を記載しますよね。
#version 300 es
precision mediump int; <- これ
precision mediump float; <- これ
精度には三段階あります。
precision lowp float
precision mediump float
precision highp float
頂点シェーダでは自動的にhighp
が選択されるそうなので、
今回の話はフラグメントシェーダーに限った話になります。
Android Chrome93で起こったこと
↓highp
の場合
#version 300 es
precision highp int;
precision highp float;
out vec4 color;
...
void main() {
int num = 2000 + 2001;
// => 4001
// ↑当然の結果
}
↓mediump
の場合
#version 300 es
precision mediump int;
precision mediump float;
out vec4 color;
...
void main() {
int num = 2000 + 2001;
// => 4000
// ファッ!?
}
単純な足し算ですが、結果が正しくありません。
もちろん、PC(Mac)のChromeではこういったことは起こりませんでした。
今のところ、原因はよくわかっていません。
じゃあhighp
で書けばいいんじゃね?という話
まあそうといえばそうなんですが。
GLSL3.0は一応、highp
が標準とされたようです。
なので大方問題はないと思うのですが。。。
とはいえ、GLSL2.0以前の潮流なのか多くのサイトで「highpの実装具合や実行の確実性は環境に左右される」といった記載がされているのと、
これはどこかで聞いたのですがhighpが実装されていない環境の場合は自動的にmediumpが選択されるらしいので、自分の知らないところで不具合が出てるかもと思うとちょっとソワソワしますね。
そもそも、フラグメントシェーダの実行結果を数字でみるのってちょっと面倒なので、もし不具合が起こっていた場合の原因追及もなかなかしんどそう。
あと、ぶっちゃけエンジニア感情論的に気持ち悪いですよね。
この後の動き
もう少し詳しく調べつつ、再現に条件があるのかどうかなどを調べてみようかなと思います。
あととりあえず、Android Chromeの不具合報告にでも送っておこうかな...