Чтение онлайн

ЖАНРЫ

Графика DirectX в Delphi

Краснов Михаил

Шрифт:

function TfrmD3D.Render : HRESULT;

var

hRet : HRESULT;

begin

if FD3DDevice = nil then begin Result := E_FAIL;

Exit;

end;

// Очистка экрана и окрашивание его в черный цвет

hRet := FD3DDevice.Clear(0, nil, D3DCLEAR_TARGET, 0, 0.0, 0);

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;

hRet := FDSDDevice.BeginScene;

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;

//

Первыми рисуются точки фона

hRet := DrawPoints;

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;

// Включаем режим полупрозрачности

with FDSDDevice do begin

SetRenderState(D3DRS_ALPHABLENDENABLE, DWORD(True));

SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);

SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);

end;

// Полупрозрачный квадрат

hRet := Draw2DQuad (HalfScreenWidth, HalfScreenHeight);

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;

// Полупрозрачный треугольник

hRet := Draw2DTriangle (HalfScreenWidth, HalfScreenHeight);

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;

// Режим полупрозрачности больше не нужен

FDSDDevice.SetRenderState(D3DRS_ALPHABLENDENABLE, DWORD(False));

hRet := FDSDDevice.EndScene;

if FAILED(hRet) then begin

Result := hRet;

Exit ;

end;

Result := FDSDDevice.Present(nil, nil, 0, nil) ;

end;

Чтобы примитив оказался полупрозрачным, необходимо, во-первых, включить режим D3DRS_ALPHABLENDENABLE. Вторым аргументом для этого режима

задается преобразованная в DWORD (или cardinal) булева константа. Для простоты можно использовать просто нуль или единицу. И во-вторых, следует задать параметры источника и приемника. Для простейшего случая, когда все примитивы одинаково полупрозрачны, этим параметром назначается константа DSDBLEND ONE.

В случае одинаковой полупрозрачности примитивов достаточно задавать параметр приемника, значение для DSDRS^SRCBLEND по умолчанию установлено В D3DBLEND_ONE.

При включенном режиме ОЗОЕЗ_АЪРНАВЬЕЫОЕЫАВЬЕ примитивы как бы рисуются на кальке: в местах наложения листов кальки плотность цветовых компонентов увеличивается.

Для оптимизации сразу же после того, как нарисованы все полупрозрачные примитивы, режим полупрозрачности необходимо отключить.

Альфа-составляющая цвета

Рассмотренный в предыдущем разделе пример полупрозрачности является частным случаем работы с четвертой составляющей цвета, так называемым альфа-компонентом или альфа-составляющей цвета. Этот компонент позволяет регулировать степень прозрачности. По умолчанию установлено значение 255, т. е. примитивы совершенно не прозрачны. Нулевое значение имитирует полную прозрачность. Все промежуточные значения соответствуют градации прозрачности.

Рассмотрим простой пример на эту тему (проект каталога Ех02), где на фоне непрозрачного красного квадрата вращается сложная геометрическая композиция зеленого цвета, которую для простоты назовем звездой (рис. 8.2).

Звезда

сначала абсолютно прозрачна, но со временем становится плотнее. Цвета квадрата и звезды накладываются точно, образуя оттенки желтого, пока звезда не станет совершенно непрозрачной.

Вспомогательная переменная Alpha последовательно принимает значения от 0 до 255 и используется в функции рисования звезды, при задании цветовой составляющей вершин:

for i := 0 to High (VStar) do

VStar [i].Color := D3DCOLOR_ARGB(Alpha, 0, 255, 0) ;

Обратите внимание, что теперь для задания цвета вершины используется функция D3DCOLOR_ARGB, аргументом которой является четверка чисел. Первый аргумент - значение альфа-компонента.

При перерисовке кадра режим альфа-смешения устанавливается только на время работы функции рисования звезды из соображений оптимальности:

with FDSDDevice do begin

SetRenderState(D3DRS_ALPHABLENDENABLE, DWORD(True));

SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);

SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

end;

hRet := DrawStar; if FAILED(hRet) then begin

Result := hRet;

Exit; end; FDSDDevice.SetRenderState(D3DRS_ALPHABLENDENABLE, DWORD (False));

Для режима регулируемой прозрачности значение степени прозрачности источника определяется текущим значением альфа-составляющей цвета вершин. Режиму соответствует константа D3DBLEND_SRCALPHA. В данном режиме каждый чистый цвет источника имеет коэффициент прозрачности, равный значению альфа-составляющей. Для режима смешения цветов режим приемника задается константой DSDBLEND^NVSRCALPHA так, что суммарно получается единица - итоговый пиксел совершенно непрозрачный:

* D3DBLEND__SRCALPHA: коэффициент смешения (Aj, AS, As, AS); D3DBLEND_INVSRCALPHA: Коэффициент смешения (1-Aj, 1~ AS, 1-AS, 1~AS).

He путайте с весом цвета, речь идет о прозрачности каждого цветового компонента.

Совсем необязательно, чтобы все вершины, образующие примитив, имели одинаковое значение альфа-компонента. Варьируя альфа-составляющую, можно добиваться эффекта градиентной прозрачности примитива. В качестве примера использования такого эффекта я приготовил проект каталога Ех03- полноэкранное приложение, в котором при каждом щелчке кнопки мыши на экране расплываются красивые полупрозрачные пятна.

Для манипуляций с пятнами использую концепцию ООП:

type

TRGB = packed record // Запись тройки цветов

R, G, В : Byte;

end;

TDrip = class // Класс отдельного пятна

PosX, PosY : Integer; // Координаты на экране

Ring_Color : TRGB; // Цвет пятна

Ring_Radius : Integer; // Текущий радиус пятна

end;

const

Level =36; // Уровень разбиения круга

Max Drips = 120; // Максимум присутствия пятен в окне

Поделиться с друзьями: