Россия, г. Кострома |
Полупрозрачность. Цветовой ключ. Буфер трафарета
Пример 3.
Эффект "перемножения" цветов примитивов можно получить с помощью формулы
FinalPixel = SourcePixelColor*0 + DestPixelColor*SourcePixelColor.
Значения коэффициентов смешивания выставим следующим образом:
SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ZERO ); SetRenderState( D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR );
Ниже показаны примеры подобного "умножения" цветов при различном фоне.
Прозрачность может "содержаться" и в вершинах примитивов. В дополнение к красной ( red ), зеленой ( green ) и синей ( blue ) цветовым составляющим, каждый пиксель может иметь "прозрачную" составляющую или так называемый альфа канал ( alpha channel ). Альфа канал имеет 256 уровней прозрачности, 0…255:
0 – пиксель полностью прозрачен
255 – пиксель полностью непрозрачен
128 – пиксель прозрачен наполовину.
До сих пор цвет мы определяли с помощью тройки чисел RGB, используя макрос-функцию D3DCOLOR_XRGB(). Для задания значения альфа составляющей вершины можно воспользоваться функцией D3DCOLOR_ARGB(a, r, g, b), где первый параметр определяет значение полупрозрачности. Следует заметить, что значение альфа канала (как и всех цветовых составляющих) приводится к диапазону значений [0…1]. Ниже приводится пример заполнения вершин примитивов данными о цвете со значением полупрозрачности 50 процентов.
C++ |
points[0].color = D3DCOLOR_ARGB( 128, 255, 0, 0 ); … |
Pascal |
points[0].color := D3DCOLOR_ARGB( 128, 255, 0, 0 ); … |
Использовать полупрозрачность в вершинах примитивов можно с помощью все той же формулы
FinalPixel = SourcePixelColor*SourceBlendFactor + +DestPixelColor*DestBlendFactor,
при этом задействовав константы смешивания с суффиксом ALPHA. Так, например, следующие установки коэффициентов смешивания
SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
преобразуют формулу к виду
FinalPixel = SourcePixelColor*(Alpha) + DestPixelColor*(1- Alpha),
где Alpha – значение альфа составляющей пикселя-источника.
В качестве примера разберем вывод одного полупрозрачного примитива на непрозрачном. Пусть имеется два треугольника, красный и синий, показанные ниже, причем первый из них не содержит значений полупрозрачности, а у второго все вершины имеют полупрозрачность – 50 процентов.
Последовательность вывода примитивов будет такой:
- Первым рисуется красный треугольник (полупрозрачность выключена);
- Включаем полупрозрачность: SetRenderState(D3DRS_ALPHABLENDENABLE, 1) ;
- Рисуем синий треугольник (в вершинах задана 50 % полупрозрачность);
В результате формула смешивания примет вид: FinalPixel = Синий*0.5 + Красный*(1-0.5).
Ниже приведены примеры вывода примитивов с различной степенью полупрозрачности.