OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 89
Текст из файла (страница 89)
Для систем с неболыним количеством доступных цветов можно «размыть» (йгпег) значения цвета, увеличив число доступных полутонов, жертвуя разрешением. На финальной стадии в вашем распоряжении поразрядные логические операции, позволяющие произвольно комбинировать входящий фрагмент и уже записанные в буфер пикселы. Смешивание При смешивании объединяются К-, С-, В- и альфа-компоненты поступивших ва обработку фрагментов с ранее обработанными пикселами.
Предусмотрены различные операции смешивания, все они зависят от значений альфа-компонентов входящего фрагмента (если он есть) и сохраненных пикселов. (См. раздел «Сме. шивание» главы 6 с более подробной информацией цо теме.) Размытие В системах с небольшим количеством битовых плоскостей цвета вы можете при. нести разрешение в жертву передаче полутонов (с11гйег1пй, также размытие, клиширование, смешивание цветов) изображения. Размытие напоминает растрирование (Ьа1ггоп|пй) в полиграфии. Хотя «Нью-Йорк Таймс» печатается только в двух цветах — белом и черном, — фотографии на страницах этого издания представлены градациями серого как результат комбинирования черных и белых точек.
Прн сравнении газетной фотографии (не в оттенках серого) с ее оригиналом (в полутонах) наблюдается потеря пространственного (зраиа1) разрешения. Аналогично, системы с поддержкой малого числа битовых плоскостей могут восполъзоваться красными, зелеными и синими цветами соседних пикселов для имитации более широкого диапазона цветов. Операция размытия является аппаратно-зависимои; все реализации ОрепС1.
могут ее включить н выключить. Фактически, на иных компьютерах она вообще ни к чему не приводит, поскольку обычно ощущается на машинах с очень точным воспроизведением цвета. Чтобы включить и выключить размытие, задайте пара. метр Бс 01ТНЕк для команд к1ЕпаЫео и к101заЫе(). По умолчанию функция размытия не действует. Размытие применяется как в РСВА-режиме, так и в режиме индексации цвета. Цвета и цветовые индексы чередуются зависимым от аппаратной части способом, путем выбора из двух ближайших. Например, при индексации цвета, если размы- Тесты и операции нвд фрагментами 403 тне активно и индекс равен 4,4, из всех пикселов 60 7«могут быть нарисованы с индексом 4 и 40 Ж вЂ” с индексом 5. (Есть много алгоритмов передачи полутонов, но в любом случае результирующее значение должно зависеть только от поступающих на обработку значений и координат (х и у) фрагмента.) В режиме КСВА вззмытие производится раздельно для каждого компонента (включая альфа-канав).
Чтобы использовать размытие в режиме индексации цвета, вам нужно упорядочить цвета в цветовой карте по линейному закону; во избежание некорректного результата. Логические операции Последними над фрагментом выполняются девические опериции, как то: ИЛИ (ОК), исключающее ИЛИ (ХОК) или 1)чЧЕКТ. Они применимы к значениям поступившего на обработку фрагмента (источнику) и/или к текущим значениям в буфере цвета (приемник). Такие операции особенно полезны на компьютерах, оперирующих блоками битов, где первичной графической операцией является копирование прямоугольника с данными из одного места окна в другое, илн из вкна в оперативную память, или из памяти в окно.
Обычно данные при копировании не записываются непосредственно в память, что позволяет выполнить над ними и уже имеющимися данными произвольные логические операции; при этом в приемник попадает результат операции. Поскольку этот процесс может быть реализован достаточно «дешево» на аппаратном уровне, во многие машины логические операции заложены в «железо». Так, ХОК может быть использована лля стирания-восстановления изображения; повторное применение ХОК в том же месте приводит к восстановлению изначального экрана. Как другой пример можно привести интерпретацию индексов цвета в качестве битовых шаблонов. Тогда составное изображение можно комбинировать из слоев, используя ограничивающие маски записи применительно к различным битовым плоскостям, и модифицировать данные слоев посредством логических операций. Включается и выклк>чается режим логических операций заданием константы 6С 1МОЕХ СО61С ОР или 6С СОСОР (061С ОР при вызове команд н1ЕпаЫеО и в)О1ваЫе () для режимов индексации цвета илн КСВА соответственно.
В вашем распоряжении выбор из 16 логических операций с помощью н1(он1сорО или просто применение значения па умолчанию — 6С СОРУ. (В целях обратной совместимости с версией 1.0, н1ЕоаЫе(6С СО61С ОР) также разрешает применение логических операций в режиме индексации цвета.) чо1П н1сон1сор(С1.епшп орсог(е); Выбирает логическую операцию, для применения ес к входящему фрагменту (источнику) и пикселу, ранее сохраненному в буфере цвета (приемнику). В табл.
10А представлены допустимые значения для аргумента код:. операции (орсоЫе) и соответствующие объяснения (здесь з — источник и с( — риемник). Значение по умолчанию — 6С СОРУ. 404 Глава 10 ° Буфер кадров Таблица 10.4. Логические операции Операция Параметр Операция Параметр 5Лд 5ЧО (5 л о) (5 о д) 5ХОй о -(5 ХОЯ б) 5 Л Г) д 5Л О Буфер накопления Буфер накопления может быть использован для таких целей, как сглаживание сцены, размытие при движении, имитация фотографической глубины резкости и вычисление результируюших теней от множества источников света, Есть и другие применения, причем в сочетании с другими буферами.
(См. ТТ5е Ассити1айоп ВиЦет. Натдаате 5ирротг Чот Н18А-Яиайгу Веп«1ет1тгй Пауля Хэберли (Рав! НаеЬег!!) и Курта Акели (Кпгг А)се!еу (81ССйАРН, 1990, с. 309-318) для получения большей информации по поводу буфера накопления.) Операции рисования ОрепС1 не записывают данные напрямую в буфер накопления. Обычно генерируется серия изображений в одном из стандартных буферов цвета, и ати иэображения передаются вместе, за один заход, в буфер накопления.
Когда накапливать больше нечего, результат копируется назад в буфер цвета для просмотра. С целью уменьшить ошибку округления, буфер накопления может иметь более высокую точность (больше битов на цвет), чем стандартные буферы цвета. Воспроизведение сцены за несколько проходов длиннее одноразового вывода по времени, но дает более качественные результаты. Решение, что предпочесть в конкретной программе — качество или скорость, — во власти разработчика. Вы можете использовать буфер накопления подобно тому, как фотограф накладывает одну экспозицию на другую, не переводя кадр.
При этом движущийся объект получается размытым. Не удивительно, что компьютер способен на большее, чем фотограф со своей камерой. Например, компьютер обладает всеми возможностями контроля над точкой наблюдения, а фотограф не застрахован от случайной встряски камеры. (См. раздел «Очистка буферов> по вопросу об очистке буфера накопления; используйте команду 61Ассопо для управления им.) чоЫ я1Ассоп(СЕепшп ор, С1.йоас сп1ие); Управляет буфером накопления, Аргумент ор предназначен для выбора опе- рации, а оа1ие — просто используемое во время операции число. Допустимые операции — это 6С АССОМ, 6С СОАО, 6С ЯЕТОЯМ, 6С АОО и 6С МОСТ: 66 С1.ЕАй 61 СОРУ 6С МООР 6С 5ЕТ 6С СОРУ 1МЧЕЯТЕО бь 1МЧЕЯТ 6С АМО ЯЕЧЕй5Е 6С Ой ЯЕЧЕй5Е бг АМО 61 Ой 61 МАМО 6С МОЯ 61 ХОЯ 66 Е001Ч 61 АМО 1МЧЕЯТЕО бг ОЯ 1МЧЕЯТЕО БуФер накопления 405 6( АССОИ читает каждый пиксел из буфера, выбранного для чтения командой н)ЙеавпоЕ ге г (), умножает значения К-, Сч В- и альфа-компонентов на па(ие и добавляет к результату значения из буфера накопления.
6( 'сОАО действует аналогично 6с АССОИ, за исключением того, что значения замещают содержимое буфера накопления, а не добавляются к ним. 6( кЕТОИИ выбирает значения из буфера накопления, умножает их па ва1ие, и помещает результат в буфере (буферах) цвета, в который разрешена запись. 6( АОО добавляет оа1ие к значению каждого пиксела из буфера накопления, а 6с ИОСТ вЂ” умножает это значение на па(ие; результат заносится в буфер накопления.
Для 6( ИОСТ множитель (оа1ие) ограничен диапазоном [ — 1,0, 1,0~. Для 6С АОР ограничения нет. С) лаживание сцены Выполняя сглаживание сцены, сначала очистите буфер накопления и разрешите применение переднего буфера для чтении и записи. После этого несколько раз (скзжем, п раз) повторите код, чуть-чуть смещающий ( Тггег(пй — дрожание, перенещение изображения в близко расположенную позицию) изображение и отрисонывающий его, накапливая данные командой гмсснв(6( АССНИ, Г.Э)л); н последней вызывая 1)Ассэв(6с аЕТННН. 1.В); Заметьте, что этот метод несколько ускорится, если на первом проходе использомть параметр 6С СОАО и опускать очистку буфера накопления.
(См. табл. 10.5 в конце главы о возможных значениях «дрожания» ()йггег1пй)). Здесь изображенне рисуется и раз до момента его последнего вывода. Если вы хотите избежать показа пользователю промежуточных изображений, рисуйте в невидимый буфер цвета, накапливайте из него и используйте константу 6( кЕТОкн для рисования н отображаемый буфер (или в фоновый буфер для последующего обмена его соПержимого с передним).
Другой вариант — «обернуть» это в пользовательский интерфейс, показывающий, насколько улучшается изображение после каждого момента накопления, н позволяющий пользователю прервать процесс при достижении изображением необходимого качества. Для этого в цикле, последовательно рисующем изображение, вызывайте к1Ассов() с параметром 6с кЕТОки после каждого акта накопления, задавая числа 16,0/1,0, 16,0У2,0, 16,0/3,0 и т, д. в качестве второго аргумента. Здесь после первого прохода показывается 1/16 конечного изображения, после пнух — 2/16 и т.