среда, 8 июля 2009 г.

Различные доработки.

Итак, после долгой паузы решил написать что еще сделано, что еще планируется.
Добавлено задание Анизотропной фильтрации в материале. Значение фильтрации задается там-же, в случае если нет поддержки со стороны железа текущего значения, подменяется ближайшее по значению, если анизотропная фильтрация не поддерживается, производится замена на трилинейную. Есть идея с большого расстояния отключать анизотропную фильтрацию и включать трилинейную, но даст это что-то для повышения быстродействия, нужно подумать.

Написаны реализации кубических и трехмерных текстур. Так-же в случае реализации рендера в текстуру для них.

Как известно, на сложных сценах рисуется много объектов. Если не применять инстансинг, то встает проблема минимизации числа вызовов рисования геометрии, имеется ввиду вызовы соответствующей функциональности в Direct3D9, Direct3D10 и в OpenGL: IDirect3DDevice9::DrawIndexedPrimitive, ID3D10::DrawIndexed, glDrawElements, glDrawRangeElements. Инстансинг стоит в планах, а пока для каждого объекта сцены ставиться вершинный и индексный буфер. Если объектов будет тысячи, на моей тестовой сцене это число уже больше, то число переключений вершинных и индексных буферов буферов будет снижать быстродействие. Возникла идея, собрать все меши имеющее одинаковый формат вершин в единый вершинный буфер, аналогично поступить с индексными. Это будет еще более актуально, если число объектов отличающихся по геометрической форме будет большим.
Вот некоторая статистика для сцены вместе с тенями для 1377 объектов, всего разных объектов для текущей сцены около 50:
Число переключений буферов в случае общих вершинных и индексных: 59, 58
Число переключений буферов в случае отдельных вершинных и индексных: 96, 84

Улучшилась работа профайла. Сделал усреднение времени по 10 кадрам, теперь значения не "прыгают". Фильтрация показа малых значений времени.

В файле описания уровня можно задавать Render Target'ы, привязанные к объектам сцены. Параметры, такие как размеры, формат пикселей, пишутся там-же. Если Render Target служит для отражения то указывается в параметре для какой плоскости это происходит. В таком случае при обходе Scene Graph'a, будет происходить сбор как самих видимых объектов, так и заполняться список видимых объектов для каждого заданного Render Target'а. Такой подход удобен для реализации отражений для моделирования воды, зеркал или еще чего нибудь. В данный момент реализовываю отражение в воде.

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