М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 10
Текст из файла (страница 10)
позволяет устанавливать систему координат, позицию наблюдателя и направление обзора, соответственно, бывает трудно определить необходимые размер и положение прямоугольника для очистки экрана. Наконец, на многих компьютерах графическое оборудование включает в себя несколько буферов, кроме буфера, содержащего информацию об отображаемых пнкселах. Эти буферы также время от времени нуждаются в очистке, и удобно иметь команду для одновременной очистки различных их сочетаний. (См, главу 10 для обсуждения всех возможных буферов.) Также необходимо знать, как цвета пикселов хранятся в графическом оборудовании в виде так называемых битовых ллоскоапеи. Есть два метода хранения.
Первый — каждое значение красной, зеленой, синей и альфа- (КОВА) составляющих пиксела может напрямую храниться в битовой плоскости, или второй — в битовой плоскости содержится единое значение индекса, связанное с цветом в цветовой таблице. Цветовой режим ВОВА используется чаще, поэтому он фигурирует в большинстве примеров этой книги. (См, главу 4 для получения более подробной информации о цветовых режимах.) До 6-й главы на все значения альфа-составляющей можно не обращать внимания. Например, данные строки очищают экран и заливают его черным цветом в режи- ме КОВА: В(С1еагСо(ог(О.О, О.О, 0.0, О.В); В1С1еаг(ЕС СО(оя ВОРРЕЕ В1Т); Первая строка устанавливает черный цвет очистки, а с.ледуюшая команда очищает окно текущим цветом очистки.
Аргумент функции к1С1еа г () определяет надлежаший буфер. В данном случае программа очистит только цветовой буфер, в котором хранится изображение, выводимое на экран. Обычно цвет очистки устанавливается один раз, в начале приложения, а затем выполняются очистки так часто, как это необходимо. ОрепСС хранит текуший цвет очистки как параметр состояния и нс требует его у вас при каждой очистке буфера. Главы 4 и 10 рассматриваю~, как использовать остальные буферы. Сейчас вам достаточно знать, что очистить их довольно просто.
Например, для очистки цветового буфера и буфера глубины используется следующая последовательность команд: В1С1еагсо1ог(В.В, О.В. В.О, 0.0); В)С(еагОертн(1.0); В1С1еаг(СЕ СОСОЕ ВОРРЕВ В1Т ( ОС ОЕРТН ВОРРЕР В1Т); В этом примере использование я1С)еагСО1огО аналогично предыдущему, функция В1С1еагОертПО определяет значение, устанавливаемое для каждого Основы рисования 47 ппкссла буфера глубины, а функция В1С1еа г () принимает в аргументе битовую операцию ИЛИ (ОВ), объединял)щую очищаемые буферы. Следующее краткое описание функции В1С1еаг () включает таблипу, в которой приведены буферы, которые можно очистить, нх названия и главы, где эти буфсры описываются.
ко(с( В1С)еа тСо1о т(ОЕс1ашрЕ тесУ, ОЫаптрЕ ятееи, Ис)ашр( Ыие, ОЕс!шпрЕ аУрйа); Уста))заливает текущий цвет очистки, используемый для очистки буфера в режиме ВОВА. (См, главу 4 для получения подробной информации о рсжпме ВОВА.) Значения красного (тетУ), зеленого (угтеел), синего (Ыие) и альфа- компонентов (иУГ)У)а) устанавливаются при необходимости в диапазоне [О, 1). По умолчанию действует белый цвет (О, О, О, 0). чо(г( В1С1еат(О)ЬЕ(Е)е!о таз)т); Очищает заданный буфер текущим значением.
Аргумент таз)т определяет с помощью логического битового ИЛИ очишаемыс буферы, перечисленные в табл. 2.1. Таблица 2.1. Буферы длл очистки Глава Глава 4 Глава 10 Имл Буфер 61 С010В ВОРЕЕВ В1Т 61 0ЕРТН ВОЕРЕВ В1Т 61 АССОМ ВОГРЕВ В1Т 61 5ТЕНС11 ВОРРЕВ В1Т Буфер цвета Буфер глубины Буфер накоплении Буфер трафарета Глава 10 Глава 10 Перед использованием команды очистки нескольких буферов необходимо определить значения цвета закраски после очистки для каждого очищаемого буфера, если не подходят значения, определенные по ултолчанию для цвета ВОВА, буферов глубины, накопления и трафарета. Кроме команд В1С1еагСо1ог() и В161еатперт)) О, устанавливающих значения для очистки для буферов цвета и глубины, используются команды В1С(еат1пбехО, В161еагАссым() и В161еат5(епст1О, определяющие значения очистки — индексы для буферов цвета, накопления и трафарета.
(См. главы 4 и 10 для получсния информации об этих буферах и их использовании.) ОрепС1. позволяет определить несколько буферов, так как обычно очистка — довольно медленная операция, поскольку обрабатывается каждый ппксел окна (их могут быть миллионы), а некоторые графические контроллеры позволяют очищать несколько буферов одновременно.
Оборудование, нс поддерживающее одновременную очистку буферов, выполняет ее последовательно. Различие между В1С1еаг(61 СОСОВ ВВРРЕВ В1Т ) 61 ВЕРТН ВВРРЕа ВГТ); В161еаг(61 С010я ВВРРЕВ В!Т); В161еаг(61 ВЕРТН ВОРГЕВ В1Т); в том, что при одинаковом результате первый пример будет работать быстрее на большинстве компьютеров. Естественно, первый пример никогда не будет работать медленнее второго.
48 Глава 2 ° Управление состоянием н рисование геометрических объектов Установка цвета В Орепо) описание очертания рисуемого объекта независимо от описания его цвета. Всегда часть геометрического объекта рисуется с использованием текущей цветовой схемы. Цветовая схема может быть простой, вида «рисуем все ярко- красным цветом», или сложной, например «нарисовать объект вида синего пластика, осветценне задается желтыми точечными источниками света, плюс общее неяркое красновато-коричневое освещение где-то ещеа. Обычно программисты, использующие ОрепСЦ сначала устанавливают цвет или цветовую схему, а затем рисуют объекты.
До тех пор пока цвет или цветовая схема не будут изменены, все объекты отображаются этим цветом или в атой цветовой схеме. Данный метод позволяет ОрепСВ добиваться более высокопроизводительного рисования, чем при явном задании цвета каждый раз. Например, псевдокод Бет соггепС со1ог(геб); Оган оо>ес1(А>: Оган оЬ1есС(В); ает соггепт со1ог(йгееп); тес соггепт со1ог(Мое); Огаи оЬ>есс(С); рисует объекты Л и В красным цветом, а объект С вЂ” синим. Команда в четвертой строке, устанавливающая текущий цвет зеленым, — лишняя. Окрашивание, освещение и затенение — отдельные темы для целой главы или большого раздела.
Для рисования видимых графических примитивов достаточно только сведений об установке текущего цвета. Эта информация содержится в нескольких следующих абзацах. (См. главы 4 и 5 для получения дополнительной информации.) Для установки цвета используется команда 91СО1огЗГ О. У нее три аргумента, все вещественного типа с плавающей запятой, принимающие значения от 0,0 до 1,0. Эти параметры по порядку задают интенсивность красного, зеленого и синего компонентов цвета.
Их можно считать спецификацией смешивания цветов: 0,0 означает полное отсутствие данного компонента, а 1,0 — максимальную интенсивность данного цвета. Таким образом, код 9(со)огз((1.8, 0.8, О,О>; задает ярчайший красный цвет, который может отобразить система, без примесей зеленого или синего. Все нули определяют черный цвет, а все единицы — белый.
Установка всех трех составляющих в 0,5 даст серый тон (средний между белым и черным). Ниже приведены восемь команд с описанием цвета, который они залают: 91СЬ1ог3((8.8, 0.0, 8.0); черный 91со1огзт(1.8, 8.0, 0.0); красный 91Со1аг3((8.8, 1.0, 8.0); зеленый 9>Со>огзт(1.9. 1,0, 0.0); желтый 91СЬ1ог3((8.9, 0.0, 1.0); синий 91СЬ1огзт(1.8, 0.8. 1.0); маджента 91СЬ1ог3((8.8. 1.8, 1.8>; миан 91СЬ1огзт( 1.9, 1.0, 1.8); белый Основы рисования 49 Видно, что первые три аргумента команды для задания цвета очистки к1С1еэгСо1ог() совпадают с аргументами функции х1Со1ог31(). Четвертый — это значение альфа-составляющей, описываемой в разделе «Смешивание» главы 6.
Будем полагать, что значение четвертого аргумента функции а1С1еагСо1ог() равно 0,0, оно является значением по умолчанию. Ускорение завершения рисования Как было показано в разделе «Конвейер рисования Орепбь» главы 1, современные графические системы можно представить в ниде сборочного конвейера.
Центральный процессор (СР()) обрабатывает команды рисования. Возможно, другое оборудование выполняет геометрические преобразования. Выполняется отсечение, затем затенение и/или текстурирование. Наконец, значения записываются в битовые плоскости для отображения. В высокопроизводительных архитектурах за каждую из этих операций отвечает отдельный блок, специально оптимизированный для ее максимально быстрого выполнения. В такой архитектуре СР() ие ждет окончания выполнения команды рисования для того, чтобы выполнить следующую.
Пока СР() отправляет вершины далыпе по конвейеру, оборудование для преобразований выполняет преобразования предыдущего набора, выполняется отсечение набора, введенного перед предыдущим, и т. д, В системах, где СР() ждет результатов обработки команды, задержки перед обработкой следующей команды значительно снижают общую скорость конвейера. Кроме того, приложения могут выполняться больше чем на одной машине. Например, предположим, что основная программа выполняется где-то в другом месте (на компьютере, называемом клиентом), а результат рисования отображается на вашей рабочей станции или терминале (сервере), который соединен с клиентом через сеть.