これは次の質問に基づいています: OpenGL シェーダーで NaN を検出する最良の方法
標準 GLSL では、検出のために isnan() および isinf() 関数が定義されています。OpenGL ES 2.0 シェーディング言語はそうではありません。それにもかかわらず、NaNとInfsをどのように処理できますか?
3912 次
3 に答える
5
NaN に対してのみ true になる条件を使用して、NaN を確認できます。
bool isNan(float val)
{
return (val <= 0.0 || 0.0 <= val) ? false : true;
}
isinf
はもう少し難しいです。float を整数表現に変換してビットを操作するメカニズムはありません。したがって、適切に大きな数と比較する必要があります。
于 2012-08-04T22:28:24.850 に答える
2
WebGL の同じ問題。Nicol Bolas の回答は、ほとんどの GPU で適切に機能しますが、一部の nVidia では機能しません。このバージョンは、私が試す機会があったすべての GPU でうまく機能します。
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;*/
}
于 2015-12-14T20:30:25.157 に答える
0
テストされていないため、(最適化のため) これが機能するかどうかはわかりませんが、Inf と -Inf の両方で機能するはずです。
bool isinf(float val) {
return (val != 0.0 && val * 2.0 == val) ? true : false;
}
于 2016-12-08T08:52:35.277 に答える