Читаем Графика DirectX в Delphi полностью

function Draw2DTriangle (const inX, inY : Single) : HRESULT;

function TfrmD3D.Draw2DQuad (const inX, inY : Single) : HRESULT;

Поскольку точки в этом примере неподвижны, в первой из указанных функций производится только копирование содержимого массива vpoints в буфер вершин. Заканчивается она вызовом метода вывода точек:

Result:=FD3DDevice.DrawPrimitive(D3DPT_POINTLIST, 0, High (VPoints) + 1);

В оставшихся двух функциях перед заполнением буфера вычисляются координаты вершин фигур. Вот код функции, отображающей квадрат:

const

HalfPi = Pi / 2; // Небольшая оптимизация

function TfrmD3D.Draw2DQuad (const inX, inY : Single) : HRESULT;

var

pVertices : PByte;

hRet : HRESULT;

begin

with VQuad [0] do begin // Левый нижний угол квадрата

X := inX + Radius * cos (Angle / 2 - HalfPi);

Y := inY + Radius * sin (Angle / 2 - HalfPi);

end;

with VQuad [1] do begin // Левый верхний угол квадрата

X := inX + Radius * cos (Angle /2);

Y := inY + Radius * sin (Angle / 2);

end;

with VQuad [2] do begin // Правый нижний угол квадрата

X := inX + Radius * cos (Angle / 2 + Pi);

Y := inY + Radius * sin (Angle / 2 + Pi);

end;

with VQuad [3] do begin // Правый верхний угол квадрата

X := inX + Radius * cos (Angle / 2 + HalfPi);

Y := inY + Radius * sin (Angle / 2 + HalfPi);

end;

// Заполняем вершинный буфер данными о вершинах квадрата

hRet := FD3DVB.Lock(0, SizeOf(VQuad), pVertices, 0);

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

Move (VQuad, pVertices", SizeOf(VQuad));

hRet := FD3DVB.Unlock;

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

// Квадрат образован двумя связанными треугольниками

Result := FD3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

end;

При перерисовке кадра перед отображением квадрата включаем режим полупрозрачности, а после рисования треугольника его отключаем:

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) ;

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных