Наложение рисунков и спецэффекты
Видеорежимы direct color позволяют решать задачи, постановка которых при работе в режимах PPG была просто невозможна. К ним относится, например, получение различного рода спецэффектов, за счет манипуляций с цветами отдельных точек изображения. В данном разделе описаны способы получения некоторых спецэффектов, широко применяемых в трехмерной графике (3D-графика).
При реализации спецэффектов, как правило, выполняется большой объем арифметических операций, что существенно замедляет процесс получения результата. Поэтому в современной графике арифметические операции либо выполняются с помощью новых команд ммх, появившихся у процессоров Pentium, либо используются акселераторы, выполняющие соответствующие вычисления на аппаратном уровне. Основные графические пакеты поддерживают как программный, так и аппаратный способы вычислений, направленных на достижение нужного спецэффекта.
При выборе конкретного спецэффекта важно знать суть выполняемых преобразований изображения, а конкретный способ реализации зависит от аппаратных и программных средств, имеющихся в вашем распоряжении. Поэтому мы рассмотрим программирование спецэффектов с применением обычных команд микропроцессора и простых видеокарт.
Спрайты (Sprites)
В дословном переводе с английского слово "Sprite" означает "фея" или "эльф". В литературе по программированию этот термин обозначает небольшой перемещаемый рисунок, при воспроизведении которого окружающий его фон делается прозрачным. Определение спрайта достаточно расплывчато, ему соответствуют, например, рисунки курсоров и пиктограмм, но фактически имеется в виду более широкий класс рисунков, при построении которых производится динамическое формирование маски.
Для того чтобы перемещение не портило исходную картинку на экране, надо сохранять исходный фон перед построением и восстанавливать его перед удалением спрайта. Способы сохранения и восстановления фона на месте перемещаемого рисунка мы обсуждали при описании вывода информационных строк и работы с курсором. Здесь нас будет интересовать вопрос о том, как получается прозрачный фон при построении спрайта.
Уточним, о каком фоне идет речь. Образ рисунка всегда занимает прямоугольную область, в которой основное изображение может быть окружено фоном, не имеющим прямого отношения к рисунку. При описании работы с курсором (см. Главу 6) говорилось, что одним из способов удаления ненужного фона является маскировка. Например, в файлах, содержащих образы рисунков курсоров и пиктограмм, обязательно находится маска, указывающая, какую часть образа рисунка не надо показывать на экране.
При выводе спрайта на экране получается тот же эффект, что и при наложении маски, но достигается он другим способом. Для этого специально оговаривается, что маскируемый фон должен иметь черный цвет. Если такое соглашение выполнено, то маска не нужна, она формируется программно при построении рисунка. В описании команд ммх, распространяемом фирмой Intel, приводится пример маскировки черного фона с использованием этих команд. Перевод описания на русский язык опубликован в книге.
Фильтрация цвета (Chroma Keying)
Преобразование черного цвета в прозрачный является частным случаем фильтрации цвета, которая широко применяется в 3D-графике. В новой рекламе технологии ммх, появившейся в связи с выпуском процессора Pentium 3, приводится пример построения изображения с фильтрацией зеленого цвета.
В отличие от построения спрайта при фильтрации решается более общая задача – исключение однородного фона независимо от его цвета. В обоих случаях исключаемый цвет не должен использоваться в, основной части рисунка, в противном случае в ней появятся точки с цветом точек подложки, на которую накладывается рисунок.
Для того чтобы цвет с заданным кодом оказался прозрачным, его надо просто не записывать в видеопамять. Это и делает приведенная в примере 7.29 подпрограмма, выполняющая построение строки формата bgr с фильтрацией цвета. Она отфильтровывает цвет, код которого указан в переменной bkgrcod. Эта 32-разрядная переменная должна быть описана в разделе данных задачи. Рабочий видеорежим True Color.
Перед вызовом входные параметры задаются так же, как для всех описанных подпрограмм построения строки (drawline). В регистрах fs:si указывается адрес начала строки в оперативной памяти, в di – адрес ее начала в видеопамяти, в сх – количество точек в строке. Как обычно, должно быть установлено окно видеопамяти, которому принадлежит адрес точки начала строки, а в регистре es должен находиться код видеосегмента.
Пример 7.29. Фильтрация цвета строки формата bgr, режим True Color.
sprline: lods word ptr fs: [si]; ax = коды синего и зеленого цвета push ax; сохраняем ах в стеке lods byte ptr fs:[si]; al = код красного цвета xor ah, ah; очищаем резервный байт shl eax, 16; сдвиг ах в старшую половину еах pop ax; восстанавливаем ах из стека cmp eax, bkgrcod это фильтруемый цвет? je Ысо! › да, обходим запись нового кода mov es:[di], eax нет, записываем код в видеопамять blcol: add di, bytppnt корректируем адрес видеопамяти jnz @F › адрес в пределах окна call NxtWin установка следующего окна @@: loop splint управление повторами цикла ret возврат из подпрограммы