Как число помогало нормализовать векторы

Чтобы рассчитать, как свет отражается от поверхности, 3D-программе нужны направления: например, куда направлен луч света и куда смотрит камера. Такие направления удобно хранить как векторы — наборы чисел для координат. Часто их нужно нормализовать, то есть сделать единичной длины, сохранив направление. Для этого приходится находить квадратный корень из суммы квадратов координат, а затем делить на результат.

Именно здесь пригодился быстрый обратный квадратный корень: он сразу приближённо вычисляет величину, обратную квадратному корню. Умножив на неё координаты вектора, можно получить почти единичный вектор — без отдельного деления каждой координаты.

Что делала шестнадцатеричная константа

В известной реализации этого приёма число `0x5f3759df` служило стартовой догадкой. Алгоритм смотрел на двоичное представление числа с плавающей точкой — способ, которым компьютер кодирует дробные числа, — и с помощью этой константы получал приближение обратного квадратного корня. Затем несколько арифметических операций, основанных на методе Ньютона, уточняли ответ.

Метод Ньютона здесь можно представить как быстрый способ исправить неточную догадку: вычислить ошибку и сдвинуть приближение ближе к правильному значению. Результат не был математически идеальным, но для многих графических расчётов его точности хватало.

Почему это имело значение

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

Так небольшая погрешность в отдельном промежуточном шаге могла помочь получить больше световых вычислений за то же время — компромисс между точностью и скоростью, особенно ценным для интерактивной 3D-графики.