Домашняя страница Урок1 - Инициализация Direct3D Урок2 - Очистка памяти Урок3 - Функция воспроизведения Урок4 - Примитивы Урок5 - Точки Урок6 - Отрезки Урок7 - Треугольники Ссылки

Урок1 - Инициализация Direct3D

Начнем наш путь с простейшего примера - клиентская часть окна будет окрашиваться синим цветом. Это минимальное приложение, использующее Direct3D. Окно непрерывно перерисовывается, а в его заголовке выводится значение FPS (Frames Per Second).

Прежде всего, заметим, что в список uses вписан модуль DirectXGraphics. Это базовый модуль, который будет использоваться во всех ваших дальнейших программах. В этом модуле содержится описание базовых интерфейсов, типов и констант.

Теперь рассмотрим, что включает в себя инициализация графической системы:


function TfrmD3D.InitD3D : HRESULT;
var
  d3ddm : TD3DDISPLAYMODE;
  d3dpp : TD3DPRESENT_PARAMETERS;
  hRet : HRESULT;
begin
  FD3D := nil;
  FD3DDevice := nil;

  FD3D := Direct3DCreate8(D3D_SDK_VERSION);
  if FD3D = nil then begin
     Result := E_FAIL;
     Exit;
  end;

  hRet := FD3D.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, d3ddm);
  if FAILED(hRet) then begin
     Result := hRet;
     Exit;
  end;

  ZeroMemory(@d3dpp, SizeOf(d3dpp));
  with d3dpp do begin
       Windowed := True;
       SwapEffect := D3DSWAPEFFECT_DISCARD;
       BackBufferFormat := d3ddm.Format;
  end;

  Result := FD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Handle,
                              D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                              d3dpp, FD3DDevice);
end;

Сразу обратим внимание на объекты FD3D и FD3DDevice. FD3D является главным интерфейсом D3D. По сути это COM-объект класса IDIRECT3D8, его методы позволяют получить доступ ко всем методам и объектам рассматриваемой библиотеки. Для создания главного объекта используется функция Direct3DCreate8. Эта функция имеет единственный аргумент - константа, сообщающая системе, какая версия DirectX SDK использовалась при компиляции приложения. Обратите внимание, что перед вызовом функции FD3D необходимо обнулить.

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

Методы главного объекта позволяют узнать текущие установки видеосистемы. Далее в примере мы вызываем метод GetAdapterDisplayMode. Данный метод имеет два параметра: первый - константа, задающая адаптер для которого запрашиваются установки, а второй - указатель на вспомогательную переменную(d3ddm), в которую помещается результат нашего запроса. В примере используется константа D3DADAPTER_DEFAULT - это нулевая константа, соответствующая первичному устройству (т.е. в нашем случае - видеорежиму рабочего стола Windows). Замечу, что вызов этого метода является необходимым только для создания оконных приложений, поскольку такие установки требуются для задания параметров заднего буфера.

На следующем шаге работы заполняются поля структуры типа TD3DPRESENT_PARAMETERS. Здесь выполняются только действия, необходимые для работы приложения. Поле Windowed задает тип приложения: оконное или полноэкранное. Значение True задает оконный режим работы. В поле SwapEffect заносится константа, задающая порядок работы с задним буфером. Константа D3DSWAPEFFECT_DISCARD соответствует режиму, при котором DirectX не заботится о сохранности содержимого заднего буфера при циклическом переключении страниц. Поле BackBufferFormat используется для задания формата пиксела для заднего буфера. Обратите внимание, что здесь используется значение, полученное на предыдущем шаге работы.

Последним действием инициализации графической системы является создание объекта устройства. В нашем примере это COM-объект класса IDIRECT3DDEVICE8. Для его создания используется метод CreateDevice главного объекта. У метода шесть аргументов. Первым является устройство вывода, используемая здесь константа нам уже знакома. Константа D3DDEVTYPE_HAL задает тип воспроизведения при котором используется аппаратное ускорение. Использование других констант возможно, но скорость работы будет настолько низкой, что пользователи вряд ли останутся удовлетворенными. Третий аргумент является идентификатором окна на которое осуществляется графический вывод. Мы здесь используем свойство handle формы приложения. Четвертый аргумент - константа, задающая режим работы с вершинами. Используемая нами константа D3DCREATE_SOFTWARE_VERTEXPROCESSING соответствует режиму при котором вершины обрабатываются центральным процессором (а не ускорителем). Это делается для того, чтобы наши приложения работали со всех графических картах. Пятый аргумент нам также уже знаком, мы передаем заполненную нами выше структуру. И, наконец, последний шестой аргумент собственно формируемый объект. С помощью его методов и производятся воспроизведение и модификация изображения.

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

procedure TfrmD3D.FormCreate(Sender: TObject); var hRet : HRESULT; begin hRet := InitD3D; if Failed (hRet) then ErrorOut ('InitD3D', hRet); end;


Следующий урок - Очистка памяти