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

// Устанавливаем режим 4-кратного размера точек

hRet := FDSDDevice.ApplyStateBiock (PointSize4);

// Рисуем вторую половину точек

hRet := FDSDDevice.DrawPrimitive(D3DPT_POINTLIST,

(MAXPOINTS div 2) - 1, MAXPOINTS div 2);

Надеюсь, что все понятно, лишь ограничусь небольшим замечанием. Разработчики рекомендуют вызывать метод ApplyStateBiock, как и все другие методы, влияющие на режим воспроизведения, при установленном состоянии воспроизведения.

Окрашенные вершины

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

В проекте каталога Ех13 экран заполняется хаотически расположенными разноцветными точками (рис. 7.6).





Запись формата вершин дополнилась полем, хранящим цвет вершины, тип ее DWORD:


type

TCUSTOMVERTEX = packed record

X, Y, Z, RHW : Single;

Color : DWORD; // Добавлено новое поле

end;


Поскольку FVF-флаг задается в нескольких местах кода, вводим пользовательскую константу, хранящую нужную нам комбинацию:


const

D3DFVF_COSTOMVERTEX = D3DFVF_XYZRHW or D3DFVF_DIFFUSE;

Порядок, в котором перечисляются эти константы, безразличен, но порядок перечисления полей в записи формата вершин предопределен графической системой. При считывании данных из потока будет подразумеваться, что первыми идут координаты вершин, за ними следует цвет (диффузная составляющая).

Итак, теперь прибавляется дополнительная константа, которую будем трактовать пока как включение режима окрашивания вершин примитивов.

При инициализации массива вершин поле цвета заполняется случайным значением:


for i := 0 to MAXPOINTS - 1 do

with VPoints [i] do begin

Z := 0.0;

RHW := 0.0;

Color := D3DCOLOR_XRGB(random (256), random (256), random (256));

end;


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

В следующем примере (проект каталога Ех14) окрашивание вершин используется для создания черно-белого изображения. Пример весьма занятный: из облака хаотически располагающихся точек выстраивается упорядоченный образ (рис. 7.7).





Изображение формируют 20 898 отдельных примитивов. Первоначально координаты их задаются хаотически, для каждой точки вычисляется шаг смещения. Текстовый файл содержит координаты окончательного положения точки. За 100 шагов каждая точка должна достичь финишного положения:


type

TStep = packed record // Тип для хранения скорости точки по осям

StepX, StepY : Single;

end;


var

Steps : Array [0..MAXPOINTS - 1] of TStep; // Шаги для каждой точки

function TfrmD3D.InitPoints : HRESULT;

var

pVertices : PByte;

hRet : HRESULT;

i : Integer;

t : TextFile;

wrkX, wrkY : Integer;

begin

AssignFile (t, 'points.txt');

Reset (t);

for i := 0 to MAXPOINTS - 1 do begin

ReadLn (t, wrkX, wrkY);

with VPoints [i] do begin

X := random (240);

Y := random (289) ;

// Каждая точка должна достичь своего положения за 100 шагов

Steps [i].StepX := (wrkX - X) / 100;

Steps [i].StepY := (wrkY - Y) / 100;

Z := 0.0;

RHW := 0.0;

Color := 0;

end;


end;


CloseFile (t);

...

Переменная Pointsize управляет текущим размером точки, первоначально ее значение установлено в 5.0. При перемещении точки размер ее последовательно уменьшается и через 100 шагов должен стать единичным:


function TfrmD3D.MovePoints : HRESULT;

var

pVertices : PByte; hRet : HRESULT;

i : Integer;

begin

PointSize := PointSize - 0.04; // Уменьшение размера точки.

FD3DDevice.SetRenderState( D3DRS_POINTSIZE, PDWORD(@PointSize)");

for i := 0 to MAXPOINTS - 1 do begin

with VPoints [i] do begin

X := X +- Steps [i].StepX; // Перемещение точки

Y := Y + Steps [i].StepY;

end;


end;


В цикле ожидания сообщения подсчитывается количество обновлений положения точек. Для их первой сотни вызывается функция MovePoints. Шоу можно повторить нажатием пробела:


procedure TfrmDSD.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if Key = VK_ESCAPE then Close else

if Key = VK_SPACE then begin

InitPoints; // Заново разбрасываем точки

PointSize := 5.0; // Размер точек снова пятикратный

Count := 0; // Очередная сотня кадров

end;


end;


Следующий пример, проект из каталога Ех15, построен по аналогичной схеме, но примитивы на секунду покрывают всю клиентскую часть окна, чтобы затем снова разлететься (рис. 7.8).





Для задания образа используется растровое изображение размером 200x146 пикселов, цвет каждого примитива определяется цветом пиксела растра:



const

MAXPOINTS = 200 * 146;

function Tf гтаОЗО.InitPoints : HRESULT;

var

pVertices : PByte;

hRet : HRESULT;

i, j, k : Integer;

bmp : TBitMap;

R, G, В : Byte;

begin

bmp := TBitMap.Create;

bmp.LoadFromFile ('Claudia.bmp'); // Загрузка растра

k := 0;

for i := 0 to 199 do

for j := 0 to 145 do begin

with VPoints [k] do begin

X := random (145);

Y := random (200);

Steps [i, j].StepX := (j - X) / 10;

Steps [i, j].StepY := (i - Y) / 10;

Z := 0.0;

// Цветовые веса пиксела растра

R := GetRValue (bmp.Canvas.Pixels [j, i]);

G := GetGValue (bmp.Canvas.Pixels [j, i]);

В := GetBValue (bmp.Canvas.Pixels [j, i]) ;

RHW := 0.0;

Color := D3DCOLOR__XRGB(R, G, B); // Цвет примитива

end;


Inc (k);

end;


bmp.Free ;

...

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

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

C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных
Adobe InDesign CS3
Adobe InDesign CS3

Книга посвящена верстке и макетированию в программе Adobe InDesign CS3. Помимо того что в ней описываются возможности программы, рассматриваются также принципы и традиции верстки, приводятся примеры решения типичных задач. Все это позволит читателю не только овладеть богатым инструментарием программы, но и грамотно применять его.Материал книги разделен на логические части: теоретические сведения, инструментарий программы, решение задач, – а также рассчитан на два уровня подготовки читателей – начинающих и опытных пользователей, что выгодно отличает книгу от других изданий. Это позволит применять ее как новичкам для знакомства с программой, так и пользователям со стажем для пополнения своих знаний.

Владимир Гавриилович Завгородний , Владимир Завгородний

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