Аппроксимация Шлика для отражения Френеля

Почти каждому встреченному мной разработчику игровой графики известна аппроксимация Шлика для отражения Френеля. У этой аппроксимации есть все свойства к тому, чтобы использоваться в играх. Она выглядит визуально эквивалентной реальному вычислению коэффициентов Френеля для неполяризованного света, и ее значительно проще посчитать. Тем не менее, очень немногие разработчики действительно читали оригинальную статью «Недорогая модель BRDF для физически корректной визуализации» Кристофа Шлика, опубликованную в 1994 году в Computer Graphics Forum. Это позор, потому что в той статье есть по-настоящему хорошие идеи насчет других приближений при вычислении шейдеров.

Основная идея состоит в том, чтобы в качестве приближения придумать рациональную функцию (отношение двух многочленов). Решение имеет длинную историю в компьютерной графике и за ее пределами, но обычно несет в себе некоторые проблемы. Рассмотрим статью «Быстрая закраска по методу Фонга» (Fast Phong Shading), опубликованную Бишопом и Веймером в SIGGRAPH в 1986. Этот метод пытается избежать векторной перенормировки, присущей нормальной интерполяции Фонга, используя квадратичный ряд Тейлора. К сожалению, разложение Тейлора по своей сути сосредоточено вокруг точки, в данном случае — центра треугольника. При приближении к краю треугольника будет возникать некоторая ошибка, и два треугольника, разделяющих этот край, не обязательно будут иметь одинаковое количество ошибок в нормализации. Для больших треугольников это может привести к заметным несостыковкам шейдинга вдоль краев треугольника. Нехорошо.

Идея Шлика — выразить то, что важно для любой функции, как условия ядра, а затем применить их как ограничения. Для его приближения Френеля

аппроксимация шлика

Эти ограничения заключаются в том, что F должно быть 1 при dot(H,V)=0, F0 при dot(H,V)=1, а первые несколько производных от F также должны быть равны 0 при dot(H,V)=1. В статье он приводит аналогичные аппроксимации для геометрического затухания и коэффициенты распределения модели шейдинга Кука-Торренса. Но метод хорошо знать хотя бы потому, что он помогает уменьшить количество вычислений для шейдеров:

  1. Посмотрите на функцию и выберите условия ядра: значение или производные в некоторых критических точках, желаемый интеграл по всей области и т. д.
  2. На основе вида функции выберите рациональную функцию с правильным числом коэффициентов. Это своего рода черная магия, так как существует много вариантов для полинома числителя и знаменателя с одинаковым количеством коэффициентов при заданных условиях ядра. Например, для четырех условий вы можете выбрать кубический полином, квадратичный числитель / линейный знаменатель, линейный числитель / квадратичный знаменатель или 1 / кубический знаменатель.
  3. Выполните решение для каждого коэффициента.
  4. Оцените общую ошибку. Решите, устраивает ли она вас. Если нет, попробуйте использовать другую рациональную функцию или добавьте дополнительные условия ядра для устранения проблемы.
Читай также:  Интервью с Антоном Чорбой: Профессия геймплей-программиста

Многовариантные функции подходят, хотя потенциально с ними могут появиться многие дополнительные коэффициенты. Такое приближение обычно лучше всего применимо вблизи визуального выходного конца шейдера. Оно используется в вычислении слишком рано, и небольшие ошибки могут увеличиться за счет промежуточного кода шейдера. Тем не менее, это может быть отличный способ чтобы уменьшить вычислительно дорогой шейдер.

Источник: https://gaim.umbc.edu/2010/09/07/approximation/

Ребята! Пожалуйста, если Вам понравилась статья — пошарьте её в соц. сетях, особенно ценны Facebook и Google+
Это очень поможет нашему блогу, огромное спасибо!