OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 6
Текст из файла (страница 6)
На самом деле слова Со1о г в имени достаточно для того, чтобы определить команду, которая устанавливает текущий цвет. Однако существует несколько таких команд, для различных типов аргументов. В частности, цифра 3 в суффиксе указывает, что команда имеет три аргумента; в другой версии команды Со1о г используются четыре аргумента. Буква 1 в суффиксе указывает, что аргументы — типа 11оа11 пдро | и С (вещественные числа). Такилг образом ОрепСБ приобретает возможность цринимать данные пользователя в угодных последнему форматах данных. Для некоторых команд ОрепСБ используются аргументы восьми различных типов данных. Буквы-суффиксы этих типов данных соответствуют стандарту 1БО для языка С, они приведены в табл.
1.1 вместе с определением типов ОрепС(.. Используемая вами реализация ОрепСБ может в точности не повторять эту схему, как, например, в реализации С++ или Ада. Суффикс Тип данных Типичное соответствие в языке С Тип данных в Орепбь Идно сьаг збогг ! пг ог (апд Роаг боОЫе Опзгдпег) сЬаг ОП519пеб 5ЬО|1 Опадпе|1 (пг или Опйдпеб (опд г) ОЬ О5 О| Таким образом, кол|анды 8!Негсехг|(1, 3); 8|уег|ехгг(1.О. 3.О); эквивалентны, за исключением того, что первая определяет координаты веригин как переменные 32-битного целого типа, а вторая — как числа вещественного ти- па с одинарной точностью.
ПРИМЕЧАНИЕ В различных реализациях Ораоб( соглашения о соответствии между типами данных С и Орепб|. не обязательно одинаковы. Если вы будете использовать в своем приложении типы данных, определяемые Орепбц у еас не возникнет проблем с переносом кода между различными реализациями. Некоторые команды ОрепСБ заканчиваются буквой ч, которая показывает, что команда принимает указатель на вектор (или массив) значений, а не несколько различных аргументов. Для многих команд допускается задание аргументов Таблица 1.1. Суффиксы команд и типы аргументов 8-Ь|1|пгедег 16-Ьй(пгедег 32-Ьй |пседег 32-Ьй Роабпд-ро|п| 64-ЫС Воабпд-ро(пг В-Ь|1 Опзгдпеб |п1едег 16-Ь|1 Опйдпед |пгедег 32-Ьй Опэгдпед |птедег 6'ОЬуге 6(5Ьогт 6((пФ„6(5)эег 6 Ьйоаб 6(с1ашр1 6(боОЫе, 6(с(ашрд 6(ОЬ)де, 6(Ьоо1еап 6505ЬОГГ 6(О|ОС 6(епопь 6(ЬгрбеЫ Ореп6С как конечный автомат 29 и в виде векторов, и в виде набора аргументов, но для отдельных команд возможны только либо набор значений, либо только векторная форма.
В следующих строках показано использование векторной и невекторной версий команд для задания цвета: к1001огзг(1.0, 0.0. 0.0); 0(11саг са(ег аггау() = ( ).э, Е.О, 0.0); В1Со1ог31ч(со!вг аггау); Наконец, в ОрепСЕ определен тип 6Счо10. Наиболее часто он применяется в командах, аргументами которых являются указатели на массив значений. В данном руководстве (за исключением реальных примеров кода) команды ОрепСЕ обозначаются только базовым именем, а звездочка означает, что существует несколько версий данной команды.
Например, В1601ог* () подразумевает все версии команды, используемой для установки текущего цвета. Если будет нужно акцентировать внимание на конкретной версии команды, к имени будет добавлен необходимый суффикс. Так, В)Чеггех*ч() обозначает все векторные версии команды определения вершин. Орепб) как конечный автомат ОрепСŠ— это конечный автомат.
Вы переводите его в различные состояния (или режимы), в которых он остается до момента следующего изменения. Как вы уже видели, текущий цвет — это параметр состояния. Вы можете его устанавливать в белый, красный или какой-либо другой цвет, и после этого все объекты будут отображаться этим цветом до тех пор, пока вы ега не смените каким-то другим. Текущий цвет — один из многих параметров состояния ОрепС(..
Другие отвечают за текущее мадельно-видовое преобразование, тип линий и многоугольников, методы отображения многоугольников, режим упаковки пикселов, расположение и характеристики источников света, свойства материала объектов. Многие параметры состояния связаны с режимами, которые включаются и выключаются командами к1ЕпаЫео и я101заЫеО. Каждый параметр состояния или режим имеет значение по умолчанию, и в любой момент можно запросить у системы текущее состояние.
Обычно для этого используется одна из шести комаНд: к16есВ001еапч(), я16еСРоиЫечо, к16еСР1оатчО, к16ет1птекегч(), В16еСР01птегчО и а11зЕпаЫег)О. Команда выбирается в соответствии с типом данных параметра. Для некоторых параметров состояния используются более специфичные команды-запросы (такие как к16ег(1кп(*О, к16еГЕггогО или к16етР01укоп51! рр1е()), Кроме того, можно сохранить набор параметров состояния в стеке командой к1РазЬАсгг! Ь() или В1РаэЬС11епсЯссг1Ь(), временно их изменить и позднее восстановить значения командой к1РорАГгг!Ь() или к1РарС1! епСАГ(г!ЬО.
При временном изменении состояний использование этих команд предпочтительнее, так как они более эффективны. 30 Глава 1 ° Введение в Орепб1. В приложении Б приведен полный список параметров состояния, которые можно запросить. Для каждого параметра в приложении также перечислены соответствующие команды к16ет'(), тип возвращаемого значения и значения по умолчани|о. Конвейер рисования Орепб( Большинство реализаций ОрепС1 имеет сходную последовательность операций, серию агапов обработки, называемую конвейером рисования ОрепСЕ.
Этот порядок, как показано на рис. 1.2, не регламентирует строго действия ОрепС)., а, скорее, представляет собой руководство к тому, что делает ОрепС1.. Если вы новичок в трехмерной графике, предстоящее описание может оказаться сравнимо с питьем воды из пожарного гидранта. Вы можете проглядеть текст и рисунок сейчас и возвращаться к ним позже, по мере прочтения каждой главы втой книги.
Для обработки данных ОрепСЕ взял на вооружение подход, примененный Генри Фордом в автомобилестроении. Векторные данные (вершины, линии и многоугольник) подвергаются конвейерной обработке рядом блоков, включая блоки оценки и операции с вершинами, а растровые данные (пикселы, изображения и битовые образы) обрабатываются отдельно. Оба типа данных проходят одни и те же финальные стадии (растеризацию и операции над фрагментами) перед тем, как окончательный набор пикселов будет записан в буфер кадров. 4~~> ~Ю 4~~> ~~> Ю % ч.> Рис. 1.2. Порядок операций Конвейер рисования Орепсь 31 Теперь рассмотрим некоторые ключевые стадии конвейера рисования Орепб1 более подробно.
Списки отображения Все данные, как векторные, так и растровые, могут быть сохранены в списках отображения для текущего или последующего использования. (Альтернативой хранению данных в списках отображения является непосредственное использование данных, также известное как непосредственный режии.) При выполнении списка отображения хранящаяся в нем информация посылается на обработку так же, как если бы она посылалась на обработку приложением в непосредственном режиме.
(См. главу 7 для получения более подробной информации о списках отображения.) Вычислители Все геометрические примитивы в конечном итоге описываются вершинами. Параметрические кривые и поверхности могут быть первоначально описаны контрольными точками и многочленами — базисиыии функциями. Вычислители (ета!цагогз) предоставляют способ для получения (генерации) вершин, применяемый для представления поверхности, заданной контрольными точками. Метод полиномиального отображения вырабатывает нормали к поверхности, координаты текстур, цвета и значения пространственных координат из набора контрольных точек. (См.
главу 12 для получения более подробной информации.) Операции над вершинами Следующей стадией обработки являются операции над вершинами, преобразуюшие вершины в примитивы. Некоторая информация о вершинах (например, пространственные координаты) преобразуется с использованием матриц размерностью 4 х 4. Пространственные координаты проецируются из положения в трехмерном пространстве в положение на экране. (См, главу 3 для получения более подробной информации о матричных преобразованиях.) Если привлекаются дополнительные возможности, зта стадия расширяется. При использовании текстурирования могут генерироваться и преобразовываться координаты текстур.
Если задействуется освещенность, выполняются расчеты значений цвета исходя нз данных преобразованных вершин, нормалей к поверхности, положения источников света, свойств материалов и другой информации. Компоновка примитивов Отсечение, важнейшая часть сборки примитивов, — это удаление частей геометрических объектов, которые выходят за границы полупространства, определенного плоскостью. Точечное отсечение обычно отбрасывает вершины; отсечение линий или многоугольников может добавлять дополнительные вершины, в зависимости от того, как линия или многоугольник отсекаются.
32 Глава 1 ° Введение в Орепб~ В некоторых случаях это происходит за счет разделения по перспективе, когда удаленные объекты кажутся меньшими, чем близкие. Слелующие на очереди— точка наблюдения и операции глубины (координата г). Если включена отбраковка и в качестве примитива используется многоугольник, отсечение может быть выполнено за счет отбраковывающего теста. В зависимости от режима отображения многоугольника, он может быть нарисован точками нли линиями. (См.
раздел «Подробно о многоугольниках» главы 2.) Результатом этого этапа являются законченные графические примитивы, вершины которых преобразованы и отсечены; с вершинами связаны цвет, глубина и иногда координаты текстур, а также рекомендации к растеризации. Операции над пикселами В то время как векторные данные проходят по одному пути в конвейере рисования ОрепОЦ растровые данные следуют другим маршрутом. Пикселы из массива системной памяти сначала распаковываются из одного из множества различных форматов в некоторое число компонентов. Затем данные масштабиру1отся, трансформируются и обрабатываются как пиксельные карты.