Я не могу найти вескую причину для этого нигде. Вектор отражения, используемый в фонге, имеет простую основу в физике. Но половинный вектор, используемый в блинне, по-видимому, не имеет рациональной основы и не является надлежащим отражением. И все же он используется в каждой так называемой «физической» функции затенения. Если для этого есть хорошая физическая основа, я хотел бы знать.
То, что я смог найти, это несколько причин:
Это быстрее - есть смешанная информация об этом, но даже в этом случае это была бы веская причина ... в 1998 году.
Он лучше обрабатывает углы выше 90 градусов - насколько я могу судить, единственная причина этого в том, что термин «фонг» использовался неправильно. Точечный продукт отражения и вида дает угол между -1 и +1. Обычно этот угол ограничен от 0 до 1, это является прямой причиной проблемы 90 градусов. Повторно нормализуйте угол вместо того, чтобы зажать его, и вы получите полный охват 180 градусов. Я отказываюсь верить, что простая операция x * 0.5 + 0.5 ускользнула от мира графики на 40 лет.
он лучше обрабатывает края - «проблема» с краями также существует в решении blinn, но в меньшей степени. Основная причина - неправильное моделирование освещения области на терминаторе, что должно быть важно для любого «физически основанного» шейдера. Но даже в более простых ситуациях сигмовидная функция может правильно аппроксимировать линию мягкого терминатора. Умножение на термин Ламберта некорректно, так как оно неправильно уменьшает зеркальный термин, это может отменить термин Френеля и привести к дальнейшим ошибкам.
У него длинные отражения на краю - мне кажется, что, хотя анизотропные отражения могут быть реалистичными, блинн не является правильным способом их реализации, поскольку они появляются только на краю. Это просто счастливое совпадение, что ошибка в термине H выглядит реалистичной.
Ни одна из этих причин не является удовлетворительной, я хочу разобраться в этом безумии.
Я хочу уточнить , что я не говорю о Blinn и Фонга конкретно , но вместо этого о компонентах вектора H и R, которые используются в качестве основы для этих шейдеров, а также других.
На самом деле, я думаю, что вы сами перечислили причины, по которым Блинн является дефолтом по сравнению с Phong.
Каждая причина, которую вы перечислили, на самом деле является областью, где Блинн оказывается лучше Фонга.
В целом все это приводит к тому, что Блинн по умолчанию лучше, чем Фонг.
Блинн идеален? Это лучше, чем Фонг?
Нет.
Но это разумное по умолчанию. Не стесняйтесь заменять Phong на Blinn в любом рендерере / шейдере, который вы пишете.
источник
Я обнаружил причину использования вектора H. К сожалению, это не тот способ, которым он используется в большинстве моделей шейдинга, что затем можно сделать неверным.
Для физического затенения отраженный свет должен подчиняться уравнениям Френеля. (Большинство «физически основанных» шейдеров этого не делают) Микрофасеты также должны подчиняться уравнениям Френеля, которые основаны на угле падения света, а также показателе преломления интерфейса для получения правильного результата.
Согласно закону отражения угол падения должен быть отражен с углом отражения по нормали к поверхности. Чтобы луч света попал в камеру - мы знаем, что он это сделал - он должен был отражаться от света - от которого мы знаем направление. Таким образом, нормаль поверхности должна быть вычетом быть зеркальной осью для этих двух направлений. Это дает нам половину вектора H, которая находится между ними. Рассчитывается путем нормализации суммы обоих.
Теперь, вычисляя угол между направлением света L и половинным вектором H, мы получаем угол падения для зеркального отражения микрообъекта и можем правильно его ослабить, используя термин Френеля.
Обратите внимание, что направление обзора равно R для этого микрообъекта, H не является отражающим членом. Блин, Кук, Торранс и Воробей могут сосать. Фонг и Френель были правы.
источник