Ооратим ocoboe внимание на зависимость а от г и у. альфа-фактор изменяется от пиксела к пикселу. Сходные выражения имеют место для красного и синего компонентов.
Для того чтобы осуществить такой способ смешивания в программе, нужно сначала расширить ранее описанный класс RGBpixmap до класса RGBApixmap (см. упражнения в конце раздела), после чего добавить метод blendO, который выполняет наложение в цикле чтение - модификация-запись. Тогда смешивание пиксельных карт S и D можно будет выполнить с помощью следующего кода:
D.drawO:
//draw D opaquely, as usual
// рисуем D непрозрачной, как обычно
S.blendO:
//use alpha values in S: form a weighted average with D // используем альфа-факторы в S // формируем взвешенное среднее с D
В OpenGL содержатся средства, упрощающие реализацию подпрограммы blendO: нужно просто установить «режим наложения» («blend mode»), который определяет способ вычисления подпрограммой blendO «масштабного множителя источника» и «масштабного множителя адресата». Для того чтобы установить альфа-фактор источника в а, нужно просто выполнить команду
glBlendFunc(GL_SRC_ALPHA. GL_ONE_MINUS_SRC_ALPHA);
По этой команде масштабный множитель источника устанавливается равным альфа-фактору самого источника, а масштабный множитель адресата устанавливается равным единице минус альфа-фактор источника, что нам и нужно. В листинге 10.3 приведена простая реализация подпрограммы blendO.
Листинг 10.3. Смешивание изображений источника и адресата с помощью альфа-канала
void RGBApixmap :: blendO
g!В!endFunc(GL_SRC_ALPHA. GL_ONE_MINUS_SRC_ALPHA):
glEnable(GL_BLEND) : // enable blending // смешивание разрешено
drawO:
// draw this pixmap blended with the destination
// рисуем эту пиксельную карту,
// смешанную с пиксельной картой адресата
}
Пример 10.3.3. Имитация хроматического ключа (ChromaKey): придание прозрачности некоторым цветам Обычно в телевизоре мы видим синоптика, стоящего перед картой, на которой отмечены различные погодные условия. На самом деле синоптик стоит перед синим фоном (рис. 10.13, а) и одновременно показывается отдельная метеорологическая карта. Телевизионный сигнал «на лету» переключается между изображениями человека и карты: когда во время строковой развертки встречается синий цвет, то показывается карта; во всех остальных случаях показывается человек.