Direct3D - Простейшее приложение
Автор: Алексей
WEB-сайт: http://daddy.mirgames.ru
Чтобы создать, такое приложение нужны исходники библиотеки DirectX, найти их можно тут www.delphi-jedi.org (www.crazyentertainment.net)
Создание приложения, использующее Direct3D, желательно разбить на несколько частей. Так будет проще и удобнее, иначе можно запутаться и наделать кучу ошибок.
Разбиваем наше приложение на такие части:
- Инициализация.
- Загрузка вершин.
- Перерисовка окна.
- Освобождение памяти.
1.Инициализация
Direct3D состоит из множества COM объектов. И для инициализации нам нужно создать главный объект, а потом устройство главного объекта. Через главный объект мы не можем рисовать, через него мы можем только узнать возможности видео карты и создать устройство. А вот через устройство мы рисуем, текстурируем и т.д.
2. Загрузка вершин
Это важная часть нашей программы. Для того чтобы нарисовать треугольник нужно указать для него три вершины. А вершина задается тремя координатами в пространстве плюс можно добавить еще цвет, текстурные координаты, но об этом позже. Сейчас нам нужно заполнить массив, в котором будут храниться вершины. Для этого нам понадобится новый тип данных и константа для определения FVF(Flexible Vertex Format) флага вершин в Direct3D. Еще нужно создать COM объект вершинного буфера и заполнять вершины. По вершинам строятся примитивы.
На рисунке показаны все возможные примитивы и в каком порядке для них нужно заполнять вершины.
Тип и константа из примера:
type
TCUSTOMVERTEX = packed record
X, Y, Z: Single;
Color: DWORD;
end;
const
D3DFVF_CUSTOMVERTEX = D3DFVF_XYZ or D3DFVF_DIFFUSE;
При заполнении массива надо учитывать то что координаты X и Y не должны быть больше 1 и меньше –1, иначе вершина с такими координатами будет вне экрана.
3. Перерисовка окна
Здесь все довольно просто очищается экран потом рисуются все треугольники через функцию DrawPrimitive в которой надо задать какой примитив рисовать далее с какой вершины начинается он в вершинном буфере и какое количество этих примитивов. Рисовать желательно между вызовами функций BeginScene и EndScene. В конце нужно переключить буферы иначе ничего не увидим. Эти функции принадлежат объекту устроство.
4. Освобождение памяти.
Здесь все просто, в каждом созданном объекте есть функция _Release она удаляет объект и все. Главное в правильном порядке удалять объекты иначе будут ошибки по окончанию приложения.
И еще я в этом примере использовал стандартный компонент Delphi находящийся в разделе Additional. Его название ApplicationEvents. В нем я использовал только одно событие Onidle для перерисовки окна.
Хочу заметить что запускать программы использующие библиотеку Direct3D лучше отдельно от IDE через EXE'шник.
Не откомпилированный пример здесь
|