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

Двумерная графика с использованием Direct3D

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >

Графическая библиотека Direct3D

В данном курсе автором будут рассматриваться примеры работы библиотеки Direct3D с использованием языков программирования C++ (среда Microsoft Visual Studio) и Pascal (среда Delphi). Предполагается, что читатель уже установил и настроил все необходимые программные средства. Для успешной работы с графической библиотекой Direct3D в среде Microsoft Visual Studio необходимо установить набор Microsoft DirectX Software Development Kit, который можно скачать с сайта http://www.microsoft.com. Для пользователей, которые планируют разрабатывать подобные проекты на языке Pascal в среде, например, Delphi, требуется наличия в системе заголовочных файлов, найти которые можно по адресу http://www.clootie.ru. Кроме этого в системе должен присутствовать пакет библиотек DirectX End-User Runtimes. На момент написания этих строк в сети Интернет была доступна версия DirectX 9.0c с обновлениями за июнь 2006 года.

Непосредственно начало работы с библиотекой Direct3D должна начинаться с подключения заголовочных файлов к проектам.

В среде Microsoft Visual Studio подключение заголовочного файла Direct3D SDK проделывается следующим образом:

…
#include <d3d9.h>
…

В проектах на Delphi строчка подключения должна выглядеть так:

…
uses
  …, Direct3D9;
…

Кроме этого для проектов Visual Studio требуется еще подключить статическую библиотеку d3d9.lib. Это можно проделать либо указанием в настройках проекта, либо явно прописать в коде посредством директивы препроцессора:

#pragma comment  (lib, "d3d9.lib")

Следующий шаг заключается в объявлении указателя на главный интерфейс IDirect3D9 и указателя на интерфейс устройства.

В языке C++ эта строчка кода будет выглядеть следующим образом:

…
LPDIRECT3D9 direct3d = NULL;
LPDIRECT3DDEVICE9 device = NULL;
…

Для языка Pascal эти объявления можно записать так:

…
var
  direct3d: IDirect3D9;
  device: IDirect3DDevice9;
…

Вся работа начинается с создания главного объекта. Именно создание главного объекта Direct3D позволит осуществить доступ ко всем возможностям, предоставляемым его интерфейсами. Создание главного объекта – это вызов предусмотренной функции ( Direct3DCreate9 ) с единственным параметром ( D3D_SDK_VERSION ). D3D_SDK_VERSION – это предопределенная константа, описанная в заголовочном модуле ( d3d9.h или Direct3D9.pas ) и указывающая номер версии библиотеки DirectX. В этом можно убедиться, заглянув в справку помощи по DirectX.

D3D_SDK_VERSION
Версия DirectX Числовое значение константы
8.0 120
8.1 220
9.0 31
9.0a 31
9.0b 31
9.0c 32

В результате чего, указав необходимую версию D3D_SDK_VERSION, можно рассчитывать и на определенные возможности, поддерживаемые созданным объектом. Программная конструкция по созданию главного объекта Direct3D будет выглядеть следующим образом:

C++ direct3d = Direct3DCreate9( D3D_SDK_VERSION );
Pascal direct3d := Direct3DCreate9( D3D_SDK_VERSION );

После создания объекта Direct3D функция Direct3DCreate9() возвращает указатель на интерфейс либо пустое значение, если вызов произошел с ошибкой. Это может свидетельствовать о том, что на Вашем компьютере отсутствует библиотека DirectX.

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

Прежде чем разбираться с методом создания устройства вывода, необходимо понять, как устроен процесс рендеринга в библиотеке Direct3D и вывод результата на экран. При визуализации графических примитивов непосредственно в окно вывода, пользователь будет наблюдать заметное "мерцание" движущихся объектов, что не совсем пригодно для создания анимационных сцен. Решением этой проблемы является использование метода двойной буферизации вывода, когда создается временный образ (область в памяти), в который производится вывод всех графических операций, а затем он целиком отображается (копируется) в окно вывода. Именно так и работает графическая библиотека Direct3D. Весь процесс "отрисовки" или рендеринга происходит в так называемый BackBuffer (задний буфер). Все что Direct3D выводит на экран, рисуется (помещается) в BackBuffer, а затем копируется в первичный буфер ( FrontBuffer ). В терминологии DirectX буфер – это определенный кусок памяти, в котором лежит некоторая графическая или не совсем информация. В данном случае BackBuffer – это место в памяти видеоадаптера отведенное под данные, которые будут показаны на экран по требованию. При этом следует заметить, что формат переднего и заднего буферов должны совпадать, т.е. у них должны быть одинаковые размеры, количество цветов и т.д.

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >
Олег Корсак
Олег Корсак
Латвия, Рига
Ренат Файзуллин
Ренат Файзуллин
Россия, Казань