OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 53
Текст из файла (страница 53)
В этом случае список отображения разрушается, когда уничтожается последний контекст в общей группе. Что сохраняется в списке отображения? Когда вы формируете список отображения, в нем сохраняются только значения вырзжений. Если значения в массиве впоследствии изменяются, значения в спи- 248 Глава 7 ° Списки отображения оке изменяются также. В следующем фрагменте кода список отображения содер- жит команду, устанавливающую в качестве текущего цвета РСВА черный — (0.0, 0.0, 0.0).
Последующее изменение значения массива со[от ресгог на красный цвет (1.0, 0.0, 0.0) не оказывает эффекта на список отображений, поскольку последний содержит значения, которые были актуальны на момент его создания: 6[11оат со1ог чесгаг[3) = [б.о, 6.0, В,О); д[ненс$кг[1. ВС СОНР[СЕ>; 91Со1огзтч[со[ог чесгог); 91ЕпОС$ат(); со1ог чесгог[81 = 1.6; Не все комшцгьг ОрепСЕ могут быть помещены в список отображения и выполнены таким образом. Например, ими не могут быть команды, которые устанавливают состояние клиента, и команды, возвращающие значения параметров состояния.
(Их в основном легко опознать — так как они возвращают значения параметров, передаваемых по ссылке, или возвращают значения напрямую.) Такие команды при включении их в список отображения выполняются немедленно. В табл. 7.1 перечислены команды ОрепС[., которые можно включить в список отображения. (Заметьте, что 91кеиС $ зт() генерирует ошибку, если она вызывается изнутри еше не завершенного списка.) Некоторые из этих команд нами еше не рассматривались, но вы можете найти их описание в тексте книги с помощью предметного указателя. Таблица 7.1. Функции Орепбс, допустимые к помещению в списке отображения Для четкого понимания причины этих ограничений вспомните, что в сетевом окружении клиент ОрепСЕ может находиться на одном компьютере, а сервер — на другом. Созданный список отображения постоянно хранится на сервере, таким образом, сервер не может рассчитывать на клиента в плане получения информации, связанной со списком отображения.
Если запрашивающие команды, такие как 916ет' () или 911з ' О, разрешить к использованию в списках отображения, вызывающая программа будет зависеть от непредсказуемости времени возврата данных через сеть. Пока у нее не будет списка отображения в оригинальном виде, 9[АгеТехтцгекдек(сепг() 9[С[$епгдс1$чеТех1цгеВ 91Со[огРЫпгег() 9[Ое[егеС[вта() д !Ое[егеТехтцгек() 901$ааЫеСбеп!51аге() д[Ег)деЕ[адро[п[ег() д[ЕпаЫеСбеп151аге() д!Реег[Ьаскдц([егВ 9[Е[п[5Ь() 9[Р[ц5Ь() 9[ЕодСоогг)ро[п!ег() д[депВвм() 9[дептехгцгевВ 9!Вес*!) 9[[пг[ехРо[птег() 9$[псег[еачег[АггаукВ 9[[кЕпаЫег[() д[Ы.)кг() дНктехгцгеВ 9$$[оппа[Ро(псег() д[Р[хе[51оге() д!РорСбепгАПпЬ() 9[РцкЬС[[ептА11пЬ() 9[Реаг[Р)хе[к() 9[Репг[егмог[еВ 9$5есопбагуСо[огРо(пгег() 9$5е[естВо((ег() 9[техСоогг[Ро[пгег() д!ЧекехРо[птег() Создание и выполнение списка отображения 249 з каком он послан, вызывающая программа не будет знать, где ей разместить дандме.
Таким образом, любые команды, возвращающие значения, не могут быть помещены в список отображения. Команды, изменяющие состояние клиента, такие к>к д1Р! хе15(о ге (), к15е1есгвит(ег (), и команды, описывающие массивы вершнн, также не могут быть сохранены в списке. Например, подпрограммы спецификации вершин массива (такие как к1че ггехРд1пгег О, д1Со1огРо! пге г О и д11пге г1еачеПАг гауз О ), устанавливают укамтелн состояния клиента и тоже не могут быть сохранены в списке отображения.
Команды д1АггауЕ1евеп(О, д10гаиАггауз() н д10гаиЕ1емептэо посылают данные для построения примитивов из элементов, принадлежащих доступным массивам, соответственно, эти операции могут быть сохранены в списке отобракения. (См. Раздел «Массивы вершин» главы 2.) Данные массива вершин, сохраювные в списке отображения, извлекаются через разыменование указателей, но де непосредственно. Таким образом, дальнейшие изменения значений в вершидкт не будут влиять на определение примитивов в списке отображения. К влияющим командам относятся и любые команды, использующие режимы юхранения пикселов (р!херзсогайе шог(ез).
(См. раздел «Режимы хранения пик(гдов» главы 8.) Другие подпрограммы, полагающиеся на состояние клиента, там>е как д1Е1оэп О и д1Г! и! зв О, не могут быть сохранены в списке отображеви, поскольку они зависят от состояния клиента в момент обработки списка. Зыполнение списка отображения Весле того как вы создали список отображения, вы можете запустить его на выпслнение вызовом д1С а111 ! это. Разумеется, один и тот же список отображения южно выполнять многократно, а также можно смешивать его обработку с командщв непосредственного режима, как мы это уже видели. чо(П Е1Са11С!э1(ОЕп!пс)мГ); Выполняет список отображения, указанный аргументом 1(зг.
Команды списка отображения выполняя>тся в порядке своего сохранения, как если бы списка отбражения и не было. Если аргумент Ы не определен, ничего не происходит. Вмможете вызывать д1Са111! зт() из любой точки программы, пока активен сомветствующий ему контекст Ореном (тот же, что был активен на момент создажи списка, или контекст из общей группы). Список отображения может быть авдан в одной подпрограмме, а выполнен — в другой, благодаря его уникальной здеятнфикации по индексу. Л вот для сохранения списка отображения в файле ыв, наоборот, для загрузки его из файла средств не имеется. Это лишнее подперждение временного характера списков отображения.
иерархические списки отбражения Зм можете создать иерархический список отображения, в котором изнутри однощспнска отображения — между д1меиЕ ! эт() и д1ЕпбЕ! э1() — выполняется выдв других списков той же командой д1Сз11С ! зт () . Иерархически упорядочен- 250 Глава 7 ° Списки отображения ные списки полезны для объектов, составленных из готовых компонентов, особенно если последние используются больше одного раза. Например, следующий список отображения выводит велосипед, причем отдельные детали конструкции велосипеда (руль, рама и колеса) отображаются собственными списками: а!Мень!яс(!!зС)паек,6( СОМР!СЕ); к1са»С!зС(лапа1епагз); а1Са11(!зс(ггаае); к1тгапз1аге((1.0, В.О, 0.8); 61Са»С!яС(илее1); к1тгапя!агес(3.0, 0.0, 0.0); 6)са» Ссяс(ипее!); Е(Елани.!яС(); Это не позволит вам реализовать полноценную глубокую рекурсию, так как вложенность списков отображения ограничена значением 64, но это число может быть и больше, в зависимости от реализации. Для получения информации о максимальной вложенности списков для конкретной реализации Ореп01 воспользуйтесь вызовом ((16ес1псекегч(6( мАх (15т ме5т1м6, 61!пс *аз!а); Орепб).
позволяет создавать списки отображения, которые вызывают еще не существующие списки. При этом ничего не происходит. Наконец, иерархическая структура — просто удобное средство компоновки нескольких списков более низкого уровня в смысле послелующего редактирования, как в дистинге 7.3. Здесь внешний список отображения объединяет описания отдельных вершин многоугольника. Листинг 7.3. Иерархический список отображения 61нень!яС(1,61 СОМР1(Е); 61Чег(ехзгч(ч1): Е1ЕпаС!яС(); Е1Меис!ЯС(2,6( СОМРХ(Е); 61Чеггех3(ч(ч2); 6!Ела(!яС(); М!Меис!зс(3,6С СОИР!СЕ); Е1Чеггех3(ч(чз); а!Епа(!яС(>; а1иеиь!4С(4,61 СОМР1(Е): а!Вез!п(6( РОСЧООМ); асса»(ся(( 1>; 61са111!яС(2): 61са11(! яС(3); 6!Ела(); 6!Ела!!я!(); Чтобы воспроизвести многоугольник, вызывается список с номером 4.
Чтобы от. редактировать отдельную вершину, нужно всего лишь пересоздать соответствующий этой вершине вложенный список. Удобно то, что, когда вы создадите новый список под старым индексом, сусцествующий список автоматически будет ула. Выполнение составных списков отображения 251 нен. Это не значит, что распределение памяти будет оптимальным для достиженнн максимальной производительности, но в иных случаях зто лучше чем ничего. С1Ьоо)еап я11нг1нг(СЕн1пС 1мг); Возвращает 6Е ТМОЕ, если аргумент Ы представляет уже используемый ин- декс, и 61 ЕА15Е в противном случае. Вм можете явно удалить указанный список отображения или набор списков с по- следовательными индексами при помощи вызова х10е1егее1нгнО.
Соответст- нующис индексы становятся снова доступными. то1П 610е1еге11нгн(СЕшп1 Ы, С(л(ге) галде) Удаляет заданное количество (галде) списков отображения, начиная от задан- ного индексом Внг. При попытке удаления несуществующего списка ничего не происходит. выполнение составных списков отображения ОрепСЬ предоставляет эффективный механизм последовательного выполнения нккольких списков отображения.
Этот механизм требует, чтобы вы поместили нндексы списков в массив и воспользовались вызовом я16а11е1нгн (), Очевидню, что применение данного механизма имеет смысл в случае, когда индексы сонтнетствуют каким-либо выразительным значениям. Так, если вы создаете шрифт, пждый индекс будет ассоциирован с АБСП-кодом символа шрифта.
Чтобы иметь несколько таких шрифтов, вам нужно задать для них различные начальные индексы, а сделать это легко с помощью вызова х111 нгВане() перед выполнением 11СнП11нгн(). ной н111 нгване(СЕп1п( бане); Задает смещение, добавляемое к индексам списка отображения. По умолча- нию принято значение О. Это смещение пе имеет эффекта пи на команду н1Са1111 н ГО, примененную к одиночному списку отображения, ни на коман- ду н1йем11нг(). нок( н16а1111нгн(С1н1ге1 и, СЕеппш Гуре, сопл( СЕчоЫ *ЪЬ); Выполняет л списков отбраження.
целевые индексы вычисляются путем сло- вения базового смещения (заданного х11! згване()) с целыми числами мас- сива, указанного аргументом Ъй. эт- юый да- 1ргумент гуре обозначает тип данных элемента массива; 6е Втте, 6е ОМ516йе0 1(ТЕ, 61 5НОНТ, 61 ОМ516МЕО 5НОКТ, 61 1МТ, 61 ОМ516МЕО 1МТ или 6Е РЕОАТ. Управление индексацией списков отображений Пока что мы советовали не пренебрегать командой к16еп1! нгн(), чтобы всегда быть уверенными в уникальности индексов списков отображения. Если это по аким-либо причинам вас не устраивает, воспользуйтесь командой я\1нЕ!нг(), позволяющей узнать, свободен ли указанный индекс.