суббота, 8 января 2011 г.

MD2 loader

Мне как программисту тяжело создавать 3D-модели, а использовать кубики и шарики уже надоело. Решил выбрать какой-нить подходящий 3D-формат, с поддержкой анимации. Т. к. с MD5 у меня всплывали проблемы с расчётом adjacency, то выбор пал на формат MD2 из игры Quake II: формат прост и можно взять замечательные модельки прямо из игры.



Недостатком формата является то, что в нём используется повершинная анимация. Все "кадры" анимации хранятся в виде набора вершин, и т. к. кадров много и вершины в каждом кадре дублируются, то размер анимации получается немаленьким: в среднем 200-300 кб (до мегабайта). Для экономии памяти вершины хранятся в формате byte, каждый кадр содержит значения scale и translate для восстановления позиций вершин в формате float.

Оригинальный Quake II и всякие тулзы обычно рисуют MD2 прямо из системной памяти, делая масштабирование и интерполяцию кадров на CPU. Это было не тяжело, т. к. модели были самые настоящие low-poly (SM 5.0 и тесселятор никто ещё не юзал!). И хотя нагрузка на процессор тут минимальна, эту задачу лучше всего перенести на GPU.

Вершины всех кадров я разместил в одном вершинном буфере в формате GL_UNSIGNED_BYTE. Этот буфер привязан к вершинным атрибутам 0 и 1, но для нулевого атрибута указывается смещение для текущего кадра, а для первого - смещение для следующего за текущим кадра. Таким образом не надо создавать отдельный вершинный буфер для каждого кадра. Далее в шейдер передаются параметры scale и translate для каждого из двух кадров и вес для интерполяции полученных вершин. На выходе получаем анимированную модель.

Комментариев нет:

Отправить комментарий