Материал получен от доктора Инцай Сяо, 3460:457/557.
Затенение
Затенение инкапсулирует объекты, источники света и камеры. Объекты можно преобразовать в пиксели, используя порядок изображений (начиная с пикселей; трассировка лучей) или порядок объектов (начиная с объектов; преобразование сканирования).
Затенение в пикселе чаще всего использует модель отражения Фонга.
Модель отражения Фонга
Модель отражения Фонга включает окружающее отражение, диффузное отражение и зеркальное отражение.
Окружающее отражение не зависит от направления; и выводится с использованием I_a * k_a
, где I_a
— интенсивность окружающего света, а k_a
— коэффициент отражения окружающего пространства.
Диффузное отражение зависит от направления; и выводится с использованием I_d * k_d * (l ● n)
или I_d * k_d * cos(θ)
, где I_d
— интенсивность рассеянного света, а k_d
— коэффициент отражения объекта. θ
— это угол между направлением света (l
) и нормалью к поверхности (n
). l
и n
— единичные векторы.
Зеркальное отражение зависит от направления просмотра; и выводится с использованием I_s * k_s * (v ● r)^⍺
или I_s * k_s * cos^⍺(Ф)
, где I_s
— интенсивность зеркального света, а k_s
— коэффициент зеркального отражения. Ф
— это угол между направлением отражения (r
) и направлением взгляда (v
). ⍺
— коэффициент блеска.
Модель отражения Фонга: «Формула Я»
Чтобы вывести формулу для отражения Фонга, мы должны, наконец, рассмотреть затухание или потерю интенсивности, когда что-то проходит через среду (в нашем случае теоретическое пространство).
Затухание зависит от расстояния и не влияет на окружающий свет. Учитывая расстояние d
от источника света до точки поверхности, f_att = 1/(a + bd + cd^2)
. a, b и c — постоянные, линейные, квадратичные коэффициенты затухания.
Учитывая это и приведенную выше информацию, мы можем получить: I = I_a * k_a + f_att * I_d * k_d * (l ● n) + f_att * I_s * k_s * (v ● r)^⍺
.
В качестве альтернативы мы можем получить расширенную форму: I = I_a * k_a + (I_d * k_d * cos(θ)) / (a + bd + cd^2) + (I_s * k_s * cos^⍺(Ф)) / (a + bd + cd^2)
.
Затенение цвета можно выполнить, вычислив I
для всех 3 цветовых каналов RGB.
Адаптация: рекурсивная I
формула: I_new = (1 - k_ref — k_trans) * I_light + k_ref * I_illum_ref + k_trans * I_illum_trans
Затенение порядка изображений
Затенение порядка изображений или трассировка лучей может быть реализовано в простейшей форме следующим образом:
Отслеживание порядка объектов
Затенение порядка объектов реализовано с использованием Flat/Constant, Gouraud или Phong.
Идея отслеживания порядка объектов состоит в том, чтобы брать объекты, аппроксимированные в виде треугольников (или моделей), и определять цвет для каждого пикселя треугольников. Эта концепция требует z-буфера или буфера памяти для хранения значений глубины (z) каждого пикселя.
Плоское/постоянное затенение
Плоское или постоянное затенение проходит по объектам, а затем по треугольникам (или многоугольникам). Цвет пикселя вычисляется один раз, а затем устанавливается для всех пикселей внутри треугольников, которые ближе, чем существующее значение z-буфера.
Гуро Шейдинг
Затенение по Гуро идентично плоскому затенению, за исключением того факта, что отражение вычисляется во всех вершинах треугольника, а затем интерполируется для кадрового буфера.
Фонг Шейдинг
Теоретически затенение Фонга существенно не отличается от затенения Флэта и Гуро. Разница в том, что затенение Фонга использует модель отражения Фонга для каждой точки с интерполированной нормалью.
Визуализации
Это все, ребята! Пожалуйста, оставьте комментарий или поставьте лайк, если вам понравился этот материал. 😉