Координаты текстур OpenGL и точность небольших поплавков - PullRequest
4 голосов
/ 14 февраля 2012

Я использую поплавки для указания координат текстуры в диапазоне 0-1.OpenGL любит вещи в этом диапазоне, и я хорошо задаю координаты таким образом, но меня беспокоит, когда я начинаю использовать большие текстуры (скажем, до 4096 или 8192 пикселей), что я могу начать терять точность.Например, если я хочу указать координату (1,1) в текстуре 8192x8192px, это будет соответствовать 1/8192=0.0001220703125.Похоже, это оценивается как 0.000122070313 как число с плавающей точкой ... Я обеспокоен тем, что мой шейдер OpenGL не будет отображать тот же пиксель, который я намеревался.какое-то время, но рано или поздно мне придется конвертировать его (возможно, уже в самом шейдере).Есть ли обходной путь для этого, или это то, о чем я должен даже беспокоиться?


Умножая его обратно, я получаю 1.000000004096, который, я думаю, все равно будет интерпретироваться как 1?На самом деле, OpenGL делает смешивание, если это не целое число, не так ли?Возможно, не с «ближайшим соседом», а с «линейным»:

1/4096f * 4096 =   1, error = 0
1/8192f * 8192 =   1.000000004096, error =  0.000000004096
1/16384f * 16384 = 1.0000000008192, error = 0.0000000008192
1/32768f * 32768 = 0.9999999991808, error = 0.0000000008192
...
1/1048576f * 1048576 = 0.9999999827968, error = 0.0000000172032

(я использую отладчик Visual Studio для вычисления числа с плавающей запятой и затем умножаю его обратно с помощью калькулятора)

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

1 Ответ

3 голосов
/ 14 февраля 2012

Похоже, что значение равно 0,000122070313 как число с плавающей запятой ... Я обеспокоен тем, что мой шейдер OpenGL не отобразит это на тот же пиксель, который я намеревался.

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

Число с плавающей запятой не сохраняется как 0,000122070313; он хранится как 1.22070313x10 ^ -4. Мантисса - 1,22070313, показатель степени - 4. Если бы показатель составлял -8, вы бы имели такую ​​же точность.

Ваш показатель степени с плавающей точкой одинарной точности может опуститься до + или - ~ 38. То есть вы можете иметь 38 нулей между десятичной и первой ненулевой цифрой мантиссы.

Так нет, вас это не должно волновать.

Единственное, что должно вас беспокоить, - это точность интерполированного значения и точность выборки текстуры. Но это не имеет ничего общего с точностью данных, в которых вы сохраняете координаты текстуры.

...