OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 86
Текст из файла (страница 86)
Типы СЕс1атр1и С?.с1агврг( (ограниченные 01йоаг и 01.с1оиЫе) имеют диапазон значений от О до 1. Значение по умолчанию для глубины — 1.0; все другие значения по умолчанию равны О. Однажды установленные значения имеют силу до тех пор, пока они не будут изменены следующим вызовом той же команды. Непосредственно очистка буфера производится вызовом В1С1еаг(): чо1г( В1С1еаг(0?.Ьййе1о тай); Очищает указанные буферы. Маска (тазе) — это поразрядное логическое ИЛИ из констант 6С СОЕОН ВОРРЕВ В1Т, 6Е РЕРТН ВОРРЕк В1Т, 6Е 5ТЕНС1Е ВОРРЕк В1Т и 6Е АССОН ВОРРЕЯ В1Т, идентифицирующих собой конкретный тип буфера.
Очистка с параметром 6Е СОЕОР ВОРРЕк В1Т выполняется согласно текущему режиму цвета — КСВА или индексному. При этом очищаются все буферы, доступные для записи (см. следующий раздел). Если включены тесты принадлежности (оюпегзЫр), отсечения и размытия, они применяются к операциям очистки. Также здесь могут быть применены маскирующие операции, такие как В1Со1огнаэх() и В11оаехНаэх(). Альфа-тест, тесты трафарета и глубины никак не воздействуют на В1С1еаг () . 8ыбор буферов цвета для записи и чтения результаты операций записи (рисования) или чтения могут затрагивать любые буферы цвета: рабочий, фоновый, левый рабочий, левый фоновый, правый рабозпй, правый фоновый и любой из вспомогательных буферов. Каждый из этих буферов можно выбрать в качестве целевого как при рисовании, так и при чтении.
Для рисования вы можете также установить целевыми более одного буфера однозременно. Для указания буфера записи предназначена команда В1ОгаиВиттег О, з для чтения — В1деаоВоттег(). Выбранный буфер используется командами 1(кезОР(хе1э(), В1СоруР1хе1э(), В1СоруТех1вэпе*() и В1СоруТех5иб)ааВе*(). 392 Глава 10 ° Буфер кадров В случае двойной буферизации для рисования привлекается только фоновый буфер (а после рисования выполняется перестановка буферов). В иных ситуациях вы можете захотеть обращаться к окну с двойной буферизацией как к окну с однократной буферизацией, одним вызовом к10гамви((ег() заполняя оба буфера — рабочий и фоновый.
Команда В10гамВиФ(ег () также используется для выбора буферов при воспроизведении стереоизображений (6С*СЕЕТ и 6С'Й16НТ) и вывода в дополнительные буферы (6С АОХ(), чо1г) В10гамвоттег(61.епшп гное); Указывает буферы цвета для записи или очистки и делает недоступными буферы, активированные предыдущими вызовами В10гамВиттег().
Одновременно могут быть активны несколько буферов. Параметр режима (тос(е) принимает одно из следующих значений: 61 ЕЙОМТ 6( ЕЙОМТ СЕЕТ 6( АОХ( 6С ВАСК 6( ЕЙОМТ Р16НТ 6( ЕЙОИТ АМО ВАСК 6( СЕЕТ 6( ВАСК СЕЕТ 6С МОНЕ 6С Й16НТ 6( ВАСК Й16НТ Параметры СЕЕТ и Р16НТ относятся к обоим стереобуферам — левому и правому; аналогично, параметры ЕЙОМТ и ВАСК воздействуют на два буфера — фоновый и рабочий. Суффикс ( в 6ь АОХ( — зто цифра, идентифицирующая дополнительный буфер.
По умолчанию режим (тоде) устанавливается в значение 6( ЕЙОИТ для контекстов с однократной буферизацией и в значение 6с ВАСК для двойной буферизации. ПРИМЕЧАНИЕ Вы можете указать для рисования несуществующие буферы, но по крайней мере один из буферов должен существовать. Если ии один из указанных буферов ие существует, вы получите со. общение об ошибке. чо(с( В1Реаовотте г(С).епшп тоНе); Выбирает буфер цвета, активируемый как источник для чтения пикселов командами В1РеабР!хе1з(), к1СоруР!хе\в(), В1СоруТех1аабе" (), В1СоруТех5пЫвабе' () и В1СоруСопчо1ос)опЕ111е г" (), и отключает буферы, включенные предшествующими вызовами К1ЙеабВот Еег (). Значение режима (тос(е) может быть одним из следующих: 6( ЕРОМТ 6( ЕЙОМТ СЕЕТ 66 АОКИ' 6С ВАСК 6( ЕЙОМТ Р16НТ 6С СЕЕТ 6( ВАСК СЕЕТ 6( Й16НТ 6( ВАСК Р16НТ Буферы для 61Реас(ВцттегО те жс, что и для команды В10гамвиттегО.
По умолчанию аргумент тос(е устанавливается в значение 6( ЕЙОМТ для контекстов с однократной буферизацией и в значение 6( ВАСК для двойной буферизации. ПРИМЕЧАНИЕ Буфер для чтения должен существовать, иначе будет сгенерировала ошибка, Буферы и их применение 393 Маскирование буферов Перед записью ОрепСЬ данных в буфер цвета, глубины или трафарета к этим давным применяются операции наложения, или маскирования, как это показано и следующих команлах.
Для каждой маски и связанных с ней данных выполняется операция поразрядного логического И. поЫ а1(ппехнапк(СЬц!пт тап6); поЫ а16о1о г И а э к(С1 Ьоо!сап тИ Сцхю1еап увел, СЕ)хю!еап 66ие Саво!сап а(рба); поЫ п1вертпнапк(СЬЬоо!еап~Яая); чу п151епс11иапк(СЬшпг тизл); Устанавливают маски, используемые для управления записью в определенныс буферы.
Команда а11пцехИапх() применяется только для режима индексации цвета. Если в маске (тай) присутствует 1, в буфер индексов цвета записывается соответствующий бит; для нулевых битов маски запись в буфер не производится. Аналогично, команда х16а1огнапм() имеет смысл только для режима РСВА. Значения геа(, уеел, 6!ие и а!рба отвечают за запись соответству|ощего компонента. (Запись — 6Е ТРОЕ.) Если лля команды п10ергЬИапа () аргумент/7ай установлен в 6Е ТРОЕ, для записи включается буфер глубины; в противном случае он отключается. Маска для команды а15тепс11Иапп() используется для данных маски так же, как маска а11овехназм().
Значения по умолчанию для любых СЬЬоо1еап-масок равны 6Е ТРОЕ, а для СЕшпт-масок — это единицы. Маскирование в режиме индексации цвета — возможность самым хитрым образом пбработать данные. Например, вы можете использовать каждый бит индекса как ютдельный слой и определить взаимодействие между произвольными слоями, соптпетствующим образом настроив карту цвета.
Вы можете создавать наложения и подложки и таким образом получать анимированные картинки. (См. главу 14, где приведены примеры маскирования цвета.) Маскирование в режиме ВСВА применяется не так часто, но вы можете использовать его, например, для загрузки отпепьных изображений из файлов в красную, зеленую и синюю битовые плоскости. Мы уже знакомили вас с отключением буфера глубины в разделе «Трехмерное смешивание с использованием буфера глубины» в главе 6.
Этот прием полезен и и случае, когда для серии кадров нужен одинаковый фон, а вы хотите добавить «то-лнбо, заслоняющее фоновые участки. Например, предположим, что действие происходит на фоне леса и вам нужно несколько раз показать одни и те же дерепья с перемещающимися между ними объектами.
После того как деревья нарисопппы и их глубины зафиксированы в буфере глубины, изображение с деревьями шхраняется, а новые элементы рисуются в условиях недоступного для записи буфера глубины. Пока новые элементы не перекрывают уже нарисованные новые мементы, картинка корректна. Чтобы нарисовать следующий кадр, восстановите изображение с деревьями и продолжите рисование. Вам не нужно восстанавлипить значения из буфера глубины. Этот прием особенно полезен, если задний план достаточно сложен — настолько, что быстрее просто перекопировать изоЕражение из буфера цвета, нежели перевычислять его геометрию.
394 Глава 10 ° Буфер кадров Маскирование буфера трафарета позволяет использовать многоразрядный буфер трафарета для хранения множества шаблонов (по одному на бит). Эта техника полезна, например, для выполнения так называемого кэпинга (сарр(пя) (см, раздел «Тест трафарета» этой главы) или для реализации игры «Жизнь» (см. раздел «„ Жизнь" в буфере трафарета» главы 14). ПРИМЕЧАНИЕ Маска, указываемая для д)5сепо)Маях(), управляет тем, какие битовые плоскости маски учапвуют в записи.
Эта маска не связана с маской, задаваемой в качестве третьего аргумента д)5хепа)ропсе и говорящей о том, какие битовые плоскости охватываются буфером трафарета, Тесты и операции над фрагментами Когда вы отображаете на экране геометрические фигуры, тексты или изображения, ОрепСь выполняет определенные расчеты для поворота, переноса, масшта. бирования, определения освещения, получения проекции объекта в перспективе, вычисляет, какие пикселы следует воспроизводить в окне, и выясняет, какими цветами должны быть нарисованы эти пикселы. Об управлении этими операциями говорилось во многих из глав, предшествующих данной.
Затем Орепо(. решает, какие фрагменты следует генерировать и с какими цветами. Часть этапов оставшейся обработки зависит от местонахождения соответствующего фрагменту пиксела в буфере кадров. Например, если он расположен снаружи прямоугольной области или если находится дальше от точки наблюдения, чем пиксел, уже помещенный в буфер кадров, фрагмент не рисуется. На других стадиях цвета фрагментов смешиваются с цветом пиксела, присутствующего в буфере кадров. Этот раздел описывает оба полных набора тестов: выполняемых до поступления фрагмента в буфер кадров и заключительных действий.
Тесты и операции выполняются в следующем порядке (если фрагмент исключается из рассмотрения ранними тестами, к нему не применяются дальнейшие тесты и операции); 1) тест на отсечение; 2) альфа-тест; 3) тест трафарета; 4) тест глубины; 5) смешивание; 6) размытие; 7) логические операции. Все перечисленные тесты и операции подробно рассматриваются в следующих подразделах. Тест на отсечение Вы можете определить прямоугольную область окна и ограничить рисование только ее пределами, используя команду й15с1ззог().