OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 19
Текст из файла (страница 19)
Если значение епс( — зсаг(+! больше рекомендованного максимума предобрабатываемых индексов, функция а10ганРапяее1еяепсз () нарисует корректное изображение, но производительность может снизиться. Не каждый индекс в диапазоне [згагг, епс!'] обязан задействоваться. Однако в некоторых реализациях, если вы определяете редко используемый диапазон, это влечет лишнюю обработку множества неиспользуемых вершин. Возможно, что ваша реализация ОрепС]., обращаясь к я1АггауЕ1еяепсз(), я10ганЕ1ееепСВ О, я1Мо1С(0ганЕ1еяепСВ О н я10ганйапяеЕ1е!оепСВО, кэширует недавно востребованные (то есть измененные) вершины, позволяя приложению оперировать теми же данными без повторных преобразований. Возьмем, например, вышеупомянутый куб, у которого шесть граней (многоугольников) и только восемь вершин. Без я1*е1еяепсз() рисование всех шести граней требует обработки 24 вершин, из них !б операций являются избыточными.
При кэшировании ОрепС]. минимизирует избыточность и фактически обработает всего восемь вершин. (Повторное использование может быть ограничено внутри одиночного вызова я10гане1еяепсз () или я10ганйапяее]ееепсз О, одного индекс- Массивы вершин 83 ного массива для функций В1Ии1110гаиЕ(евепгзО нли для В1АггауЕ1евепгз() внутри пары В1Век!п()ГВ1Епо().) Разыменование последовательности элементов массива В то время как В1АггауЕ1евептз(), В10гаиЕ1евепсз О и В10гаидапВеЕ1евептэ О «прыгают» по вашим массивам данных, функггия В10гаиАг гауз() «перепахивает» их.
чоЫ В10гаиАггауз(С[.епнш тос[е, С]!ггт ггтхГ, С1.яхе[ свинг); Строит последовательность графических примитивов, обращаясь к элементам кахсдого активированного массива начиная сггтхг и заканчивая /ггзг + соипг — 1. Аргумент тос[е определяет тип примитивов и получает такие же значения, как в В1ВеВ!и(), например; ьс РОсЧВОМ, И (1МЕ сООР, 6( (1МЕ5, ВЕ РО]МТ5 и т, д.
Результат выполнения В10гаияггауз () аналогичен следующей последовательности команд: агвеагп (вове); гог (! = 0; ! < соопг; г+») В]АггауЕ1евепс(!!ге! + !); а1Епд(); так же, как и функция В10гаие1евепсзО, функция В10гаидггауэ() выполняет контроль значений своих аргументов и оставляет текущие значения КСВ-цвета, вторичного цвета, индексного цвета, координат нормалей, координат тумана, координат текстуры и флага краев неопределенными, если соответствующий массив активирован. В качестве упражнения можете попробовать изменить способ рисования икосаэдра в листинге 2.16 таким образом, чтобы использовались массивы вершин.
Функция к1 мо11 ! ОгаиАг гауз О, как и функция В1Иот! ОгаиЕ1евепта (), появилась в ОрепС[. версии 1.4 и предназначена для объединения нескольких вызовов функции В10гаиАггауз () в один вызов. чоы В1мо11!ОгаиАггауэ(с].епцш то<ге, с]гпг "/гтхг, с1.яге[ "соил(, с[яхе! рптсоипг); Вызывает последовательность выполнеггия из рптсоипг (количество) функций В10гаиАг гау(). Аргумент то<ге определяет тип примитива, и его значения аналогичны значению аргумента функции В1ВеВ! и(). Аргументы /гтх и соил( определяют, где выполняется обработка каждого списка элементов массива. Для г-го элемента массива графический примитив строится начиная с уггхгЯ н заканчивая уггегЯ в соипгЯ вЂ” 1.
Результат выполнения функции В1Ии11! ОгаиАг гауз() аналогичен выполнению Еог (! = Э; г < Рггвсоопг; г++) ( (соопс[г] > 0) В10гаиАггата(вове, Ггг»С[г], соопг[г]): ) 84 Глава 2 ° Управление состоянием н рисование геометрических объектов Смешанные массивы Ранее в этой главе (см. раздел «Фактурные многоугольники») уже говорилос о массивах с чередованием данных — смешанных. Пусть таким будет массив ! псе ггн! пео, хранящий смешанные данные о йСВ-цвете и трехмерных коорди- натах вершин.
Эти данные можно инициировать вызовами 91СО!ОгРО!пгег() и 91НегтехРО!птег(): згаг!с Оь(1оа! !пгеггн!пее() (1.0, 0.2, 1.8, 100.0, 100.6, 0.0, 1.0, 8.2, 0.2, 0.8, 200.0, О.О, 1.8, 1.8, 8.2, 160.0. 360.0, 0.0, 0.2, 1.6. 0.2. 200.0, 300.0, 0.0, 0.2, 1.0, 1,0, 366.0. 260.0, 0.0. 0.2, 0.2, 1.8, 208.0, 100.0, 0.0): Массивы такого вида можно определить, указывая смещение данных конкретно- го типа, с помощью шага по индексу. Конечно, это нужно делать осторожно.
Но также существует команда-«монстр» 911пгег1еачеодггауз(), которая позво- ляет за один «присест» сформировать несколько массивов, Функция 911птег- 1еачеаАггауз() также включает и выключает соответствующие массивы (они перечислены в разделах «Шаг 1: активация массивов» и «Шаг 2: помещение— данных в массивы»), Смешанный массив заполняется согласно одной из 14 предопределенных конфигураций, поддерживаелгых функцией 911пгег1еачеб- Аггауэ(). Так, чтобы получить активный массив !птеггн!пеп с чередованием йСВ-цвета и координат вершин, можно дать следующую команду: 911птег1еачеЕАггауз(6( СЗГ ЧЗГ, О, 1пгегтн!пеа); Она активирует массивы 6( СОСОК АРКАН и 6( ЧЕРТЕХ АРРАУ, а также отключа- ет массивы 6( 5ЕСОНОАРЧ СО(ОР АРРАЧ, 6( 1ЙОЕХ СОСОК АРРАЧ, 6( НОРНА( АРРАЧ, 6( ГО6 СООРОТНАТЕ АРРАЧ, 6( ТЕХТОРЕ СООРО АРРАЧ и 6( Е06Е Г(А6 АРРАЧ.
Этот вызов лает результат, идентичный результату работы 91601огРо! псе г() и 91НегтехР01пгег(), примененных для определения значений шести вершин в каждом массиве. Для рисования примитивов, что соответствует шагу 3, все так же вызываем 91Аггауе1евепг (), 910гаие1евептв (), 910гандап9ее1евептз () или 910гандггауз(). чоЫ 911птег1еачеОАггауз(С1еппш/огглат, СЕз(хе! 3(г(а(е, чоЫ "рот(ег) Инициализирует все восемь массивов, отключая массивы, не определенные аргументом конфигурации/от!лат, и включая те, что указаны.
Аргумент/оггпат получает значение одной из 14 символьных констант, перечисленных в табл. 2.5. Значение аргумента егнг(е определяет смещение в байтах между смежными вершинами. Если оно равно нулю, подразумевается, что вершины плотно упакованы. Указатель ро!п(ег ссылается на адрес первой координаты первой вершины в массиве. Обратите внимание, что функция 911птег(еачеолггауз() нс поддерживает флаг краев.
Массивы вершин 85 Механизм работы к11псег1еачеблг гауз () сложен и требует иллюстраций в виде табл. 2.5 и листинга 2.15. В этих листинге и таблице есть переменные вп е, и е„ типа ЬОО1еап, включающие или отключающие координаты текстуры, цвет и век- ТОРЫ НОРМаЛИ; ПЕРЕМЕННЫЕ зп 5, И 5„, ОПРЕДЕЛЯЮЩИЕ РаЗМЕР (ЧИСЛО КОМПОНЕНТОВ) массивов координат текстуры, цвета и вершин. Переменная т, — это тип данных для КИВА-цвета, который представляет собой массив, содержащий смешанные значения целого типа. Переменные р„р„и р„— вычисленные значения смещения для доступа к индивидуальным значениям цвета, нормалей и значения вершин, а 5 — шаг по индексу, то есть смещение (если оно нс определено пользователем) для перемещения между элементами массива.
Эффект выполнения функции к11псег1еачебАггауэ() подобен результату работы последовательности команд, приведенных в листинге 2.15 со значениями из табл. 2.5. Все операции с указателями выполняются в единицах 5!терт(6Сивуте). Листинг 2.15. Результат выполнения команды д>1п(ег>еачес(Аггауэ((оггпаС, 5(псе, ро>п(ег) 1ПС 5СГ; /* устанавливаем е<, е<, еп, 5<, 5„ 5,, С,, р,, р„ р„ и 5, как показано в табл. 2.5, и значение формата «/ зтг = зтг(бе; 1г (5сг == 0) 5СГ = 51 а10!5аЫес11епС5Сате(6( ЕООЕ ЕСА6 АМАНАТ); 510!5аыес1(еп(5Сате (6С 1МОЕХ АММАЧ); 51015аЫеСШ епС5Саее(6С 5ЕСОМОАМЧ СО(Он АММАЧ>; а10!5аЫес1!епС5Сате(6С 506 СООМО!МАТЕ АЙМАУ); >г (е<) ( а1ЕпаЫес11епС5СаСе(6С ТЕХТОЙЕ СООЙО АММАЧ); а1техсоогбро!птег(5<, 6С РСОАТ, зтг, ро!пеег); е15е 51щзаЫеС1(епС5СаСе(6С ТЕХТОМЕ СООМО АММАЧ>; (г (е,) ( а1Епаыес11епт5Сате(6( СОСОМ АСКАТ>; а1Со1огРозптег(5,, С,, атг, ро>птег+р,); ) е15е а(015аЬ>еС11ептбтате(6( СОСОК АММАЧ>! (! (е,) ( а1Епаыес1(епт5Саге(6( МОММАС АКМАЧ); 51ногиа1Ро(птег(6С РСОАТ, зтг, ро>птегар.); > е15е 51015аЫеС11епС5СаСе(6С МОМИАС АММАУ); а>ЕпаЫеС>тептзтате(6С ЧватЕХ АММАЧ); к1ЧегтехРо!птег(5., ОС ЕСОАТ, зтг, ро!птег+р,); 86 Глава 2 ° Управление состоянием и рисование геометрических объектов В табл.
2.5 буквы Т и г обозначают ТВОЕ и ЕА(56, показатели à — э!геоГ (6! 61оа1) и с — четырехкратное значение 51хеог(6$ ноуте), округленное до ближайшего числа, кратного Е. Наиболее простые форматы: 6( ЧЗГ, 6( ЧЗГ и 6( СЗГ ЧЗЕ. Для любых форматов с С40В применимы структурные типы данных или обычное приведение типов, а по указателю лежат четыре беззнаковых байта, то есть одно 32-битное слово.
В некоторых реализациях ОрепС1. использование смешанных массивов может ускорить работу приложения, котла известно точное расположение данных, то есть зто случай, когда данные плотно упакованы и могут быть получены за одно обращение. Без смешанных массивов сначала определяется, как плотно упакованы данные, исходя из информации о смещении и размере. таблица 2.5. значения параметров функции 9$1пгепеауш)Апауэ() Гогва1 ет ес еп М эс эу 1с рс рп ру 5 6( 0й516йЕО ВУТЕ 6( 0й516йЕР ВУТЕ 61 ГСОАТ 0 0 0 0 0 41 61 Г(ОАТ 61 0й516йЕО ВУТЕ 6! ЕРЗАТ 21 21 21 21 61 41 8( 6( ЕСОАТ 6( ГСОАТ ПРИМЕЧАНИЕ Функция дйптег$еауедАггауэ() только активирует или деактивирует массивы вершин и заполняет массив вершин значениями.