В дальнейшем, чтобы определить цвет конкретной освещенной вершины, эффект от включенных источников освещения накладывается на свойства материала поверхности. У материала есть следующие характеристики: излучаемый свет; уровень рассеянного, матового и зеркального отражений; яркость. Свойства материала можно определять отдельно для передней (front-facing) и для задней (back-facing) поверхностей вызовами функции gl Materi al.

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

1.7.3. Сборка примитивов

После того как определены все параметры каждой конкретной вершины, эти данные используются на этапе, называемом сборкой примитивов (см. рис. 1.1,3). Здесь происходит формирование примитивов: точки из одной вершины, линии из двух вершин, треугольника из трех вершин, четырехугольника из четырех вершин и многоугольника из произвольного количества вершин. Для API-метода «вершина за раз» тип примитива передается в функцию gl Begi n, а для метода массивов вершин - в функцию, принимающую массив вершин.

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

1.7.4. Обработка примитивов

Следующий этап (см. рис. 1.1,4) па самом деле состоит из нескольких шагов, для простоты объединенных на диаграмме в один блок. Первый шаг - отсечение, операция, которая сравнивает каждый примитив с плоскостями отсечения, заданными вызовами функции gl Cl i рР1 ane, и с отображаемым объемом из видовой матрицы и матрицы проекции. Если примитив полностью находится внутри отображаемого объема и плоскостей отсечения, он передается для последующей обработки. Если примитив полностью снаружи, он отбрасывается. Но если примитив частично внутри, а частично - снаружи, его разделяют (отсекают) таким образом, что для последущей обработки передается только внутренняя часть.

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

На шаге отбраковки проверяется, является ли каждый многоугольный примитив лицевым (расположен на переднем плане) для текущей точки обзора. Отбраковка включается функцией gl Enable, a glCul 1 Face определяет, какие примитивы переднего и заднего плана можно игнорировать (отбраковывать).


⇐ вернуться назад | | далее ⇒