Почему BufferViews и Accessors разделены в glTF?

Формат GLTF указывает, что сетки ссылаются на свои данные вершин и индексов через методы доступа, которые в свою очередь ссылаются на BufferViews. Оба они имеют смещение и длину.

Основное различие заключается в том, что BufferViews не зависят от формата, они просто ссылаются на несколько байтов, в то время как средства доступа добавляют информацию о типе.

Что я не понимаю, так это:

  1. Зачем им обоим нужно смещение и длина? Какой вариант использования существует там, где смещение в методе доступа не равно нулю, а счетчик метода доступа не соответствует длине представления?
  2. Почему данные типа не содержатся непосредственно в представлении буфера? В каком случае имеет смысл интерпретировать одни и те же данные в разных форматах?

1 ответ

Решение

Формат предназначен для поддержки чередующихся атрибутов вершин, первоначально из WebGL (в glTF 1.0), но теперь в более широком смысле через графические API (в glTF 2.0).

Например, POSITION данные могут быть vec3 из FLOAT, но TEXCOORD_0 данные могут быть vec2 из FLOATи даже могут быть пользовательские атрибуты разных типов, все чередующиеся в одном буфере графического процессора.

Итак BufferView определяет данный шаг байтов, и отдельные средства доступа к этому представлению могут иметь разные типы и количества, но все будут иметь один и тот же шаг байтов.

Конечно, вы не обязаны чередовать, но формат предназначен для того, чтобы разрешить это и обеспечить совместное использование шага байтов, когда это происходит.

Вот диаграмма из раздела "Чередование данных" учебника glTF. Здесь немного мало, но вы можете кликнуть для увеличения. В этом примере есть два метода доступа, один для POSITION и один для NORMAL, совместно использующих один BufferView.

Чередование данных

Другие вопросы по тегам