Me encontré con lo que parecía un misterioso error esta mañana y me siento muy afortunado de haber tropezado con una solución muy rápidamente.La mejor manera de detectar NaN en sombreadores OpenGL
Estaba dividiendo por un contador para producir un promedio dentro de un sombreador de fragmentos, y por supuesto cuando el contador es cero, el valor de color resultante se convirtió en NaN.
Durante la mezcla, NVidia trata con gracia un NaN como un valor de 0, pero Intel no lo hace y parece que conecta en cascada el NaN, lo que produce fragmentos negros.
Y este error persistió hasta que probé el código en una máquina Intel.
Me pregunto si hay algo que podría hacer para "atrapar" los valores no válidos. Parece que, al igual que en la programación regular, la única forma infalible (y aun así no se siente a prueba de balas) de tratar con esto es considerar cuidadosamente todos los casos posibles al dividir los números.
La forma estándar de detectar un NaN es ver si un número no es igual a él. ¿Podría quizás construir un sombreador de depuración que verifique cada fragmento para ver si no es igual a él mismo, y si se cumple esa condición, establezca un color intermitente y llamativo? ¿GLSL me permite detectar un NaN de esta manera o me quedo con un comportamiento indefinido cuando un valor no es válido?
¿Por qué se divide por 0 en total? ¿No puedes ver que el contador es 0 o cambiar tu algoritmo? – djmj
Es razonable que un programador siempre compruebe si un denominador potencial podría ser cero, pero la comprobación podría generar un costo de rendimiento. Mi pregunta está relacionada con la detección de valores incorrectos después del hecho. –