Современные моделирующие форматы, которые поддерживают буферы вершин
Существуют ли какие-либо форматы моделирования, которые напрямую поддерживают объекты Vertex Buffer?
В настоящее время мой игровой движок использует модели Wavefront, но я всегда использовал их с непосредственным режимом и списками отображения. Это работает, но я хотел обновить всю систему до современного OpenGL, включая шейдеры. Я знаю, что могу использовать немедленный режим и отображать списки с помощью шейдеров, но, как и большинство начинающих разработчиков, я хочу, чтобы моя игра была лучшей. Задав вопрос, связанный выше, я быстро понял, что модели волнового фронта просто не поддерживают буферы вершин; это в основном связано с тем, как модель индексируется. Чтобы использовать объект буфера вершин, вершины, текстурные координаты и массивы нормалей должны быть одинаковыми по длине.
Я могу добиться этого, написав свой собственный конвертер, что я и сделал. По сути я развертываю индексацию и создаю связанные массивы. Мне даже не нужно точно использовать glDrawElements
тогда я могу просто использовать glDrawArrays
что я прекрасно делаю. Единственная проблема заключается в том, что я на самом деле дублирую данные; массивы становятся массивными (особенно с большими моделями), и это просто кажется мне неправильным. Конечно, должен быть современный способ инициализации модели в буфер вершин без полного развертывания индексации. Итак, у меня есть два вопроса.
1. Есть ли у них какие-либо современные форматы / концепции моделей, которые поддерживают прямые объекты Vertex Buffer?
2. Это уже промышленный стандарт? Разве большинство игровых движков разворачивают индексирование (и раздувают массивы, также называемые распаковкой) во время выполнения, чтобы создать ресурсы игрового мира?
1 ответ
Основной проблемой форматов хранения является эффективность использования пространства. При чтении с носителя вы ограничены пропускной способностью ввода / вывода. Таким образом, любые циклы ЦП, которые вы можете потратить на сокращение общего объема данных, которые будут считываться из хранилища, значительно выиграют время загрузки активов. Просто чтобы дать вам общую идею. Даже самые быстрые твердотельные накопители, которые вы можете купить на момент написания этой статьи, не превысят 5 ГБ / с (поверьте, я пытался найти что-то, что может насытить 8 дорожек PCIe-3 для моей работы). Ваша типичная пропускная способность памяти процессора по крайней мере на порядок выше. Графические процессоры имеют еще большую пропускную способность памяти. Еще быстрее кэши низкого уровня.
Итак, что я пытаюсь вам сказать: этот индекс разворачивается наверху? Это, как правило, неудобство для вас, разработчика, но, вероятно, сэкономит время на загрузке ресурсов.
(предлагаемое редактирование): Конечно, сохранение чисел в их текстовом представлении не поможет с эффективностью пространства; в зависимости от выбора базы одна цифра представляет от 3 до 5 бит (скажем, 4 бита). Этот же текстовый символ, однако, потребляет 8 бит, так что у вас там около 100% накладных расходов. Самый низкий висячий фрукт, который он хранит в двоичном формате.
Но зачем останавливаться на достигнутом? Как насчет применения сжатия данных? Существует несколько форматов сжатых активов. Но особенно хорошо разработанным является OpenCTM, хотя есть смысл добавить к нему один из недавно разработанных алгоритмов сжатия. Я думаю о Zstandard здесь, который сжимает данные смехотворно хорошо и в то же время непристойно быстр при декомпрессии.