2012-05-03 5 views
7

Il GLSL ha delle costanti predefinite per +/- infinito o NaN? Sto facendo questo come una soluzione, ma mi chiedo se c'è un modo più pulito:costante infinito glsl

// GLSL FRAGMENT SHADER 
#version 410 

<snip> 

const float infinity = 1./0.; 

void main() 
{ 
    <snip> 
} 

sono consapevole della funzione isinf ma ho bisogno di assegnare infinito a una variabile in modo che non mi aiuta.

+0

Per cosa serve l'infinito? – Shahbaz

+0

L'uso di infinity consente di risparmiare molta logica nel mio codice: ' float t0 = (d> = 0.)? t: infinito; float t1 = (d> = 0)? t: infinito; t = min (t0, t1); ' – atb

+0

Credo che la scelta di un valore abbastanza grande (basato sulla tua applicazione) dovrebbe facilmente fare il trucco. Supponiamo per esempio '1e20' – Shahbaz

risposta

5

Come indicato in Nicol, non ci sono costanti predefinite.

Tuttavia, da OpenGL 4.1, la soluzione è almeno garantita per funzionare e generare correttamente un valore infinito.

V., per esempio in glsl 4.4:

4.7.1 Range e precisione

...

Tuttavia, dividendo un non-zero 0 risultati nella opportunamente firmato IEEE Inf: se vengono implementati zeri sia positivi che negativi, verrà generato il codice Inf correttamente firmato, altrimenti pos itive è generato.

Fare attenzione quando si utilizza una vecchia versione di OpenGL però:

Per esempio in glsl 4.0 dice:

4.1.4 Galleggianti

...

Analogamente, il trattamento di condizioni come divide per 0 ma y portare a un risultato non specificato, ma in nessun caso tale condizione può portare all'interruzione o alla conclusione dell'elaborazione.

3

Non ci sono costanti predefinite per questo, ma c'è la funzione isinf per verificare se qualcosa è infinito.

Mentre ci sono, ci sono costanti per altre cose come FLT_MAX FLT_EPSILON ecc il modo in cui ci sono in C?

No, non ce ne sono.