Спонсор: Microsoft
Опубликован: 08.07.2007 | Доступ: свободный | Студентов: 1360 / 139 | Оценка: 4.43 / 4.02 | Длительность: 13:47:00
Специальности: Программист
Лекция 5:

Построение отрезков. Спрайты и вывод текста и сцен в текстуру

< Лекция 4 || Лекция 5: 123 || Лекция 6 >
Аннотация: В данной лекции рассматриваются примеры построения отрезков с помощью графической библиотеки Direct3D, применение спрайтов и вывод текста и сцен в текстуру. Рассмотрены методы улучшения качества и облегчения построений, а также приведены способы реализации с помощью C++ и Pascal.

Построение отрезков

Библиотека Direct3D имеет в своем составе средства для построения связных отрезков, которые кроме всего прочего имеют толщину и стиль. Для вывода подобных примитивов (линий) предусмотрен интерфейс ID3DXLine. Для начала необходимо объявить нужные переменные интерфейсного типа.

C++ ID3DXLine *line = NULL;
Pascal var line: ID3DXLine;

Создание объекта "линия" осуществляется с помощью вызова функции D3DXCreateLine, которая имеет два параметра: первый – указатель на устройство вывода, второй адрес переменной, в которую запишется результат.

C++ D3DXCreateLine(&device, &line);
Pascal D3DXCreateLine(device, line);

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

C++ D3DXVECTOR2 points[] = { (100.0f, 100.0f), (200.0f, 200.0f) };
Pascal var points: array[0..1] of TD3DXVector2 = ( (x:100; y:100), (x:200; y:200) );

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

Непосредственный вывод отрезка заключается в вызове метода Draw интерфейса ID3DXLine. Данный метод имеет три параметра: первый – указатель на массив точек, второй аргумент определяет их количество, а третий – цвет выводимой линии.

C++ line->Draw(points, 2, D3DCOLOR_XRGB(255,255,0));
Pascal line.Draw(@points, 2, D3DCOLOR_XRGB(255,255,0));

Принято вызов Draw обрамлять вызовами методов Begin и End до и после соответственно.

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

C++
line->Begin();
line->Draw(…);
line->End();
Pascal
line._Begin;
line.Draw(…);
line._End;

Наличие лидирующего символа подчеркивание у методов Begin и End в синтаксисе Паскаля обусловлено тем, что они являются ключевыми словами в данном языке.

Для установки нужной ширины рисуемой линии интерфейс ID3DXLine обладает методом SetWidth(), в качестве параметра которому передается значение ширины линии в пикселях. Например, вывод отрезка прямой линии толщиной 5 пикселей осуществляется с помощью такого кода:

C++
…
line->SetWidth(5.0f);
line->Draw(points, 2, D3DCOLOR_XRGB(255,255,0));
Pascal
…
line.SetWidth(5);
line.Draw(@points, 2, D3DCOLOR_XRGB(255,255,0));

Ниже приведены примеры вывода отрезков с шириной.



line->SetWidth(1.0f); line->SetWidth(3.0f);


line->SetWidth(5.0f); line->SetWidth(10.0f);

Для устранения лестничного эффекта (алиасинга), возникающего при растеризации отрезков, расположенных под углом к горизонту, можно воспользоваться методом SetAntialias интерфейса ID3DXLine, который имеет один параметр булевского типа. Значение true указывает на включение режима антиалиасинга, false – выключение режима. Ниже приведен пример построения отрезка прямой с включенным режимом антиалиасинга и без него.


line->SetAntialias(false);

line->SetAntialias(true);

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

N=4

N=5

N=7

N=10

N=20

< Лекция 4 || Лекция 5: 123 || Лекция 6 >
Олег Корсак
Олег Корсак
Латвия, Рига
Ренат Файзуллин
Ренат Файзуллин
Россия, Казань