Закраска, освещение и удаление невидимых поверхностей
Каркасные изображения легко получать, но они мало похожи на реальные объекты. Большинство объектов - непрозрачны и составляющие их поверхности закрывают собой другие тела. Неважно, откуда мы смотрим на них, в любом случае некоторые части тел от нас скрыты. В каркасном же изображении мы видим весь объект, независимо от того, находится ли какая-либо часть за или перед другими его частями.
В программах машинной графики применяются несколько методов удаления невидимых поверхностей. Один из простейших и широкоиспользуемых подходов известен как метод z-буфера. Идея его проста. В процессе сканирования поверхность модели преобразуется в значения пикселов в видеобуфере. Одновременно с этим вычисляется расстояние от каждой точки поверхности до некоторой произвольной, но фиксированной плоскости, расположенной за сценой. Эти расстояния хранятся в отдельной части памяти, называемой z-буфером, которая содержит данные для каждого пиксела изображения. Компьютер сканирует данную модель, и если расстояние, вычисленное для данного пиксела, больше, чем ранее для него же записанное (если, к примеру, компьютер уже просмотрел часть поверхности, находящуюся за текущей), то z-буфер обновляется, в него заносится большее из двух значений, и пикселу приписывается цвет рассматриваемой поверхности. Если же это расстояние меньше, чем ранее записанное (это указывает на то, что точка лежит на поверхности, которая расположена за фрагментом, рассмотренным ранее), то в ячейке z-буфера остается старое значение и цвет пиксела не изменяется. Когда будут просмотрены все фрагменты сцены, видеобуфер будет содержать изображение с удаленными невидимыми поверхностями. Одно из преимуществ z-буфера в том, что фрагменты могут просматриваться в любом порядке. Независимо от порядка сканирования результат будет одним и тем же.
Удаление невидимых частей поверхности - всего лишь один фактор, влияющий на реалистичность изображения. Дальше нужно обсудить закраску подходящими цветами видимых поверхностей. Простейший подход здесь - приписать каждой части поверхности объекта свой цвет и соответсвенно рисовать им все точки. Однако изображения, полученные таким способом, оставляют желать лучшего. У реальных объектов одинаково окрашенные поверхности имеют разные оттенки из-за разного освещения. Это особенно ясно видно, когда объект освещается со стороны в темной комнате ярким направленным источником света, например фонариком. Поверхности, обращенные лицевой стороной к источнику - освещены ярко, в то время как поверхности, повернутые тыльной стороной - кажутся темными, почти черными. Для того, чтобы создавать правдоподобные изображения, компьютер должен применять специальные алгоритмы закраски для имитации неравномерного освещения.
Вычисления для такой закраски доходят до того, что считается цвет каждого пиксела на каждой поверхности модели и цвета варьируются, чтобы учесть неравномерность освещения. Таких методов много в компьютерной графике, особенно часто они применяются для моделей многогранников. Расмотрим два таких подхода: плоскую закраску и алгоритм Гуро. В первом алгоритме каждому многоугольнику приписывается гипотетический цвет. Получив описание источника света, который освещает объекты сцены, компьютер определяет оттенки цветов, основываясь на том, под каким углом падает свет. Чем больше повернута к источнику поверхность объекта, тем ярче будет она закрашена. Каждой точке на одном многоугольнике приписывается один и тот же оттенок, но различные многоугольники закрашиваются разными цветами. Закраска Гуро (названная по имени создателя алгоритма Генри Гуро) - улучшает предыдущую плоскую закраску, т.к. здесь оттенки цветов варьируются среди точек одного многогранника. Это повышает реалистичность изображений и криволинейные поверхности, представленные полигональными моделями, выглядят более гладкими, плавными.
Ни один из этих методов закраски не учитывает такие сложные световые эффекты, присутствующие в жизни, как зеркальное отражение и отбрасывание теней. (Обычный пример зеркального отражения - это небольшое белое пятнышко, которое мы увидим на глянцевом яблоке, если будем освещать его ярким светом. Блестящая поверхность яблока ведет себя как зеркало, отражая прямо падающий свет.) Другие улучшенные алгоритмы закраски позволяют учитывать такие эффекты, как зеркальное отражение, но требуют более длительной работы компьютера. Вообще чем более реалистичной мы хотим получить картинку, тем больше компьютерного времени потребуется для ее создания. Для многих приложений такие методы, как плоская закраска и закраска Гуро, являются разумным балансом между качеством изображения и временем, требующимся для его создания. Здесь рассматривается, как работают два этих алгоритма закраски и как удаляются невидимые поверхности с помощью метода z-буфера.
Как работает метод z-буфера
1. Метод z-буфера позволяет компьютеру удалить невидимые части объекта при не очень больших вычислениях, при которых каждая поверхность модели последовательно просматривается и преобразуется в пикселы. Вначале во всех ячейках видеобуфера установлен цвет фона, а все значения z-буфера равны 0. Z-буфер содержит ровно одну ячейку для каждого пиксела изображения.
2. Когда сканируется и переводится в пикселы голубой квадрат, для каждого пиксела считается z-значение - расстояние от соответствующей точки поверхности до некоторой абстрактной плоскости, расположенной за моделью. Если для данного пиксела z-значение больше, чем то, что хранилось в этой ячейке раньше, то в видеобуфер копируется значение нового пиксела (новый цвет), а в z-буфер - новое z-значение. Так как z-буфер был инициализирован нулями и это первая поверхность, просматриваемая нами, то в видеобуфер будет помещено изображение всего голубого квадрата.
3. Когда будем просматривать красный квадрат, z-значения точек, которые лежат за голубым квадратом, будут меньше, чем z-значения, записанные на предыдущем шаге. Поэтому в видеобуфер попадут только те красные точки, которые не перекрываются голубым квадратом. Результат будет одним и тем же, как если бы мы сканировали сначала красный квадрат, потому что голубые пикселы имеют большие z-значения, а значит, они все равно "вытеснили" бы красные пикселы.
4. Две этих картинки, сгенерированные по трехмерной модели трех кнопок, иллюстрируют результат работы метода z-буфера. Изображение слева - каркасное, изображение справа - версия той же модели (без закраски), но с удаленными невидимыми поверхностями.
Как осуществляется плоская закраска.
1. Этот метод добавляет немного реалистичности в изображение сцены, так как яркость закраски каждой поверхности зависит некоторым образом от угла падения света на нее. Изображенная здесь каркасная модель состоит исключительно из полигональных поверхностей, и поэтому для нее лучшим образом подходит метод плоской закраски.
2. В начале процесса закраски компьютер вычисляет нормаль для каждого многоугольника. Вектор нормали можно представлять себе в виде стрелки, указывающей направление лицевой поверхности грани.
3. Дальше компьютер вычисляет угол между нормалью каждого многоугольника и направлением луча, выпущенного некоторым абсрактным источником света. Тем многоугольникам, нормаль которых параллельна направлению света (т.е. тем плоскостям, которые непосредственно "смотрят" лицевой частью на источник света), приписывается наибольшая интенсивность света, а те грани, чья нормаль составляет 90 и больше градусов с направлением света (т.е. плоскости, которые не "видят" источника) рисуются черными. Говоря математическим языком, яркость поверхности пропорциональна косинусу угла. Если вы знаете тригонометрию, то вспомните, что косинус нуля градусов равен 1.0, а косинус 90 градусов равен 0.0. Таким образом, самая большая интенсивность цвета будет только у поверхностей, нормаль которых образует нулевой угол с направлением луча, освещающего сцену.
4. Процесс закраски повторяется для каждого многоугольника и применяется метод z-буфера или другой метод удаления невидимых поверхностей, чтобы убрать с изображения многоугольники (или их части), закрытые другими многоугольниками. В результате получим плоско-закрашенное изображение.
Как работает метод Гуро.
1. В отличие от плоской закраски, при которой все точки одного многоугольника рисуются одним цветом, в методе Гуро интенсивность освещения, а, следовательно, и цвет каждой точки - меняется вдоль поверхности многоугольника. Здесь опять рассматривается простая полигональная модель.
2. Сначала компьютер вычисляет нормали для каждой вершины модели. (Вершиной здесь называется точка, где соединяются многоугольники.) Нормаль вершины считается как среднее между нормалями всех многоугольников, пересекающихся в данной вершине.
3. Для данного многоугольника интенсивность освещения в каждой вершине считается так же, как и для всей поверхности при плоской закраске. Интенсивность освещения в вершине пропорциональна косинусу угла между нормалью в вершине и направлением падающего света.
4. Цвета ребер и внутренности многоугольника находятся с помощью интерполяции цветов вершин. Таким образом варьируется яркость точек на поверхности и изображение получается более реалистичным.
5. Проводя этот процесс для каждого многоугольника и удаляя невидимые поверхности, получим изображение, закрашенное методом Гуро. Эта закраска более плавная, чем плоская, потому что сливаются вместе линии, где пересекаются многоугольники. Единственным видимым доказательством того, что изображение получено из полигональной модели, является немного изломанный контур изображения.