2012-05-03 8 views
7

GLSLに+/-無限大またはNaNの事前定義定数がありますか?私は回避策として、これをやっているが、クリーンな方法があるのだろうか:glsl無限定数

// GLSL FRAGMENT SHADER 
#version 410 

<snip> 

const float infinity = 1./0.; 

void main() 
{ 
    <snip> 
} 

私はisinf機能の承知していますが、私は私を助けないように、変数に無限大を割り当てる必要がありますが。

+0

何が無限に必要ですか? – Shahbaz

+0

無限大を使用すると、コード内に多くのロジックが保存されます: ' float t0 =(d> = 0.)? t:無限大; float t1 =(d> = 0)? t:無限大; t = min(t0、t1); ' – atb

+0

私は、あなたのアプリケーションに基づいて十分な大きさの値を選ぶことは簡単にやります。例えば ​​'1e20'と言ってください – Shahbaz

答えて

5

前述のNicolのように、あらかじめ定義された定数はありません。

しかし、OpenGL 4.1以降では、あなたのソリューションは少なくとも動作し、無限の値を正しく生成することが保証されています。

glsl 4.4の例を参照されたい:

4.7.1範囲と精度

...

しかし

適切 0結果によって非ゼロを分割signed IEEE Inf:肯定と否定の両方のゼロが実装されている場合、正しく署名された Infが生成されます。それ以外の場合はpos反復Infが生成される。それが言うglsl 4.0に例えば

あなたががOpenGLの古いバージョンを使用するときは注意してください

4.1.4フロート

...

同様に、のような条件の処理は、0ma yは不特定の結果につながりますが、そのような条件が処理の中断または終了につながることはありません。

3

あらかじめ定義された定数はありませんが、何かが無限大であるかどうかを調べるにはisinf関数があります。

私はその間、FLT_MAX FLT_EPSILONなどのような他のものの定数はありますか?

いいえ、ありません。