GLSL как обеспечить максимально возможное значение float без переполнения

из того, что я понимаю, в GLSL нет констант типа FLT_MAX.

есть ли способ гарантировать, что float представляет максимально возможное значение без переполнения?

EDIT:

Так как его спросили, что я использую это для:

Я в основном масштабирую точку в "бесконечность". Его для 2D теневого литья, где я полностью изменяю тени треугольной полосы на GPU. Поскольку я могу управлять только одной вершиной за раз компонент w сохраняет, остается ли он на корпусе или проецируется на бесконечность.

в случае, если обе точки "границы тени" на одном и том же краю, и свет почти колинейный с этим краем, мне нужно убедиться, что треугольник по-прежнему покрывает весь экран. Это трудно описать.

3 ответов


Да, согласно спецификация языка GLSL в 4.1.4 они являются стандартными типами данных IEEE 754. Я полагаю, что отсутствие FLT_MAX просто потому, что доступны разные длины: одиночная точность (float), двойная точность (double) и иногда даже половина точности. Вы можете использовать положительную и отрицательную бесконечность или, если вам нужно конечное максимальное/минимальное значение, самые высокие числа, доступные в плавающей точке. Точный шаблон легко узнать, если вы ищете сайте StackOverflow.


в GLSL бесконечность IEEE 754 может быть удобно достигнута путем деления на ноль:

float infinity = 1.0 / 0.0;

GLSL использует определение с плавающей запятой IEEE 754 для float:

в качестве входного значения для одного из блоков обработки, одинарной точности и двойной точности чисел с плавающей запятой, как ожидается, чтобы соответствовать стандарту IEEE 754 с плавающей точкой для определения точности и динамического диапазона. Переменные с плавающей запятой в шейдере также кодируются в соответствии со спецификацией IEEE 754 для значений с плавающей запятой с одной точностью (логически, не обязательно физически.) В то время как кодировки логически IEEE 754, операции (сложение, умножение и т. д.) не обязательно выполняются в соответствии с требованиями IEEE 754.

на максимальное представимое значение типа float is (1 - 2^-24) × 2^128

типичные максимальные значения с плавающей запятой

вы можете использовать это (взято из поплавок Microsoft.h)
#define FLT_MAX 3.402823466e+38
#define FLT_MIN 1.175494351e-38
#define DBL_MAX 1.7976931348623158e+308
#define DBL_MIN 2.2250738585072014e-308

точное максимальное значение с плавающей запятой

также, поскольку максимальное значение с плавающей запятой

7f7f ffff = 0 11111110 11111111111111111111111 = 2139095039

вот еще один интересный способ, чтобы получить точное максимальное значение:

float fMaxFloat = intBitsToFloat(2139095039);