2012-05-03 14 views
7

¿Tiene GLSL constantes predefinidas para +/- infinito o NaN? Estoy haciendo esto como una solución pero me pregunto si hay una manera más limpia:constante de infinito de glsl

// GLSL FRAGMENT SHADER 
#version 410 

<snip> 

const float infinity = 1./0.; 

void main() 
{ 
    <snip> 
} 

Soy consciente de la función isinf pero necesita asignar el infinito a una variable de modo que no me ayuda.

+0

¿Para qué necesitas el infinito? – Shahbaz

+0

Usar infinito ahorra mucha lógica en mi código: ' float t0 = (d> = 0.)? t: infinito; float t1 = (d> = 0.)? t: infinito; t = min (t0, t1); ' – atb

+0

Creo que elegir un valor suficientemente grande (basado en su aplicación) debería ser el truco. Digamos por ejemplo '1e20' – Shahbaz

Respuesta

5

Como se mencionó Nicol, no hay constantes predefinidas.

Sin embargo, desde OpenGL 4.1 en adelante, su solución está garantizada al menos para funcionar y generar correctamente un valor infinito.

Véase, por ejemplo, en glsl 4.4:

4.7.1 rango y precisión

...

Sin embargo, dividiendo un no-cero por 0 resultados en la apropiadamente IEEE Inf firmado: si se implementan ceros positivos y negativos, se generará Inf correctamente firmado, de lo contrario pos se genera Inf.

Tenga cuidado cuando se utiliza una versión anterior de OpenGL sin embargo:

Por ejemplo, en glsl 4.0 que dice:

4.1.4 flotadores

...

Del mismo modo, el tratamiento de condiciones como se divide por 0 ma y dar lugar a un resultado no especificado, pero en ningún caso tal condición conduciría a la interrupción o terminación del procesamiento.

3

No hay constantes predefinidas para él, pero existe la función isinf para probar si algo es infinito.

Mientras estoy en ello, ¿hay constantes para otras cosas como FLT_MAX FLT_EPSILON, etc. de la manera que hay en C?

No, no hay.