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

Урок4 - Примитивы

Рисование в Direct3D осуществляется с помощью примитивов. Под этим термином следуют понимать простую фигуру. Базовыми примитивами являются точка, отрезок и треугольник.

Каждый примитив задается набором вершин. Для их хранения предназначен буфер вершин (vertex buffer). Фактически, буфер вершин - это область памяти, которой управляет Direct3D. Наша задача занести в него информацию о примитиве или примитивах, которые могут являться частью сложной фигуры и тогда мы сможем легко вывести объект на экран. Данные о каждой вершине должны храниться строго определенным образом, в соответствии с одним из стандартных форматов. Выяснив требуемый формат клиент должен уведомить об этом графическую систему. Это делается с помощью набора флагов FVF (Flexible Vertex Format, гибкий формат вершин). FVF флаг содержит перечисление компонент, которые входят в формат вершины из некоторого набора. Сразу оговоримся, что формат вершины может содержать не только геометрические координаты точки вершины, но и многие другие компоненты. В частности цветовую или диффузную составляющую, нормаль в данной вершине и текстурные координаты.

Для манипуляции с вершинами в Direct3D предназначен особый механизм, называемый вершинным шейдером (vertex shader). После того как буферы вершин заполнены, объект устройства создает шейдер вершин, заполняемый данными буфера.

Попробуем посмотреть, как все это осуществляется, с помощью простейшего примера, в котором посередине окна рисуется точка.

Чтобы отобразить точку на плоскости, нам достаточно задать две ее координаты, но мы должны придерживаться правила об использовании форматов вершин из определяемого набора. Минимальный набор характеристик вершины включает в себя три координаты вершины в пространстве и дополнительную характеристику, называемую RHW (Reciprocal Homogeneous W). Эта четвертая величина может выполнять различную роль. В графике четвертый компонент координаты точки называется W-координатой и предназначен для осуществления проекции точки на плоскость экрана. Мы будем задавать его значение единичным.

Формат описания вершины вводится клиентом; все аттрибуты должны быть типа Single:


type
  TCUSTOMVERTEX = packed record
    X, Y, Z, RHW : Single;
  end;

Переменная VPoint этого типа введена в программе для хранения характеристик нашей точки. Также нам требуется объект буфера вершин:


FD3DVB          : IDIRECT3DVERTEXBUFFER8;

По окончании работы программы с ним производятся обычные манипуляции, связанные с высвобождением памяти, а создается этот объект вызовом специального метода объекта устройства в отдельной функции инициализации:


function TfrmD3D.InitPoint : HRESULT;
var
  pVertices : PByte;
  hRet : HRESULT;
begin
  with VPoint do begin
       X := 150.0;
       Y := 150.0;
       Z := 0.0;
       RHW := 0.0;
  end;

  hRet := FD3DDevice.CreateVertexBuffer(SizeOf(VPoint),
                                        D3DUSAGE_WRITEONLY, D3DFVF_XYZRHW,
                                        D3DPOOL_DEFAULT, FD3DVB);
  if Failed (hRet) then begin
     Result := hRet;
     Exit;
  end;

  hRet := FD3DVB.Lock(0, SizeOf(VPoint), pVertices, 0);
  if Failed (hRet) then begin
     Result := hRet;
     Exit;
  end;

  Move (VPoint, pVertices^, SizeOf(VPoint));

  hRet := FD3DVB.Unlock;
  if Failed (hRet) then begin
     Result := hRet;
     Exit;
  end;

  hRet := FD3DDevice.SetStreamSource(0, FD3DVB, SizeOf(TCUSTOMVERTEX));
  if Failed (hRet) then begin
     Result := hRet;
     Exit;
  end;

  Result := FD3DDevice.SetVertexShader(D3DFVF_XYZRHW);
end;

Результат работы нашей программы должен выглядеть следующим образом:

Пример использования примитива 'точка'


Полный исходный текст примера (ex2.pas, 5Kb)
Откомпилированное приложение (example2.zip, 167Kb)

Следующий урок - Точки