понедельник, 21 мая 2012 г.

Анимационные герои

Котя





Пёся

Модели затенения. Плоская модель. Затенение по Гуро и Фонгу


Модели затенения. Плоская модель. Затенение по Гуро и Фонгу

В этой статье речь пойдет о методах наложения освещения на объекты сцены в процессе создания двухмерного изображения (растеризации), иначе называемых алгоритмами затенения. Широко известны и активно применяются три модели затенения, которые будут рассмотреныниже.

Полигональные модели геометрии

В современных API по выводу графики реального времени, таких как OpenGL и DirectX, а также во многих пакетах трехмерной графики, для представления геометрии используются полигональные модели. На практике это означает, что вся сцена представляет собой набор треугольников, называемых гранями.
В идеале поверхность модели, например тора, является гладким объектом. Но чтобы работать с такой поверхностью требуется создать полигональную модель, которая является приближением с некоторой точностью идеального объекта. При этом вершины граней полигонального приближения принадлежат реальной поверхности.
**
Идеальная модельПолигональное приближение

Для расчёта освещения необходимо задать нормали в тех точках, где оно будет вычисляться. Т.к. вершины полигонального приближения и вершины идеального объекта совпадают, то разумно задавать нормали в них. Другой способ - задание нормалей для граней. Такой способ приемлем, но он заведомо хуже, чем если бы нормали были заданы в вершинах. Действительно, вершина является точечным объектом, а грань имеет площадь. Т.о. для вершины можно задать нормаль точно, а для грани это некоторый усредненный вектор. К тому же, в моделях Гуро и Фонга нормаль должна быть задана в вершинах. Если исходно нормали были заданы для граней полигонов, то придется тем или иным образом восстанавливать их для вершин. Восстановленные значения будут чаще всего отличатся от реальных, так что некоторые детали будут потеряны. В качестве примера можно привести куб, нормали которого восстановлены усреднением по граням.
**
Нормали изначально заданы в вершинахНормали восстановлены

Конечно, это пример крайности, но он ярко демонстрирует потерю деталей при восстановлении.
Прим. В некоторых случаях восстановление нормалей является необходимой частью построения полигональной модели, например, когда в качестве исходной информации есть только несвязный набор точек. Стоит отметить, что в DirectX и OpenGL нормали можно задавать только для вершин.

Плоская модель затенения (flat shading)

Идея алгоритма плоского затенения довольна простая. Сперва цвет вычисляется в каждой вершине треугольника, затем полученные значения усредняются и весь треугольник закрашивается в полученный цвет. Данная модель обладает высокой скоростью работы, но на визуализированной модели чётко заметны переходы между гранями.
**
Сфера с плоским затенением, около 2000 треугольниковСфера с плоским затенением, около 32000 треугольников

Как видно на изображении, даже существенное увеличение количества треугольников не позволяет скрыть резкие переходы между ними. В настоящее время плоское затенение используется редко, в основном в программных визуализаторах или в тех случаях, когда необходимо подчеркнуть, что объект состоит из плоских граней.
Прим. При использовании этой модели, не возникает трудностей, когда нормали заданы для граней, а не для вершин. В этом случае цвет треугольника можно рассчитывать в его геометрическом центре.

Затенение по Гуро (Gouraud shading)

В этой модели освещение не усредняется для грани, а линейно интерполируется между вершинами, поэтому для данной модели важно то, что нормали задаются в вершинах. Этот алгоритм позволяет получить гораздо более визуально-приятное изображение, чем при использовании алгоритма плоского затенения.
**
Сфера с затенением по Гуро, около 2000 треугольниковСфера с затенением по Гуро, около 32000 треугольников

С другой стороны, вычислительная стоимость затенения по Гуро остается приемлемой, т.к. дорогостоящий расчёт освещения по-прежнему осуществляется в вершинах, а линейную интерполяцию можно хорошо оптимизировать. К сожалению, модель затенения по Гуро не безупречна. Блики на освещаемой поверхности при невысоком уровне детализации будут смазаны или могут вовсе "потеряться".
**
Смазанный блик в модели затенения ГуроЧёткий блик

Затенение по Фонгу (Phong shading)

В этой модели между вершинами интерполируется не цвет, а нормаль. Цвет, в свою очередь, рассчитывается для каждого пикселя в отдельности. При использовании затенения по Фонгу изображение получается гораздо более качественным, чем при использовании предыдущих техник, и исчезает проблема с бликами. Но данный алгоритм требует гораздо больше вычислительных ресурсов. К примеру, при использовании модели Фонга для визуализации сцены на экране с разрешением 1024x768, понадобится рассчитать освещение для более чем 700 000 точек.
**
Сфера с затенением по Фонгу, около 2000 треугольниковСфера с затенением по Фонгу, около 32000 треугольников

Шейдинг сегодня

До появления программируемых графических ускорителей, использовалась либо модель затенения Гуро, либо, если речь шла о программных визуализаторах, быстрое затенение по Фонгу. Во всех современных играх используется модель Фонга (попиксельное освещение), которую позволяют рассчитывать в реальном времени даже недорогие видеокарты. Это достигается за счёт огромного параллелизма в обработке данных.
Сегодня активно применяются такие техники, как наложение неровностей (bump mapping) или рельефное текстурирование (relief mapping), которые позволяют, не увеличивая реальный объём геометрии, а лишь за счет дополнительной информации в текстурах значительно повышать детализацию визуализируемых поверхностей. Подробнее об этом будет обязательно написано в отдельной статье.

Закон Ламберта. Модель отражения Фонга. Модель отражения Блинна-Фонга


Закон Ламберта. Модель отражения Фонга. Модель отражения Блинна-Фонга

Модель отражения Фонга является довольно популярной и широкоиспользуемой в компьютерной графике, несмотря на то, что существуют более точные физические модели. Она была предложена в статье Ву Тонг Фонга (Bui Tuong Phong) в 1975 году.
Пусть заданы точечный источник света, расположенный в некоторой точке, поверхность, которая будет освещаться и наблюдатель. Будем считать, что наблюдатель точечный. Каждая точка поверхности имеет свои координаты и в ней определена нормаль к поверхности. Её освещенность складывается из трех компонент: фоновое освещение (ambient), рассеянный свет (diffuse) и бликовая составляющая (specular). Свойства источника определяют мощность излучения для каждой из этих компонент, а свойства материала поверхности определяют её способность воспринимать каждый вид освещения.
*+*+*=*
Фоновая составляющая Рассеянная составляющая Зеркальная составляющая Суммарное освещение

Для удобства все векторы, описанные ниже, берутся единичными. В этом случае косинус угла между ними совпадает со скалярным произведением.
1.   Фоновое освещение это постоянная в каждой точке величина надбавки к освещению. Вычисляется фоновая составляющая освещения как:
Из формулы выше видно, что фоновая составляющая освещенности не зависит от пространственных координат освещаемой точки и источника. Поэтому при моделировании освещения, в большинстве случае, не имеет смысла брать более одного фонового источника света. Часто просто задается некое глобальное фоновое освещение всей сцены.
2.    Рассеянный свет при попадании на поверхность рассеивается равномерно во все стороны. При расчете такого освещения учитывается только ориентация поверхности (нормаль) и направление на источник света. Рассеянная составляющая рассчитывается по закону косинусов (закон Ламберта):

3.   Зеркальный свет при попадании на поверхность подчиняется следующему закону: “Падающий и отраженный лучи лежат в одной плоскости с нормалью к отражающей поверхности в точке падения, и эта нормаль делит угол между лучами на две равные части”. Т.о. отраженная составляющая освещенности в точке зависит от того, насколько близки направления на наблюдателя и отраженного луча. Это можно выразить следующей формулой:

Прим. В общем случае вектора
Именно зеркальное отражение представляет наибольший интерес, но в то же время его расчет требует больших вычислительных затрат. При фиксированном положении поверхности относительно источников света фоновая и рассеянные составляющие освещения могут быть просчитаны единожды для всей сцены, т.к. их значение не зависит от направления взгляда. С зеркальной составляющей этот фокус не сработает и придется пересчитывать её каждый раз, когда взгляд меняет свое направление.
Во всех вычислениях выше, для рассеянной и зеркальной компонен, если скалярное произведение в правой части меньше нуля, то соответствующая компонента освещенности полагается равной нулю.

Вычисление угла между отраженным лучом и направлением на наблюдателя

Угол между отраженным лучом и направлением на наблюдателя можно рассчитать по следующей формуле:
Получается это следующим образом. Проекции векторов
Скалярное произведение

Упрощенный расчет зеркальной компоненты освещенности. Модель Блинна-Фонга

Для расчета отраженной компоненты требуется выполнить довольно громоздкие вычисления. Существует модель Блинна-Фонга, представляющая собой модель Фонга с упрощенным расчетом зеркального отражения. Вычислим в каждой точке вектор полупути
который показывает ориентацию площадки, на которой будет максимальное отражение. Тогда величину
При этом α <> β и, в общем случае, соотношение между ними зависит от пространственной связи векторов
Модель отражения Блинна-Фонга никогда в точности не совпадает с моделью Фонга, однако можно подобрать соответствующие значения α иβ, для которых распределения зеркальной составляющей по поверхности для обеих моделей будут очень близкими. Вместе с тем, в ряде случаев модель Блинна-Фонга требует значительно меньше вычислений, например в случае направленного бесконечно-удаленного источника.

Учет цвета

Если используется цветовая модель RGB, то все расчеты, представленные выше проделываются для каждой компоненты R, G и B по отдельности. Если при этом освещать поверхность синим рассеянным светом (0.0, 0.0, 1.0), а она воспринимает только красный рассеянный (1.0, 0.0, 0.0), то рассеянная составляющая освещенности во всех точках этой поверхности будет равна (0.0, 0.0, 0.0).

Освещение в приложениях реального времени. Модель освещения. Модель затенения


Освещение в приложениях реального времени. Модель освещения. Модель затенения

Попробуем сформулировать задачу освещения как таковую и разобраться, на какие стадии разделяется весь процесс освещения сцены. Сразу оговоримся, что здесь описывается модель освещения, используемая для систем реального времени. Его характерные особенности, это дешевый расчет и приемлемая реалистичность, которой достаточно для научной визуализации или моделирования динамических сцен (например, в играх). Для рендеринга статических изображений высокого качества используются более дорогостоящие модели освещения, которые больше приближены к высокоточным физическим моделям.
Для начала потребуется построить модель освещения, по которой можно определить освещенность в некоторой точке, если известны параметры этой точки, наблюдателя и источников света. В приложениях реального времени используются полигональные модели, когда вся геометрия на сцене состоит из многоугольников. Они, в общем случае, состоят из нескольких пикселей и требуется сформулировать модель затенения - способ осветить каждый полигон в отдельности, зная лишь информацию в вершинах.

Модель освещения

В эту задачу входит классификация источников света на направленные, точечные и прожекторы. Для каждого из них надо предложить расчетную формулу освещенности в вершинах.
Прим. Все три типа источников света, перечисленные выше, доступны в OpenGL.

Модель затенения

Умея рассчитывать освещение в вершинах, требуется осветить каждый отдельный треугольник на сцене. Существуют плоская модель затенения, затенение по Гуро и Фонгу (попиксельное освещение). Эти модели описывают, как освещенность интерполируется по полигону между вершинами.
В статьях настоящего раздела, посвященного теории освещения, эти вопросы рассмотрены подробно.

Аффинные преобразования пространства


Аффинные преобразования пространства

При работе с трехмерными объектами, часто требуется совершать по отношению к ним различные преобразования: двигать, поворачивать, сжимать, растягивать, скашивать и т.д. При этом в большинстве случаев требуется, чтобы после применения этих преобразований сохранялись определенные свойства.
Определение. Преобразование плоскости называется аффинным (от англ. affinity – родство), если
  • оно взаимно однозначно;
  • образом любой прямой является прямая.
Преобразование называется взаимно однозначным, если
  • разные точки переходят в разные;
  • в каждую точку переходит какая-то точка.
Свойства аффинного преобразования в трехмерном пространстве:
  • отображает n-мерный объект в n-мерный: точку в точку, линию в линию, поверхность в поверхность;
  • сохраняет параллельность линий и плоскостей;
  • сохраняет пропорции параллельных объектов – длин отрезков на параллельных прямых и площадей на параллельных плоскостях.
Любое аффинное преобразование задается матрицей 3x3 с ненулевым определителем и вектором переноса:
Посмотрим на это с точки зрения математики. R представляет собой матрицу линейного оператора над пространством трехмерных векторов. Вектор T требуется для осуществления параллельного переноса: если помножить ( 0  0  0 ) на любую матрицу 3x3, опять получим ( 0 0  0 ) – начало системы координат, относительно преобразования R, является неподвижно точкой. Требование, чтобы определитель был ненулевой, диктуется определением. По сути, если определитель матрицы R равен нулю, то всё пространство переходит в плоскость, прямую или точку. Тем самым не соблюдается взаимная однозначность.
На практике удобно задавать аффинное преобразование одной матрицей. При этом используются однородные координаты, введенные впредыдущей статье. Аффинное преобразование будет задаваться следующей матрицей 4x4:
Заметим, что первые три значения последней строки равны 0. Это необходимое условие того, что преобразование будет аффинным. В общем случае произвольная матрица размера 4x4 задает проективное преобразование. Такие преобразования, как можно догадаться из названия, используются для проецирования трехмерной сцены. Подробнее об этом будет рассказано в одной из последующих статей.
Рассмотрим частные случаи аффинных преобразований.
Прим. Здесь и в дальнейшем будет использоваться система координат, введенная следующим образом:
  • система координат правая;
  • ось z направлена на наблюдателя, перпендикулярно плоскости экрана;
  • ось y находится в плоскости экрана и направлена вверх;
  • ось x находится в плоскости экрана и направлена вправо.

Подробнее мы остановимся на этом при рассмотрении геометрического конвейера.

Параллельный перенос

**
Исходный объектПараллельный перенос

Матрица этого преобразования выглядит следующим образом:
В данном случае матрица R = E, единичной матрице.
Преобразования, рассматриваемые ниже, затрагивают только матрицу R, поэтому будет указываться только она.

Поворот (вращение)

**
Исходный объектПоворот вокруг некоторого вектора

Если на плоскости повороты делались вокруг некоторой точки, то в трехмерном пространстве повороты производятся вокруг некоторого вектора. Перед тем, как перейти к построению матрицы поворота вокруг произвольного вектора, рассмотрим частные случаи поворотов вокруг координатных осей.
Прим. Поворот вокруг произвольного вектора не равно поворот вокруг произвольной направленной прямой.

Поворот вокруг оси y

**
Исходный объектПоворот вокруг оси y

Заметим, что при повороте вокруг оси y ординаты точек (у-координаты) не меняются. Также стоит отметить, что координаты x и z точки преобразуются независимо от y-координаты. Это означает, что любая точка p(x, y, z) перейдет в точку p’(x’(x, z), y, z’(x,y)). Теперь осталось понять, как преобразуются координаты x и z: в плоскости Oxz это будет поворот вокруг начала координат по часовой стрелке (т.к. x z y - левая тройка), т.е. в отрицательном направлении. Матрица такого преобразования известна (см. Поворот плоскости):
В итоге:
Матрица преобразования Ry(φy):

Поворот вокруг осей x и z

**
Поворот вокруг оси xПоворот вокруг оси z

Аналогичными рассуждениями можно получить матрицы поворотов Rx(φx) и Rz(φz)вокруг осей x и z, соответственно.
Приведём окончательные результаты:
Несложно заметить, что определители матриц Rx, Ry, Rz равны 1. Также матрицы вращений Rrot обладают свойством ортогональности:RTR = RRT = E. Из этого, в свою очередь, следует полезное свойство, что обращение матрицы поворота можно заменить транспонированием: R-1(φ) = RT(φ).

Масштабирование (сжатие/растяжение, отражение)

**
Исходный объектМасштабирование

Коэффициенты сжатия/растяжения, по аналогии с двухмерным пространством, определяются диагональными членами матрицы R:
Результат:
Комбинация коэффициентов sx = -1, sy = 1, sz = 1 будет задавать отражение от плоскости Oyz (x = 0). При sx = sy = sz = -1 получим центральную симметрию относительно начала координат.

Интерпретация матрицы R

Рассмотрим, что представляет собой матрица R с точки зрения линейной алгебры. Оказывается, что матрица R содержит базис новой системы координат.
Действительно, матрица
( R11    R12    R13 )
( R21    R22    R33 )
( R31    R32    R33 )
переводит вектора декартова базиса:
( 1  0  0 ) → ( R11  R21  R31 )
( 0  1  0 ) → ( R12  R22  R32 )
( 0  0  1 ) → ( R13  R23  R33 )

Скос

**
Исходный объектСкос

Теперь несложно получить преобразование скоса. Например:
Прим. Если придерживаться общепринятой терминологии, то приведенное выше преобразование называется сдвигом. Сдвигом (shear) будет любое преобразование, главная диагональ матрицы R которого единичная. Если при этом определитель матрицы R равен нулю, то преобразование не является аффинным.

Сложные аффинные преобразования

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