Опубликован: 08.07.2007 | Доступ: свободный | Студентов: 1431 / 183 | Оценка: 4.43 / 4.02 | Длительность: 13:47:00
Специальности: Программист
Лекция 4:

Полупрозрачность. Цветовой ключ. Буфер трафарета

< Лекция 3 || Лекция 4: 12345 || Лекция 5 >

Пример 3.

Эффект "перемножения" цветов примитивов можно получить с помощью формулы

FinalPixel = SourcePixelColor*0 + DestPixelColor*SourcePixelColor.

Значения коэффициентов смешивания выставим следующим образом:

SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ZERO );
SetRenderState( D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR );

Ниже показаны примеры подобного "умножения" цветов при различном фоне.



цвет фона D3DCOLOR_XRGB(0,0,0) цвет фона D3DCOLOR_XRGB(255,255,255)

Прозрачность может "содержаться" и в вершинах примитивов. В дополнение к красной ( 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 процентов.



D3DCOLOR_XRGB(255,0,0); D3DCOLOR_ARGB(128,0,0,255);

Последовательность вывода примитивов будет такой:

  1. Первым рисуется красный треугольник (полупрозрачность выключена);
  2. Включаем полупрозрачность: SetRenderState(D3DRS_ALPHABLENDENABLE, 1) ;
  3. Рисуем синий треугольник (в вершинах задана 50 % полупрозрачность);

В результате формула смешивания примет вид: FinalPixel = Синий*0.5 + Красный*(1-0.5).


Ниже приведены примеры вывода примитивов с различной степенью полупрозрачности.




ARGB = (32,0,0,255) ARGB = (64,0,0,255) ARGB = (128,0,0,255)



ARGB = (160,0,0,255) ARGB = (192,0,0,255) ARGB(255,0,0,255)
< Лекция 3 || Лекция 4: 12345 || Лекция 5 >