Индексные буферы (Index buffers) в Direct3D

Индексные буферы (Index buffers) в Direct3D

Сегодня у нас небольшая ипростая тема индексные буферы. В прошлом уроке было упражнение, вкотором вы должны были построить куб. Особо наблюдательные могли заметить, что дляэтого нужно было запихать ввершинный буфер координаты 36 вершин.

Но, каквы возможно знаете, вкубе всего 8 вершин. Используя вершинный буфер пришлось определять 36.

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

Виндексном же буффере хранится, какбы это сказать, порядок (номераиндексы) вершин втреугольниках. Длясоздания индексного буфера предназначен метод idirect3ddevice9createindexbuffer длина буфера вбайтах.

Usage используется также каки ввершинном буфере. Format формат индексов, или подругому размер каждого индекса.

Дляхранения индексов мы будем использовать тип unsigned short (16 бит), поэтому аргумент будет принимать значение d3dfmtindex16. Pool используется также, каки ввершинном буфере. Ppindexbuffer адрес указателя наиндексный буфер.

Psharedhandle параметр используется только вwindows vista. Всегда будем передавать null. Для индексных буферов поаналогии сidirect3dvertexbuffer9 используется свой интерфейс idirect3dindexbuffer9.

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

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

Далее, создам данные длябуферов впервом информация овершинах, во втором индексы этих вершин втреугольниках модели. Определение структуры vertex спрошлого выпуска неизменилось здесь определены четыре вершины вмассиве vertices.

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

Д. В индексном буфере указываются номера элементов извершинного буфера 0, 1, 2, 1, 3, 2.

Т. Е. Первый треугольник будет построен изэлементов vertices0, vertices1, vertices2.

Второй треугольник будет построен извершин vertices1, vertices3, vertices2. Насколько мы помним, дальше нужно указать гибкий формат вершин (fvf) ипривязать вершинный буфер кпотоку данных. Это выполняется двумя методами устройства setfvf иsetstreamsource.

Вэтот раз нам понадобится ещ один метод setindices, который говорит устройству (видеокарте) адрес индексного буфера. Единственный параметр данного метода указатель наиндексный буфер.

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

Водном изследующих уроков мы познакомимся ис другими типами примитивов. Basevertexindex смещение ввершинном буфере.

Значение аргумента говорит, скакой вершины начнтся вывод. Minindex минимальный индекс вершины.

Numvertices количество вершин используемых длявывода. Startindex первый индекс. Primitivecount количество примитивов.

Пока что напараметры basevertexindex, minindex иstartindex необращайте внимания. Мы ещ разбермся сними. Drawindexedprimitive(d3dpttrianglelist,0,0,4,0,2) четвртый параметр количество вершин применяемых длявывода графики, последний параметр количество примитивов.

.

Комментирование и размещение ссылок запрещено.

Комментарии закрыты.