OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 85
Текст из файла (страница 85)
Как показано на рис. 10.1, левый нижний пиксел окна ОрепОЕ, (О, О), в оконных координатах соответствует левому нижнему углу области размерами 1 х 1, заниякемой пикселом. В общем случае пиксел (х, у) заполняет собой область, огранитенвую значением ж слева, значением х ь 1 справа, у — снизу и у + 1 — сверху. Координаты У окна 3,0 г,о г,о о,о О,О 1,0 2,0 3,0 Координаты Х окна Левый нижний угол окна Рис. 10.1.
Область, занимаемая ликселом йте более пристально посмотрим на буфер, который хранит цветовую инфор- ию о данных, отображаемых на экране. Положим, что ширина экрана составет 1280 пикселов, а высота — 1024 пиксела, и что мы имеем дело с 24-разрядзкраном — таким, который может воспроизвести 2т" (16 777 216) различных ов, Поскольку 24 бита это то же, что 3 байта (стандартный байт состоит из бгп), буфер цвета должен быть разбит на порции из 3 байтов для каждого из 388 Глава 10 ° Буфер кадров 1 310 720 (произведение 1280 и 1024) пикселов экрана. Число пикселов на физическом экране зависит от возможностей аппаратного обеспечения, но количество информации о пикселе, сохраняемой в буфере цвета, — величина одинаковая во всех случаях.
Буфер цвета — это только олин из нескольких буферов, хранящих информацию о пикселах. Вспомните раздел «Удаление невидимых поверхностей» главы 5, из которого вы узнали, что буфер глубины содержит информацию о глубине пикселов. Сам буфер цвета может состоять из нескольких подбуферов. Понятие буфера кадров ((гашеЬп(Еег) относится ко всем этим буферам. За исключением буфера цвета, вы не можете видеть эти другие буферы непосредственно; они привлекаются для таких задач, как удаление невидимых поверхностей, сглаживание сцены, отображение по маске, воспроизведение плавного движения, и других операций. В этой главе описаны все буферы, поддерживаемые реализациями ОрепЯ., и рассказывается о том, как их использовать. Здесь также говорится о серии тестов, применяемых к пикселам перед их помещением в буфер цвета. Наконец, объясняется назначение буфера накопления — накопление изображений, подлежащих помещению в буфер цвета.
Данная глава разбита на следующие основные разделы: ° Буферы и их применение. Описывает существующие буферы, нх назначение и управление ими — очистку и разрешение записи. ° Тесты и операции над фрагментами. Объясняет сущность тестов на отсечение, трафарета, глубины и альфа-теста, выполняемых после расчета положения и цвета пиксела, но до его вывода на экран, Несколько операций — смешивание, размытие и логические — также могут быть выполнены перед тем, как фрагмент обновит собой экран. ° Буфер накопления. Описывает более изощренные приемы, включающие в себя сглаживание сцены, размытие при движении и имитацию глубины, подобно фотографиям. В версии Орепб).
1.4 добавлены операции вывода по шаблону СС 1НСР НРАВ и 6С ОЕСР ИРАР. Буферы и их применение Система Орепб). может управлять следующими буферами: ° цветовыми: передним левым, передним правым, задним левым, задним правым и любым количеством вспомогательных буферов; ° буфером глубины; ° буфером трафарета; « буфером накопления. Конкретная реализация Орепб1. определяет, какие буферы доступны и какое количество битов на пиксел для них принято, Кроме этого поддерживаются состав- Буферы и их применение 389 ные, то есть «оконные» типы, подразумевающие работу с несколькими буферами.
Таблица 10.1 содержит список параметров функции В1бес1птейегч(), которая запрашивает систему ОрепСТ. о размере памяти, отводимой пикселу какого-либо вбьекта визуализации. ПРИМЕЧАНИЕ Если вы используете систему Х Уч~пбоис вам гарантируется как минимум один объект визуализации с однии буфером цвета для использования в режиме йбВА со связанными буферами трафарета, глубины и накопления, значения компонентов, цвета которых отличны от нуля. Также, если реализация Х ЬУ!пбочг поддерживает псевдоцвета, вам гарантируется наличие одного объета визуализации Орепбь с буфером цвета для использования в режиме индексации цвета, с ассоциированными буферами глубины и трафарета.
Для запроса об этих объектах существует команда д~хбессопбр(); см. приложение В и руководство ОрепЯ. йе(егепсе малов~ для получения более подробной информации. Таблица 10.1. Параметры запроса о размере памяти, отводимой под пиксел Пояснение Параметр Количество битов на йч б ч В- и А-компоненты цветовых буферов Количество битов на индекс в буферах цвета Количество битов на пиксел в буфере глубины Количество битов на пиксел в буфере трафарета Количество битов на йч бч В- и А-компоненты буфера накопления 6(„йЕР В1Т5, 66 бйЕЕН В1Т5, ВС ВСОЕ В1Т5, 6( АСРНА В1Т5 6( 1НРЕХ В1Т5 6(„ОЕРТН В)Т5 6( 5ТЕНСТС В1Т5 6( АССОМ йЕР В1Т5, 66 АССОМ бйЕЕН В1Т5, 6( АССОМ ВСОЕ В1Т5,66 АССОМ АСРНА В1Т5 Буферы цвета Буферы цвета это то место, где обычно выполняется рисование.
Они содержат ЕСВ- или индексные данные и могут также содержать значения альфа-компонента. В реализациях ОрепС1, поддерживающих стереоскопический просмотр, имеются левый и правый буферы цвета для стереоизображений. В противном стучае используются только левые буферы.
Аналогично, система двойной буферизации подразумевает рабочий и фоновый буферы, а система однократной буферизации работает только с рабочими буферами. Любая реализация ОрепС1. предоставляет передний левый буфер цвета. Необязательно, но могут поддерживаться неотображаемые буферы. ОрепС1 не Регламентирует правила их применения, поэтому вы можете использовать их, как пожелаете. Например, задействовать их для хранения многократно используеиых изображений. Тогда, чтобы не перерисовывать изображение заново, вы можете просто скопировать существующее из вспомогательного буфера в нужные буферы цвета.
(См. описание команды В1СоруР1хе! з () в разделе «Чтение, запись и копирование пикселов» главы 8.) В вашем распоряжении параметры ВС 5ТЕНЕО и БС РРОВС ЕВОЕ ГЕН для команды 116есВоо1еапч (), позволяющие выяснить, поддерживается ли в системе стерео- вывод (то есть доступен ли правый буфер) или двойная буферизация (задний бу- 390 Глава 10 ° Буфер кадров фер). Чтобы узнать, какие вообще вспомогательные буферы присутствуют, ис- пользуйте команду я10е11птеяегч() с параметром 60 А0Х В0»ГЕР5.
Буфер глубины Буфер глубины хранит значение глубины для каждого пиксела. Как говорилось в разделе «Удаление невидимых поверхностей» в главе 5, под глубиной понимается расстояние до наблюдателя исходя из того, что пикселы с большей глубиной записываются поверх пикселов с меньшими значениями. Это просто полезное соглашение, хотя поведение буфера глубины может быть изменено согласно описанию из раздела «Тест глубины», Буфер глубины иногда также называют г-буфером (з — это как бы третья координата (помимо х и у), перпендикулярная экрану).
Буфер трафарета Одно из применений буфера трафарета это ограничение области рисования какой-то частью экрана, аналогично тому, как шаблон из картона помогает создать резкие изображения при простом распылении красителя. Например, вы можете захотеть воспроизвести картину, видимую через лобовое стекло, имеющее неправильную геометрическую форму.
Тогда сохраните форму ветрового стекла в буфере трафарета, а в дальнейшем используйте его для вывода полной сцены. Буфер трафарета предотвратит отображение лишней панорамы, невидимой через переднее стекло. Таким образом, если ваше приложение моделирует автомобиль, достаточно один раз нарисовать приборную доску и другие элементы внутри автомобиля, а при имитации его движения только обновлять внешнюю сцену. Буфер накопления Буфер накопления хранит данные цвета ВОВА, как и каждый буфер цвета в режиме ВОВА. (В режиме индексированного цвета для буфера накопления результаты не определены.) Обычно накапливается серия изображений, затем сливаемэя в конечное, составное изображение. Таким образом вы можете выполнять такие операции, как сглаживание, с помощью избыточной выборки (зпрегзашр1шй) и усреднения отсчетов, с целью последующей окраски пикселов в буфере цвета в полученное значение цвета.
Рисование в буфер накопления непосредственно не производится; он просто аккумулирует действия, всегда выполняемые прямоугольными областями, поступающими в буфер цвета и исходящими из него. Очистка буферов В графических программах очистка экрана (или любого из буферов) — обычно одна из самых «дорогостоягдих» операций.
Так, на мониторе 1280 х 1024 она требует обработать более миллиона пикселов. В простых графических приложениях операция очистки может отнять больше времени, чем все прочее рисование. Если вам нужно очистить не только буфер цвета, но также и буферы глубины и трафарета, время очистки увеличится еще в три раза.
Буферы и их применение 391 Чтобы решить эту проблему, некоторое аппаратное обеспечение очищает все буферы вместе. Команды Ореп01. для очистки по возможности оптимизированы под такую архитектуру. Вначале вы указываете значения, которые следует запигать в каждый буфер для его сброса. Затем дается единственная команда на выполнение очистки, самостоятельно перебирающая буферы из заданного списка. Внутри же все зависит от архитектуры, если она способна на единовременную очистку, таковая и выполняется, в противном случае буферы очищаются последовательноо. Следую|цие команды устанавливают значения очистки для каждого буфера: чо1й к1С1еагСо1о г(01с)агар( геЫ, 01с1ап1р1уееи, 01с1ап1р( Ыие, 0(с)ащр1 а(рЬа); чо|г) В1С1еа г1паех(СЕйоаг тг(ех); чо1г) В(С1еа гоерсв(СЕс!ащрг) г(ер(А); чо(г( В1С1еаг51епс(1(01(пг з); чо1г( В1С\еаглссип(СЕйоаг ген СЕйоаг ягеел, СЕйоаг Ыие, СЕйоас а(рйа); Эти команды задают значения очистки для буферов цвета (в режиме КСВА или индексации цвета), глубины, трафарета и накопления соответственно.