Лучший способ обнаружить NaN в шейдерах OpenGL

Сегодня утром я столкнулся с загадочной ошибкой, и мне очень повезло, что я довольно быстро наткнулся на решение.

Я делил с помощью счетчика, чтобы получить среднее значение внутри фрагментного шейдера, и, конечно, когда счетчик равен нулю, результирующее значение цвета становится NaN.

Во время смешивания NVidia изящно обрабатывает NaN как значение 0, но Intel этого не делает и, похоже, каскадирует NaN, что приводит к черным фрагментам.

Таким образом, эта ошибка сохранялась, пока я не протестировал код на машине Intel.

Интересно, могу ли я что-нибудь сделать, чтобы «уловить» недопустимые значения. Кажется, что, как и в обычном программировании, единственный верный (и даже тогда он не кажется пуленепробиваемым) способ справиться с этим - это внимательно рассмотреть все возможные случаи при делении чисел.

Стандартный способ определить NaN - проверить, не равно ли число самому себе. Могу ли я, возможно, создать отладочный шейдер, который проверяет каждый фрагмент, чтобы убедиться, что он не равен самому себе, и, если это условие выполняется, установить мигающий заметный цвет? Позволяет ли GLSL обнаруживать NaN таким образом, или я застреваю с неопределенным поведением всякий раз, когда значение недействительно?

17
задан Steven Lu 25 February 2012 в 18:40
поделиться