Delphi World - Direct3D - Индексный буфер
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Direct3D - Индексный буфер

Автор: Алексей
WEB-сайт: http://daddy.mirgames.ru

Всем привет!!! Сегодня мы разберемся с индексным буфером. И так индексный буфер – это буфер, хранящий индексы вершин в вершинном буфере. Он нужен для экономии памяти. Так же следует заметить, чтобы добиться максимального эффекта, у треугольников должно быть как можно больше общих вершин, иначе памяти будет расходоваться еще больше. Вот скажем надо вам нарисовать два треугольника, у которых две вершины общие. Для этого надо шесть вершин (в этом примере вершина занимает 20 байт) это 120 байт. Если при этом использовать индексный буфер, то понадобится 88 байт. И чем больше треугольников, тем больше экономится памяти.

Теперь разберем, как создавать и заполнять индексный буфер. Создается и заполняется индексный буфер аналогично вершинному буферу. Для начала опишем объект буфера и функцию по его инициализации:

IB : iDirect3DIndexBuffer8; 
function InitIndexBuffer : HResult; 

Вот и сама функция инициализации:

function TD3DFrm.InitIndexBuffer;
var
  HRet: HResult;
  PInds: PByte;
begin
  //Заполняем массив индексов
  Inds[0] := 0;
  Inds[1] := 1;
  Inds[2] := 2;
  Inds[3] := 0;
  Inds[4] := 2;
  Inds[5] := 3;
  Inds[6] := 4;
  Inds[7] := 5;
  Inds[8] := 6;
  Inds[9] := 4;
  Inds[10] := 6;
  Inds[11] := 7;
  Inds[12] := 8;
  Inds[13] := 9;
  Inds[14] := 10;
  Inds[15] := 8;
  Inds[16] := 10;
  Inds[17] := 11;
  Inds[18] := 12;
  Inds[19] := 13;
  Inds[20] := 14;
  Inds[21] := 12;
  Inds[22] := 14;
  Inds[23] := 15;
  Inds[24] := 16;
  Inds[25] := 17;
  Inds[26] := 18;
  Inds[27] := 16;
  Inds[28] := 18;
  Inds[29] := 19;
  Inds[30] := 20;
  Inds[31] := 21;
  Inds[32] := 22;
  Inds[33] := 20;
  Inds[34] := 22;
  Inds[35] := 23;

  //Создание индексного буфера
  HRet := D3DD.CreateIndexBuffer(SizeOf(Inds), //Размер в байтах
    D3DUSAGE_WRITEONLY, //Только запись
    D3DFMT_INDEX16, //Количество байт на один индексов
    D3DPOOL_DEFAULT, //Где храним индексы
    IB); //Объект индексного буфера

  if Failed(HRet) then
  begin
    CleanUp;
  end;

  //Запираем буфер
  HRet := IB.Lock(0, SizeOf(Inds), PInds, 0);
  if failed(HRet) then
  begin
    CleanUp;
  end;

  //Копируем индексы
  move(Inds, PInds^, SizeOf(Inds));

  //Отпираем
  HRet := IB.Unlock;
  if failed(HRet) then
  begin
    CleanUp;
  end;

  //Устанавливаем базовый индекс вершины
  Result := D3DD.SetIndices(IB, 0);
end;

Массив Inds хранит номера вершин в вершинном буфере. То есть теперь вершин стало меньше, а индексов столько, сколько должно было быть вершин раньше без индексного буфера. Также изменилась и функция вывода треугольников на экран. Теперь надо использовать:

D3DD.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, //Тип примитива
  0, //Минимальный индекс
  24, //Количество вершин
  0, //С какого индекса начинать рисовать
  12); //Количество примитивов

Вот и все что можно сказать, ну а чтобы было понятнее лучше скачать пример.

Не откомпилированный пример тут

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования