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); //Количество примитивов
Вот и все что можно сказать, ну а чтобы было понятнее лучше скачать пример.
Не откомпилированный пример тут
|