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);