Ооратим 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, а) и одновременно показывается отдельная метеорологическая карта. Телевизионный сигнал «на лету» переключается между изображениями человека и карты: когда во время строковой развертки встречается синий цвет, то показывается карта; во всех остальных случаях показывается человек.


⇐ Предыдущая| |Следующая ⇒