Наложение рисунков и спецэффекты
Вычисление значений alpha
Вам понадобится специальная программа, формирующая файл, содержащий значения alpha для каждой точки затуманиваемого изображения. Значения alpha зависят от расстояния (r[i]) между текущей точкой (i) и точкой принятой за начало отсчета (точкой наблюдения). В линейном двухмерном дискретном пространстве это расстояние вычисляется как квадратный корень из суммы квадратов приращений значений координат:
r[i] = sqrt { (x[i] – х[0])**2 + (y[i] – у[0])**2}
Здесь ** обозначают степень, sqrt – квадратный корень, х[0] и у [0] – значения координат в точке наблюдения, x[i] и y[i] – текущие значения координат.
В общем случае значения alpha описываются некоторой функцией (F), зависящей от расстояния, т.е. alpha [i] = F(r[i]). Независимо от природы функции F значения alpha равны нулю в точке наблюдения и увеличиваются по мере удаления от точки наблюдения, не превышая при этом значение 255 (которое принято за 1).
Советуем вам начать с простого случая, когда F является нормированной чинейной функцией, у которой за норму принято значение в максимально отдаленной точке, т. е. alpha [i] = <r[i] / max) *255. В результате получится файл, содержащий значения коэффициентов для тумана, плотность которого возрастает пропорционально расстоянию. Эксперименты с файлом позволят вам оценить степень соответствия линейной модели ожидаемым результатам.
Кривая чувствительности человеческого глаза к яркости света нелинейная, она близка к логарифмической зависимости. Поэтому для получения более правдоподобного эффекта обычно используют экспоненциальное изменение плотности тумана. В таких случаях значения alpha вычисляются так:
alpha[i] = exp (-k*r[i]> или alpha[i] = exp {-(k*r[i])**2)
Замечание
Программировать вычисление значений alpha на языке ассемблера вовсе не обязательно. Можно использовать любой удобный для вас язык. Главное, чтобы файл имел нужную структуру и содержание.
Выбор точки отсчета зависит от характера изображения, затягиваемого туманом. Например, если это фотография какого-то объекта, ландшафта и т. п., то точку наблюдения лучше совместить с точкой фотосъемки. Обычно для выбора окончательного варианта надо произвести несколько проб, подбирая точку отсчета, цвет и характер изменения плотности тумана.
Общий случай смешения
Затягивание туманом является частным случаем смешения двух изображений с переменными значениями 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. А добавить эти значения к кодам точек образа рисунка не составит особого труда.
Заключение
Данный раздел завершает основную часть книги. В нем описаны далеко не все спецэффекты, применяемые в современной компьютерной графике. Выбраны только те из них, способы получения которых можно отнести к основам компьютерной графики. При реализации более сложных спецэффектов используются специфические объекты трехмерной графики – треугольники, текстуры и пр. Описание работы с такими объектами выходит за рамки данной книги. Как говорил небезызвестный Козьма Прутков: "Нельзя объять необъятное".