Я «просматриваю поля расстояний» (правильный жаргон: трассировка сфер) в GLSL. Чтобы реализовать конусное марширование поверх него (а также свести к минимуму количество шагов raymarching независимо от того, добавлено ли конусное марширование или нет), мне нужно оценить радиус конусного луча на любом заданном расстоянии.
Вспомним, что с полями расстояний raymarching «попадание» записывается, когда расстояние до объекта меньше порогового значения, часто в коде с именем nearLimit или epsilon. Этот порог можно рассматривать как эквивалент радиуса конуса луча, если мы увеличиваем его экспоненциально с пройденным расстоянием — таким образом, мы выпускаем в пространство не прямые тонкие лучевые линии, а конусы, расширяющиеся в соответствии с перспективной проекцией. Это более точно охватывает захват «правильных» удаленных объектов (на данный момент давайте пока проигнорируем проблему смешивания материалов и фильтрации нормалей всех пересекающихся объектов в конусе обзора на расстоянии t...).
На шаге 0 этот радиус может быть аппроксимирован чем-то вроде
float fInitialRadius = 1 / min(screenwidth, screenheight);
Затем его можно экспоненциально увеличивать на каждом шаге, применяя начальный радиус к расстоянию:
fNearLimit = fTotalDist * fInitialRadius; // after each raymarching step
Это работает нормально, но все еще имеет артефакты. Если я использую fInitialRadius*fInitialRadius (в результате получается меньшее число, поскольку начальный радиус для фреймбуфера 640 пикселей и плоскости просмотра единичной ширины составляет 1/640), я получаю меньше артефактов и более точный результат. Но оба подхода неточны, первый слишком рьяный (увеличивает радиус слишком сильно и слишком рано), второй слишком ленив (увеличивает радиус слишком мало и слишком поздно).
Наиболее точный фактор для увеличения fNearLimit/радиуса конуса на заданном расстоянии, скорее всего, должен учитывать мое текущее поле зрения и будет варьироваться в зависимости от того, составляет ли поле зрения 45°, 60°, 90° или...
TL;DR: я хочу знать, каков правильный расчет или наиболее приемлемая аппроксимация радиуса конуса на заданном расстоянии с учетом начального радиуса пикселя на шаге 0 и поля угол обзора?