OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 5
Текст из файла (страница 5)
Ниже объясняется, как получен этот рисунок. ° Цветной рисунок 1 показывает сцену в виде каркасной модели — как будто сплетенной из проволоки. Каждая линия соответствует границе примитива (многоугольника). Например, поверхность стола состоит из треугольников. Впечатление такое, как если бы мы разрезали пирог на ломтики. Заметим, что в таких условиях можно видеть даже те части объектов, которые были бы скрыты в случае полноценной — залитой — поверхности.
Например, можно вилеть холмы за окном, большая часть которых в этой модели скрыта стеной комнаты. Глобус выглядит почти сплошным, так как он состоит из сотни цветных блоков, и взгляду доступны линии каркаса для всех граней всех блоков, даже тех, что образуют обратную сторону глобуса. Пример глобуса показывает, как можно создавать сложные объекты путем сборки из простых (низкоуровневых) объектов.
° Цветной рисунок 2 показывает обаемное представление этой же каркасной сцены. Заметим, что линии, расположенные дальше от наблюдателя, бледнее, как и в реальной жизни, за счет чего появляется визуальное восприятие глубины. Для получения эффекта глубины ОрепСЕ использует также атмосферные эффекты (нгуман). ° Цветной рисунок 3 демонстрирует версию каркасной сцены с устраненной ступенчатостью.
Эффект ступенчатости (а!газгпй) возникает в результате растеризации векторных примитивов па пикселах, составляющих прямоугольную сетку, Такая ступенчатость наиболее заметна на линиях, близких к горизонтали или вертикали, ° Цветной рисунок 4 демонстрирует лишенную полутонов, неосвещенную версию сцены (без соответствуютцих эффектов освещения).
Объекты в сцене показаны сплошными — для закраски каждого многоугольника используется только один цвет. Потому они выглядят «плоскимиеи а не округлыми. ° На цветном рисунке 5 нарисована уже освеи/енная, с полутотичи версия сцены. Видно, что сцена более реалистична и трехмерна за счет того, что полутона находятся в гармонии с источниками света в комнате, в сравнении с просто объемными объектами. ° На цветном рисунке б к сцене добавлены тени и текстуры. Тени — это нечетко определенная возможность ОрепС1. (нет специальной команды «тень»), но вы можете их создавать по технологии, описанной в главах 9 и 14.
Текстлурироеание позволяет накладывать двухмерные изображения на трехмерные объекты. В рассматриваемой сцене наиболее ярким примером текстурирования являет- ' цаетные рисунки к книге см. на садте ианательстаа Ьигк//иввцитессоот/Еоинаид. — Примеч. ред. что такое ОрепЯ. 25 ся верхняя часть поверхности стола. Пол и поверхность стола имитированы текстурами (под дерево), аналогично обоям и верхней части игрушки (на столе). ° Цветной рисунок 7 показывает размывку двилсепием (лобов-Ыцггсд) объектов в сцене. Сфинкс (или собака, согласно мотивациям Роршаха) кажется застывшим в движении вперед, оставляет смазанный след на пути своего движения. ° Цветной рисунок 8 показывает сцену с обложки книги с другой точки, доказы- вая, что картинка действительно является снимком с трехмерных объектов.
° Цветной рисунок 9 нозвращает нас к туману, который применен на цветном рисунке 2 для получения эффекта задымленности воздуха. Заметьте, что, в отличие от цветного рисунка 2, здесь эффект более впечатляет. ° Цветной рисунок 1О демонстрирует эффект алубины резкости, неспособность объектива фотокамеры сделать четкими все объекты. Камера фокусируется только на небольшой части сцены. Объекты, находящиеся дальше или ближе, чем эта область, выглядят слегка размытыми. Ниже кратко перечислены основные графические операции, выполняемые ОрепС1. при построении изображения на экране.
(См. раздел «Конвейер рисования ОрепС1.».) 1. Построение моделей из графических примитивов и создание таким образом математического описания объектов. (Примитивами в ОрепС1. являются точки, линии, многоугольники, изображения и битовые образы.) 2. Расстановка объектов в трехмерном пространстве и выбор выгодной точки обзора всей сцены. 3. Вычисление цвета всех объектов. Цвета могут быть заданы приложением, определяться условиями освещения, получаться наложением текстур па объекты или быть комбинацией этих трех действий.
4. Преобразование математического описания объектов и информации об их цвете в пикселы на экране. Данный процесс называется растеризацией Во время этих шагов ОрепС1. может выполнять другие операции, например удаление невидимых частей объектов. Кроме того, после растеризации сцены, но перед ее прорисовкой, при необходимости можно выполнить операции с массивом пикселов. В некоторых реализациях (совместимых с Х Ъ'1пдотчз) ОрепС1. работает и в случаях, когда компьютер, на экране которого выводится изображение, не является тем компьютером, па котором выполняется строящая это изображение программа.
Такая возможность рассчитана на сетевое соединение компьютеров. В этом случае компьютер, где запускается программа и выполняются команды ОрепС1., называется клиентом, а компьютер, который получает эти команды и выполняет рисование, называется сервером. Формат для передачи команд ОрепС1. (протокол) от клиента к серверу всегда один и тот же. Поэтому программы ОрепС1. могут работать в сетях, даже если клиент и сервер представляют собой компьютеры 2б Глава 1 ч Введение в ОрепЯ.
разных типов. Если программа ОрепСЕ работает только на одном компьютере, он является одновременно клиентом и сервером. Немного программного кода Так как ОрепС1. позволяет множество различных вещей, программы ОрепС1. могут быть достаточно сложными и запутанными. Тем не менее общая структура программ проста: инициализация состояний, управляющих рисованием, и указание объектов для рисования.
Перед тем как рассмотреть некоторые примеры, определим несколько терминов. Отображение, иначе рендериг!г (воспроизведение изображения на экране, генг(сг(пй — этот термин вы уже встречали), — это процесс, с помощью которого компьютер создает изображения на основе моделей. Эти модели, или объекты, вырабатываются из графических примитивов — точек, линий и многоугольников, определяемых вершинами (чегсзсез). Окончательно прорисованное изображение состоит из пиксслов на экране.
Пиксел — это минимальный элемент изображения. Информация о пикселах (например, их цвет) хранится в битовых плоскостях. Битовая плоскость — это область памяти, в которой каждому пикселу соответствует один бит информации. Бит, например, может определять красную составляющую цвета. В свою очередь, битовые плоскости образуют видсобуфер (буфер кадров), который хранит всю информацию, необходимую графическому дисплею для управления цветом и яркостью всех пикселов экрана.
Теперь посмотрите, как выглялит программа ОрепСЕ. Программа из листинга 1.1 рисует белый прямоугольник на черном фоне, как показано на рис. 1.1. Листинг 1.1. Пример кода Орепб(. В !пс1оое хива(ечегтооиеее.ь> аэ(п() ( 1п! 1!а1!геАИ!пооиР1еахе О; 9161еагсо1ог(9.9, 0.97 0.0, 0.0); 9161еаг(6( СОСОК ВОЕРЕК В!Т); 91Со1огз((1.9, 1.0, 1.0); 910гтао(9.9, 1.0, 0.9, 1.0, — 1.0, 1.0); 919ез!п(6( РОСУООМ); К)чегсехЗГ(9.25, Е.25, О.О)) 91Чегсехзт(9.75, 0.25, 0.9); 91Чег1ехЗТ(9.75, 0.75, 9.9); 91Чег(ехзт(9.25, 0.75, 0.0); 91 5 по О .' 91Р(оэь и; Ороа(етьен!пеонАпесьескгогЕчеп(э(); Первая строка процедуры ва ! и () создает окно и выводит его на экран: функция 1п!1(а1(ЕЕАЧ)!пооиР1еаэЕО обращается к функциям оконной системы, а не Синтаксис команд ОрепбС 2У к вызовам ОрепС — это очевидное расположение функции инициализапии. Следующие две строки — команды ОрепСВ для очистки окна (закрашивания его черным цветом): я1С1еагСо1ог О устанавливает цвет очистки окна, а к1С1еаг О выполняет закраску.
После установки цвета очистки все последующие вызовы к1С1еаг () очищают окно этим цветом. Пвет очистки может быть изменен другим вызовом функции Б1С1еагСо1ого. Функция же Б1Со1огЗГО устанавливает цвет, используемый для рисования обьектов, в данном случае — белый. Все объекты, рисуемые после этой строки, будут белыми, пока цвет не будет изменен другой командой. Рнс. 1.1. Белый прямоугольник на черном фоне Команда к)Ог тип О, задающая систему координат ОрепС1., определяет вид конечного изображения и способ его отображения на экране. Вызовы, заключенные в операторные скобки я1Бек! и () и к1Епб (), определяют объекты рисования— в данном примере это многоугольник с четырьмя вершинами.
«Углы» многоугольника заланы функциями к1Че г тех 3 Г () . Как видно из значений аргументов, определяющих координаты (х, у, г), многоугольником является прямоугольник, расположенный на плоскости г - О. Наконец, команда к1Р1изП О гарантирует, что команды рисования будут сразу выполнены, а не сохранены в буфере в ожидании дополнительных команд ОрепС1 Процедура ОрбатеТПеИ!пбонАпбСПеснгогЕчептз() («местозаполнитель», как и 1п! т! а1! теАИ! пбонР1еазе()) управляет содержимым окна и начинает обработку событий. Фактически эта часть кода ОрепСВ не структурирована хорошо. Вы можете спросить: «А что случится, если я попробую переместить окно или изменить его размеры?» или «Нужно ли устанавливать систему координат каждый раз, когда я рисую прямоугольник?» Позже в этой главе мы покажем, как выполнить замену функций 1п! т! а1! геАИ! пбонР1еазе О и ОрбатетиеИ! пбонАпбСПесК Рог Ечептз О на более эффективный код.
Синтаксис команд ОрепИ. Как видно из только что представленной программы, для команд ОрепС(. используется префикс я1, а первые буквы каждого слова имени команды являются заглавными (например, к1С1еа гСо1о г () ). Константы в ОрепС1. начинаются с Я., 28 Глава 1 ° Введение в ОрепбС записываются прописными буквами, а отдельные слова в них выделяются подчеркиванием (например, 6( СОСОР ВОЕЕЕР В1Т). Наверное, вы обратили внимание, что к некоторым именам команд добавляются суффиксы (например, 31, как в 81Со1ог31О и 81Негтех31О).