Программирование графических процессоров с использованием Direct3D и HLSL


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


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

C++ID3DXLine *line = NULL;
Pascalvar line: ID3DXLine;

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

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

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

C++D3DXVECTOR2 points[] = { (100.0f, 100.0f), (200.0f, 200.0f) };
Pascal varpoints: 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));
Pascalline.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


Содержание раздела