М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 35
Текст из файла (страница 35)
Програмвз из листинга 4.1 рисует треугольник с градиентной заливкой, показанный на ввстном рисунке 11. Листинг 4.1. Рисование треугольника с градиентной заливкой: згпоо(().с м!В 1п<1<то1О) ( В)С<еагео<ог<В.О, О.О, О.О, Е.В); В15ьадеиоде1<6С 5МООТИ); м<6 <г1апв1е<то<д) ( лродолхгение Ф 188 Глава 4 ° Цвет Листинг 4.1 '(продолжение) 918ех1п(6( Та!АИОСЕ5); 91Со1ог31(1.0, 0.9, 0.0); 91ЧегСех21(5.0, 5.0); 91Со1ог31(0.0, 1.8, 8.8); 91Чеггех21(25,0, 5.9); 91Со1ог31(9.9, 0.9, 1.0): 91Чегтех21(5.9, 25.9); 91Епб<); ) чо!б б!зр1ау(чо1б) 91С1еаг(61 СОСОВ ВОРРЕВ 81Т); Сг1ап91е(); 91Е1озв (); ) чо!б ге!варе(<пт и, 1пС Ь) ( В\Ч!еирогС(0, О, (6(х!хе!) и, (6(5!се!) П); 91на(г!хнобе(61 РВО)ЕСТ10И); 91(оаб1бепС<Су(); <и = и) 91оОгСПо20(0.0.
39,0, 0.9, 30.9*(6111оаС) Ы (6(11оаС) и); е15е 91оОг(Пего<9.9, 30,9"(6СЕ!оаС) и/(6<11оаС) П, 0.0, 39.0); 91Магг1хиобе<61 МООЕСЧХЕИ); 1пС ва1п(зпС агхс, сьаг** эгхч) ( 91оС1п11(аагхс, агхч): 91иС!п!Св!зр1ауМобе(6СОТ 51ИОСЕ ! 6<ОТ ВОВ); 91и11пзСИ!пбои5!се(509, 500); 91оС1п!СИ<пбоиРоз<С<оп(188, 100); 91ЧССгеатенспбои(агхч<О)); <п!С(); 91иСО(зр1аугапс(б)зр1ау): 91огаезьареропс(геьнаре)! 91осМачпгоор(); гегигп 8; При градиентной заливке цвета ближайших пикселов ненамного различаются, В режиме КСВА смежные пикселы с немного различающимися цветамн выглядят одинаково, то есть смена цвета вдоль многоугольника происходит постепенно, А вот в режиме индексации цвета соседние пикселы могут ссылаться на различные значения в таблице цветов, составленной из произвольных цветов. Поскольку соседние элементы таблицы могут содержать совершенно различные цвета, то и градиентно залитый многоугольник в режиме индексации цвета может выглядеть необычайно психоделично.
Решить проблему поможет палитра с индексами, определяющими плавно измешзющиеся по линейному закону цвета. Помните, что загрузка цветов в таблицу Настов — работа для оконной системы, а не для ОрепС1.. Правда, в С?Л)Т сушестаует такая функция Н1итбетСо1ог () для загрузки в таблицу цветов одиночного индекса. Первый ее аргумент — это индекс, остальные задают красную, зеленую а сннюкз составляющие. Поэтому, чтобы загрузить целых 32 смежных индекса Настов (от 16 до 47) желтой гаммы, выполните цикл: Зат (1 = О; З < 32; Зчч) ( НШтаетСотог(те+а, З.О СзГ32.О), З.О*(зт32.О), Е.О>; ! Тогда, когда потребуется градиентная заливка примитивов, нарисованных только даетами с индексами от 16 до 47, зти многоугольники будут плавно залиты желтыи цветом.
??ри сплошной закраске цвет какой-то одной вершины задает цвет заливки примитива. Для отрезка это цвет конечной (второй) вершины. Для лпзогоугольника используется цвет определенной по некоторым правилам вершины. Номер вершины можно узнать из табл. 4.2. Отсчет всех номеров вершин и многоугольников аней начинается с 1, ОрепС?. следует этим правилам, но лучший способ избежать неизвестности в вопросе цвета заливки многоугольника — это установить одинаковый цвет для всех вершин примитива. таблица 4.2. Выбор цвета заливки длл з-го многоугольника Вершина, цвет которой мспользуется для заливки 1иа многоугольника з'+ 2 з'+ 2 Зз 2г+ 2 Немаисниый многоугольник ?реугольник полосы (с общей гранью) 1раугальник веера (с общей вершиной) Независимый треугольник Савзакный четырехугольник (через грань) Независимый четырехугольник Задание цветовой и полутоновой моделей 159 Освещение После прочтения втой главы вы сможете: ° Понимать, как Орепб~ приближает сцену к условиям реального освещения ° Рисовать освещенные объекты путем задания материала, источников света и свойств модели освещения ° Задавать свойства материала освещаемого объекта ° Манипулировать стеком матриц для управления положением источников света Освещение 1б1 йзх вы видели в главе 4, ОрепС1.
вычисляет цвет пикселов в конечной отобраавемой на экран сцене, удерживаемой в буфере кадров. Часть этих вычислений гаввсит от того, какое освешение используется и как объекты в сцене отражают влв поглощают свет. В качестве примера можно привести океан, цвет которого вркий в солнечный день и серый в облачный. Наличие солнечного света или об' взков определяет, выглядит океан ярко-бирюзовым или грязно-серо-зеленым. Фактически большинство объектов не похожи на трехмерные до тех пор, пока ввв ве освсшены. На рис. 5.1 показаны две версии одинаковой сцены (одиночной егоры): одна из них с освещением, другая — без. Рис В.Х. Освещенная н неосвещенная сферы 'ьак видно из рисунка, неосвешснная сфера выглядит как плоский диск.
Это поввывает, насколько критично взаимодействие между объектами и светом при авдавии трехмерной сцены. 3 ОревСЕ можно управлять освсшением и обьектами в сцене с помощью множе. пы эффектов. Эта глава начинается с примера удаления невидимых поверхностей. Затеи в ней объясняется, как управлять освещением в сцене, рассматривается ковель освешения ОрепС1. и детально описывается, как установить множество мраметров освегпения для получения нужного аффекта.
В конце главы приведеим математические вычисления, показывающие, как освеШение влияет на цвет. Зта глава состоит из следуюших основных разделов: ' ° Удаление невидимых поверхностей. Описывает основы удаления невидимых поверхностей из сцены. ° Реальный мир и освещение в ОрепСЕ. Раскрывает в общих чертах, как рабо- тает освепгение в реальном мире и как ОрепС) реализует эту модель. ° Пример: рисование освеШенной сферы. Знакомит с возможностями освешеввя в ОрепС). путем демонстрации небольшой программы, рисующей освещенную сферу.
в Создание источников света. Описывает элементы модели освещения и управ- ление ими. ° Выбор модели освещения. Рассказывает, как определить и расположить ис- точники света. е Задание свойств материала. Показывает, как описать свойства объектов, что- бы они взаимодействовали со светом так, как зто нужно. 162 Глава 5 и Освещение ° Математика освещения.
Представляет математические вычисления, проводимые ОрепС1. для определения воздействия освещения на сцену. ° Освещение в режиме индексации цвета. Рассматривает различия между режимами РСВА и индексации цвета в условиях освещения. Вычисления освещенности обычно происходят до текстурирования.
В версии 1.2 появился режим освещения (ОЕ 5ЕРАКАТЕ 5РЕСОЕАК ЕОЕОй), в котором вычисление отраженного цвета отделено от излучательности, рассеянного и фонового света и где оно выполняется после текстурирования. Данный режим, как правило, увеличивает яркость освещения, делая ее менее зависимой от цвета текстурного рисунка.
Удаление невидимых поверхностей Дойдя до конца этого раадела, вы начнете рисовать закрашенные трехмерные объекты. Работая с ними, очень важно уметь отделять объекты, находящиеся ближе к положению наблюдения, от тех, которые закрыты другими, более близкими объектами. Изменение точки обзора может привести к изменению взаимного перекрытия объектов. Например, если посмотреть на сцену с противоположной стороны, все объекты, ранее находившиеся перед другими, оказываются за ними. Для получения реалистичной сцены эти взаимные перекрытия должны быть выявлены. Допустим, код выглядит следующим образом: иь((е (И ( Вес ч(еи(ЬВ ро(о! ггое еоозе роз(г!оп(); В)С(еаг(ВГ СОЕОа ВЬРРЕа В)Т); Егаи ЗО оЬ)есс А(): огаи зо оь1есг в(); ) При некоторых положениях мыши объект А может закрывать объект В. При других — наоборот, объект В может заслонять объект А.
Если специально ничего не предпринять, приведенный код всегда будет рисовать вторым объект В (то есть поверх объекта А) вне зависимости от выбранного положения просмотра. В худшем сценарии, когда объекты А и В пересекаются так, что часть объекта В скрыта объектом А, а часть объекта В закрывает собой объект А, не даст правильного результата и изменение порядка рисования. Исключение из сцены частей залитых объектов, которые заслонены другими, называется удалением невидимых поверхностей. (Удаление невидимых линий, та есть то же самое применительно к каркасным объектам, немного сложнее и не обсуждается в этой главе. См, раздел «Удаление невидимых линий» главы 14.) Наиболее легкий путь удаления невидимых поверхностей — использование буфера глубины (иногда называемого г-буфером) (см.
главу 10). Глубина — расстояние от плоскости просмотра (обычно ближней плоскости отсечения) до каждого пиксела окна. Изначально значения глубины для всех пикселов устанавливаются равными максимальному расстоянию (обычно дальняя Реальный мнр н освещение в Орепб( 163 ыоскость отсечения) с помощью команды В1С1еаг() со значением аргумента 61 ВОЕРЕР В1Т. Затем объекты в сцене рисуются в произвольном порядке. Аппаратные или программные графические вычисления преобразуют каждую рисуемую поверхность в набор пикселов окна, где эта поверхность визуализуется,если не перекрывается чем-то еще. Кроме того, вычисляется расстояние от плоскости просмотра. При включении буферизации глубины перед рисованием аждого пиксела выполняется сопоставление глубины со значением, уже хранящимся в буфере. Если новый пиксел оказывается ближе (впереди), в буфер записываются новые значения цвета пиксела и глубины.
Если же глубина больше техушей, новый пиксел отбрасывается без изменения старой информации. Для использования буфера глубины его необходимо включить. Это делается только один раз. Впоследствии при любой перерисовке сцены необходимо очищать буфер глубины, а затем можно рисовать объекты сцены в любом порядке. Чюбы внести в приведенный выше код возможность работы с удалением скрыпп поверхностей, измените его следусощим образолп С>амп(СЭ(арсауиобе(6(ит ЭЕРтв (.... >; с1(паЬ1е(6С ЭЕРТН тЕВт); лапе (1> ( Вее «тентпя роспС Ггоа еоояе роя!Стоп(); В>С1еаг(6С СОЕОВ ВОРРЕВ В(Т); бган Зб оЬ>ест А(): бган Зб оЬ>есС В(): ) Пря задании указанного значения аргумента функции В161еаг() очищаются сразу оба буфера; глубины и цвета.
вест на глубину может отрицательно повлиять на производительность приложеляя. Но так как информация отбрасывается, а не используется для рисования, )ласенне невидимых поверхностей способно несколько компенсировать это паленке производительности. Вместе с тем степень воздействия буфера глубины на Ввстродействие существенно зависит от реализации. «Программный» буфер глуВяны (размещенный в памяти процессора) явно будет медленнее, чем специально аеалвзованный на аппаратном уровне. реальный мир и освещение в ОрепЯ При взгляде на физические поверхности глаз воспринимает цвет в зависимости ш распределения энергии фотонов, попадающих на сетчатку глаза и раздражающвх ее. (См. раздел «Цветовосприятие» главы 4.) Эти фотоны поступают от источника света или нескольких источников, некоторые из них поглощаются, а нехшорые отражаются от поверхности.