Как работать с NaN или inf в шейдерах OpenGL ES 2.0

Это основано на вопросе: лучший способ обнаружить NaN в шейдерах OpenGL

Стандартный GLSL определяет функции isnan () и isinf () для обнаружения. Язык затенения OpenGL ES 2.0 отсутствует. Как я могу справиться с NaNs и Infs?

Вы можете проверить NaN через условие, которое будет истинно только для NaN:

bool isNan(float val) { return (val <= 0.0 || 0.0 <= val) ? false : true; } 

isinf немного сложнее. Нет никакого механизма для преобразования float в его целочисленное представление и игры с битами. Поэтому вам придется сравнивать его с достаточно большим количеством.

Такая же проблема для WebGL. Ответ Nicol Bolas отлично подходит для большинства графических процессоров, но не для некоторых nVidias. Эта версия работает хорошо для всех графических процессоров. У меня была возможность попробовать:

 bool isNan( float val ) { return ( val < 0.0 || 0.0 < val || val == 0.0 ) ? false : true; // important: some nVidias failed to cope with version below. // Probably wrong optimization. /*return ( val <= 0.0 || 0.0 <= val ) ? false : true;*/ } 

Untested, поэтому не уверен, что это сработает (из-за оптимизации), но оно должно работать, как для Inf, так и для -Inf.

  bool isinf(float val) { return (val != 0.0 && val * 2.0 == val) ? true : false; }