Затягивание туманом является частным случаем смешения двух изображений с переменными значениями alpha. Рассмотрим простой пример. Предположим, что у вас есть рисунок сада и рисунок окна (или части комнаты с окном) и вы хотите изобразить на экране окно, выходящее в сад, причем часть окна открыта, а часть закрыта. Можно, конечно, смонтировать нужное изображение с помощью графического редактора, но нас интересует другой способ достижения результата.
Предположим, что изображение сада уже находится на экране и на него накладывается изображение окна. В таком случае нужен массив значений alpha для каждой точки изображения окна. Не прозрачным точкам, например рамам, подоконнику и т. п., должны соответствовать значения alpha=i, для полностью прозрачных точек, соответствующих открытой части окна, alpha=o, частично прозрачные точки (стекло) предварительно окрашиваются в белый цвет, а значение alpha для них подбирается в пределах от 0,25 до 0,5. Оставим в стороне вопрос о том, как составить массив значений alpha, предположим, что он существует.
Работать с двумя файлами не очень удобно, поэтому на практике используются комбинированные файлы, в которых коды базовых цветов каждой точки дополнены значениями alpha (от 0 до 255). Код точки при этом занимает не 24, а 32 разряда. В специальной литературе вы можете встретить выражение альфа-канал (Alpha Channel), которое обозначает некий источник кодов точек, в которых базовые цвета дополнены значениями alpha. Некоторые модели акселераторов имеют специальный альфа-буфер, для размещения рисунков с 32-разрядными кодами точек. При работе с обычными видеокартами прикладные пакеты (DirectX и Open GL) используют такие комбинированные файлы.
Для наложения строки комбинированного файла надо внести небольшие дополнения в подпрограмму Aiphamix, описанную в примере 7.30. В начале внешнего цикла перед командой, имеющей метку mixed, надо вставить следующие две команды:
mov al, es:[si+3] ; а!=значение альфа для данной точки
mov byte ptr alpha, al ; сохраняем его в переменной alpha
Кроме того,, после обработки кода точки во внешнем цикле, например перед командой inc di, надо вставить команду inc si для пропуска байта, содержащего значение alpha.
Мы не будем обсуждать способ создания комбинированного файла, только отметим, что основная задала заключается в вычислении массива значений коэффициентов alpha. А добавить эти значения к кодам точек образа рисунка не составит особого труда.
Заключение.
Данный раздел завершает основную часть книги. В нем описаны далеко не все спецэффекты, применяемые в современной компьютерной графике. Выбраны только те из них, способы получения которых можно отнести к основам компьютерной графики. При реализации более сложных спецэффектов используются специфические объекты трехмерной графики — треугольники, текстуры и пр. Описание работы с такими объектами выходит за рамки данной книги. Как говорил небезызвестный Козьма Прутков: "Нельзя объять необъятное".