Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

DirectX engine: Как сделать быстрее?

2 views
Skip to first unread message

Daniil Smolyakov

unread,
Jan 14, 2006, 2:51:44 PM1/14/06
to
Hi!
Склепал намедни как бы движок :), фунциклирует так:
Имеется один общий vertex buffer и, соответственно, один такой же общий index
buffer.
Трехмерный объект на отображение - это структура:
* первая вершина в общем vertex buffer'е
* количество вершин
* первый индекс в общем index buffer'e
* количество индексов
Таким образом получаем возможность хранить в памяти только один объект, а
выводить его
в нужном месте путем предварительной установки мировой матрицы.
А что если нужно выводить объектов эдак 100-200, в каждом из которых только по
10-30 полигонов?
В документации к DirectX сказано, что при вызове DrawPrimitive с количеством
полигонов меньше 100 (или 200 - запамятовал) за раз очень процесс замедляется -
лучше и не пробовать. Я пробовал. :) Одной моделью в 30000 полигонов я получаю
50-60 FPS, а при выводе 500 кубиков (12 полигонов на модель, всего на экране
6000 треугольников) получаю 15 FPS.
Так как быть с массивами деревьев? Делать их одним объектом и выводить за раз?
А если у них текстурки разные? Избегать и этого, в смысле - смириться и
хитрить?
Как, например, сделан лес в игре Xenus:Boiling Point?
Может есть какое-то уже ставшее классическим решение задачи, а я все еще узко
мыслю? :)

И второе - как выводить обычные картинки с большим разрешением на экран, если
используется 3D. Разбить эту текстуру на несколько мелких текстур и выводить
набором полигонов?
Поэтому вопрос: на какое максимальное разрешение текстуры можно расчитывать? Я
так полагаю, что ниже GeForce2MX можно уже не опускаться. Сколько она позволяет
сделать 1024 или уже 2048 могет?

А, и еще: мне кажется или DXSprite действительно довольно-таки медленный?

Bye!
MoonStone.


Serguey Zefirov

unread,
Jan 14, 2006, 5:06:51 PM1/14/06
to
DS> Таким образом получаем возможность хранить в памяти только один объект, а
DS> выводить его
DS> в нужном месте путем предварительной установки мировой матрицы.
DS> А что если нужно выводить объектов эдак 100-200, в каждом из которых
DS> только по 10-30 полигонов?

Добавляешь к данным вертекса в вертексбуфере индекс матрицы.

Делаешь вертекс шейдер, в память констант которого грузишь матриц столько,
сколько нужно. Для шейдеров 1.3 помещается, по-моему, порядка 64 матриц 4x4.

Выводишь несколько объектов одним DrawPrimitive, при этом мировая матрица
каждого погружена под необходимым индексом в память констант.

64*40 - 40=(30+50)/2 - 2560 полигонов за DrawPrimitive.

DS> Может есть какое-то уже ставшее классическим решение задачи, а я все еще
DS> узко мыслю? :)

Судя по всему, ты еще, пока, не дочитал до нужной главы. ;)

Шейдеры - это очень сильно.

Yours truly, Serguey Zefirov (thesz AT mail DOT ru)

0 new messages