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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

const

D3DFVF CUSTOMVERTEX = D3DFVF XYZ;

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

function TfrmD3D.InitVB : HRESULT;

const

Pi2 = 2 * Pi; // Для сокращения числа операций

var

Vertices : ^TCustomVertex; // Указатель на запись вершины

i, j, k : Byte;

hRet : HRESULT;

begin

numPoints := random (7) + 3; // Генерация количества узлов

k := 0; // Подсчет количества отрезков, образующих узор

for i := 1 to numPoints do

for j := i + 1 to numPoints do begin Inc(k);

end;

numbines := k; // Используется в DrawPrimitive

// Создание буфера вершин нужного размера

hRet := FD3DDevice.CreateVertexBuffer(2 * k * SizeOf(TCustomVertex), 0,

D3DFVF__CUSTOMVERTEX, D3DPOOL_DEFAULT, FD3DVB) ;

if Failed(hRet) then begin

Result := hRet; Expend;

// Заполнение буфера

hRet := FD3DVB.Lock(0,2 * k * SizeOf(TCustomVertex), PByte(Vertices), 0);

if Failed(hRet) then begin

Result := hRet;

Exit;

end;

// Перебор точек узлов

for i := 1 to numPoints do

for j := i + 1 to numPoints do begin

// Начало отрезка, точка на окружности радиусом 0.5

Vertices.X := 0.5 * cos(Pi2 * i / numPoints);

Vertices.Y := 0.5 * sin(Pi2 * i / numPoints);

Vertices.Z := 0;

Inc(Vertices); // Сдвигаем указатель

// Конец отрезка

Vertices.X :=. 0.5 * cos(Pi2 * j / numPoints);

Vertices.Y := 0.5 * sin(Pi2 * j / numPoints);

Vertices.Z := 0; Inc(Vertices);

end;

hRet := FD3DVB.Unlock;

if Failed(hRet) then begin

Result := hRet;

Exit;

end;

// Заново устанавливаем поток

hRet := FDSDDevice.SetStreamSource(0, FD3DVB, SizeOf(TCUSTOMVERTEX));

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

// Задаем вершинный шейдер

Result := FDSDDevice.SetVertexShader(D3DFVF_CUSTOMVERTEX);

end;

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

Беспрерывным созданием буфера вершин лучше не злоупотреблять и использовать только в случае крайней необходимости, иначе работа приложения может оказаться неустойчивой.

Теперь мы можем выяснить одну, очень важную для нас особенность использования флага D3DFVF_XYZ. Приведите код функции InitVB к следующему виду:

function TfrmDSD.InitVB : HRESULT;

var

Vertices : ^TCustomVertex;

hRet : HRESULT;

begin

hRet := FD3DDevice.CreateVertexBuffer(3 * SizeOf(TCustomVertex), 0,

D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT, FD3DVB);

if Failed(hRet) then begin

Result := hRet;

Exit;

end;

hRet := FD3DVB.Lock(0, 3 * SizeOf(TCustomVertex), PByte(Vertices), 0);

if Failed(hRet) then begin

Result := hRet;

Exit ;

end;

Vertices.X =0.0;

Vertices.Y = 0.0;

Vertices.Z = 0;

Inc(Vertices);

Vertices.X = 0.0;

Vertices.Y = 0.5;

Vertices.Z = 0;

Inc(Vertices) ;

Vertices.X =0.5;

Vertices.Y = 0.5;

Vertices.Z =0;

hRet := FD3DVB.Unlock;

if Failed(hRet) then begin

Result := hRet;

Exit;

end;

hRet := FD3DDevice.SetStreamSource(0, FD3DVB, SizeOf(TCUSTOMVERTEX));

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

Result := FDSDDevice.SetVertexShader(D3DFVF_CUSTOMVERTEX);

end;

Таким образом, буфер вершин всегда заполняется данными о трех вершинах. Построим один треугольник. Для этого подправьте аргументы метода воспроизведения примитивов:

hRet := FD3DDevice.DrawPrimitive(D3DPT_TRIANGLELIST, О, 1);

Запустите программу и посмотрите результат: выводится один треугольник. Ничего особенного, но теперь поменяйте координаты первой и второй вершины треугольника и снова запустите программу. Экран станет чистым, ничего теперь воспроизводиться не будет. Ошибок нет. Просто для этого режима очень важен порядок перечисления вершин треугольников. Он задает сторону примитива, которую мы наблюдаем: лицевую или изнаночную. Для лицевой стороны вершины перечисляются по часовой стрелке. Поскольку в первом случае вершины треугольника задавались именно в таком порядке, зрителю видна передняя сторона треугольника. Когда мы переставили вершины, треугольник повернулся к нам своей тыльной стороной, а задние стороны треугольников по умолчанию не воспроизводятся. Поэтому мы не получили никакого результата.

Чтобы отключить режим отсечения задних сторон треугольников, можете вставить в код функции Render следующую строку:

FD3DDevice.SetRenderState(D3DRS CULLMODE, D3DCULL NONE);

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

Текстура

Теперь нам предстоит изучить одну из важнейших тем - использование растровых образов. В Direct3D имеется несколько типов (стилей) текстур. Мы изучим текстуру, подобную наклеиваемым обоям.

Как всегда, для изучения нового понятия нам потребуется познакомиться с новыми типами объектов и интерфейсов. И как обычно для этой книги, знакомство осуществим на конкретном примере. Сейчас им послужит проект каталога Ех06. Работа примера очень проста: на экране выводится содержимое растрового файла - картинка с изображением дискеты (рис. 8.5).

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

Интервал:

Закладка:

Сделать

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

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


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

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

x