Пишу игру c използованием Direct3D 9. Дошёл до того места, где надо
выводить трехмерные обекты, их много и при загрузке карты меняется количество.
Возникли вопросы:
1) При выводе используется буффер вершин (если неошибаюсь)
IDIRECT3DVERTEXBUFFER9 в него запихиваются данные, потом в SetStreamSource и
вывод изображения. Для каждой модели буду отдельно создавать буффер вершин.
Когда нужно вывести объект: запихивать в SetStreamSource и выводить.
Это не медленно или стоит все в один буффер запихать?
2) Можно хранить вершины в IDIRECT3DVERTEXBUFFER9 и I**Mesh (не помню как
точно называется, в нём обычно хранят модели загруженные из *.x файла),
что быстрее?
Georgy
... Яйцо от курицы недалеко падает.
GS> Hello all.
GS> Пишу игру c използованием Direct3D 9. Дошёл до того места, где надо
GS> выводить трехмерные обекты, их много и при загрузке карты меняется
GS> количество.
GS> Возникли вопросы:
GS> 1) При выводе используется буффер вершин (если неошибаюсь)
GS> IDIRECT3DVERTEXBUFFER9 в него запихиваются данные, потом в
GS> SetStreamSource и вывод изображения. Для каждой модели буду отдельно
GS> создавать буффер вершин. Когда нужно вывести объект: запихивать в
GS> SetStreamSource и выводить.
SetStreamSource - устанавливаешь вертексный буфер
SetIndices - индексный буфер (если используешь).
SetFVF - код вершины
DrawPrimitives (DrawIndexedPrimitives) - собственно рендеришь.
Возьми примеры из SDK - там все есть и все понятно.
GS> Это не медленно или стоит все в один буффер запихать?
Если верить факу по D3D9 от мелкософта, то смена вершинного буфера не
является "тяжелой" операцией. Hо, имхо, все зависит от кривизны драйверов.
Если геометрия моделей меняться не будет, то можешь запихать все в один
статический буфер.
GS> 2) Можно хранить вершины в IDIRECT3DVERTEXBUFFER9 и I**Mesh (не помню
GS> как точно называется, в нём обычно хранят модели загруженные из *.x
GS> файла),
GS> что быстрее?
Разницы не много. Просто при юзании ID3DXMesh ты можешь вызывать у него
метод DrawSubset, а в случае со своим буфером ты должен делать это сам.
Однажды, *Georgy Saygin* нашептал(а) /_*All*_/ (в день 20 Июл 04 н.э)
следующее:
GS> Возникли вопросы:
GS> 1) При выводе используется буффер вершин (если неошибаюсь)
GS> IDIRECT3DVERTEXBUFFER9 в него запихиваются данные, потом в
GS> SetStreamSource и вывод изображения. Для каждой модели буду отдельно
GS> создавать буффер вершин. Когда нужно вывести объект: запихивать в
GS> SetStreamSource и выводить.
GS> Это не медленно или стоит все в один буффер запихать?
Именно будет медленно(хотя все зависит еще и от видео и от ее дров).
Лучше делать один(точнее несколько но больших, так как очень большие бферы и
весят очень много ;-) на текстуры не останется) статических VB(или если меш
сложный то и IndexBuffer) и пихать все туда используя какую-либо адресацию для
наборов фейсов мешей. Чем меньше переключений VB тем лучше.
GS> 2) Можно хранить вершины в IDIRECT3DVERTEXBUFFER9 и I**Mesh (не
GS> помню
GS> как точно называется, в нём обычно хранят модели загруженные из *.x
GS> файла),
GS> что быстрее?
Если для каждого объекта будет свой набор VB/IB, то получится тот же тормоз, бо
ID3DXMesh содержит все в себе и фактически автономен.
Совет - делай несколько статических буферов, делай модели использующие эти СБ и
делай объекты которые ссылаются на модели. Сей подход конечно годится если те
сотни объектов будут стстичны по консистенции - т.е. не изменяться в
течениивремени(скажем анимация сетки). Для анимированных мешей придется
придумывать свое или юзать ID3DXSkinMesh.
Я даже как-то не так давно статейку написал про мое мировозрение на организацию
этого дела. Ищи ее на сайте(см в подписи) в разделе Статьи - мож поможет.
Покедова. Пиши /_Nailman`у_/. *WWW.CyborgHome.Ru/NailMan* /_ICQ:263635856/_
*WinAmp*: /_*Infected Mushroom - Never Never Land (Psychedelic)*/_
... [Psy][GOA][Ambient][AMD][8RDA3G][DiaLAND.RU][Universe][Delphi][Выспаться]