Построение отрезков. Спрайты и вывод текста и сцен в текстуру
Построение отрезков
Библиотека Direct3D имеет в своем составе средства для построения связных отрезков, которые кроме всего прочего имеют толщину и стиль. Для вывода подобных примитивов (линий) предусмотрен интерфейс ID3DXLine. Для начала необходимо объявить нужные переменные интерфейсного типа.
Создание объекта "линия" осуществляется с помощью вызова функции D3DXCreateLine, которая имеет два параметра: первый – указатель на устройство вывода, второй адрес переменной, в которую запишется результат.
Интерфейс 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 восстанавливает состояние устройства вывода в изначальное.
Наличие лидирующего символа подчеркивание у методов 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)); |
Ниже приведены примеры вывода отрезков с шириной.
Для устранения лестничного эффекта (алиасинга), возникающего при растеризации отрезков, расположенных под углом к горизонту, можно воспользоваться методом SetAntialias интерфейса ID3DXLine, который имеет один параметр булевского типа. Значение true указывает на включение режима антиалиасинга, false – выключение режима. Ниже приведен пример построения отрезка прямой с включенным режимом антиалиасинга и без него.
В силу того, что в двухмерной графике плоские кривые при выводе на растр представляются в виде аппроксимирующих ломаных линий (в виде последовательности небольших отрезков), то использование интерфейса ID3DXLine представляется простым и удобным способом отображения непрерывных двумерных примитивов. Ниже приводится пример построения элементарной кривой Безье третьего порядка путем кусочно-линейной аппроксимации с различной степенью точности. В данном случае точность определяется количеством ломаных линий ( N ), из которых строится кривая.