OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 35
Текст из файла (страница 35)
' Текущий инлскс хранится как значение вещественного типа. Целые значения преобразуются к вещественным напрямую. Значения за пределами диапазона инаексов пветов не полнергаются ограничиванию. Однако перед размытием (ссли жлючепо) и записью в видеобуфер индекс преобразуется в вещественный форматес фиксированной точкой.
Все биты в целой части результирующего значения <фиксированной точкой, которые не соответствуют битам в видеобуфере, игнорируются. 3Вдание модели закрашивания Линия или залитый многоугольник могут быть нарисованы одним цветом (за;:ивха) или множеством различных цветов (градиентная заливка, также называемая а)крагииеаггием ио Гуро), Нужный метод определяется функцией к15ладемоде1 О.
В15ладеноде! (ОЕепшп тоде); Устанавливает модель закрашивания. Аргумент тодге может иметь значение 6( 5МООТН (по умолчанию) илц ОС Р(АТ. При сплошной закраске цвет одной определенной вершины независимого привнтива дублируется в направлении всех вершин примитива. При градиентной зав<вке цвет каждой вершины рассматривается разпельно. Если зто линия, цвета внтерполируются между цветами вершин отрезка. Для многоугольника цвета в<у)ренней области вычисляются путем интерполяции цветов вершин.
Програмвз из листинга 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.) Наиболее легкий путь удаления невидимых поверхностей — использование буфера глубины (иногда называемого г-буфером) (см.