Аппроксимация Шлика для отражения Френеля
Почти каждому встреченному мной разработчику игровой графики известна аппроксимация Шлика для отражения Френеля. У этой аппроксимации есть все свойства к тому, чтобы использоваться в играх. Она выглядит визуально эквивалентной реальному вычислению коэффициентов Френеля для неполяризованного света, и ее значительно проще посчитать. Тем не менее, очень немногие разработчики действительно читали оригинальную статью «Недорогая модель 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 / кубический знаменатель.
- Выполните решение для каждого коэффициента.
- Оцените общую ошибку. Решите, устраивает ли она вас. Если нет, попробуйте использовать другую рациональную функцию или добавьте дополнительные условия ядра для устранения проблемы.
Многовариантные функции подходят, хотя потенциально с ними могут появиться многие дополнительные коэффициенты. Такое приближение обычно лучше всего применимо вблизи визуального выходного конца шейдера. Оно используется в вычислении слишком рано, и небольшие ошибки могут увеличиться за счет промежуточного кода шейдера. Тем не менее, это может быть отличный способ чтобы уменьшить вычислительно дорогой шейдер.