Михаил Краснов - Графика DirectX в Delphi

Здесь есть возможность читать онлайн «Михаил Краснов - Графика DirectX в Delphi» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Графика DirectX в Delphi: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Графика DirectX в Delphi»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Графика DirectX в Delphi — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Графика DirectX в Delphi», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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

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

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 отдельных примитивов Первоначально координаты их - фото 52

Изображение формируют 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 - фото 53

Для задания образа используется растровое изображение размером 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 ;

...

Приращения по координатам задаются так, чтобы за 10 шагов точка добралась до финиша. В этом примере точки, достигнув нужного положения, продолжают двигаться дальше, таким образом, что заветная картинка появляется только на миг. Через каждые 20 кадров направление движения точки меняется на противоположное:

var

Steps : Array [0..199, 0..145] of TStep;

procedure TfrmD3D.ApplicationEventslIdle(Sender: TObject;

var Done: Boolean);

var

hRet : HRESULT;

i, j : Integer;

begin

if FActive then begin

Inc (Frames);

hRet := Render;

if FAILED(hRet) then begin

FActive := False;

ErrorOut ('Render', hRet);

Exit;

end;

ThisTickCount := GetTickCount;

if ThisTickCount - LastTickCount > 25 then begin Caption := Format('%6.2f ,

[frames * 1000 / (ThisTickCount - LastTickCount)]);

Frames := 0; Inc (Count);

// Цикл движения точек в 20 кадров

if Count <= 20 then MovePoints else begin

for i := 0 to 199 do

for j := 0 to 145 do begin

Steps [i, jJ.StepX := -Steps [i, j].StepX;

Steps [i, jJ.StepY := -Steps [i, jj.StepY;

end;

Count := 0;

end;

end;

LastTickCount := GetTickCount;

end;

Done := False;

end;

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

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Графика DirectX в Delphi»

Представляем Вашему вниманию похожие книги на «Графика DirectX в Delphi» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Графика DirectX в Delphi»

Обсуждение, отзывы о книге «Графика DirectX в Delphi» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x