Свойства шага в файле glTF?

#c #json #parsing #rendering #gltf

#c #json #синтаксический анализ #визуализация #gltf

Вопрос:

Документы Khronos определяют шаг как:

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

Я несколько сбит с толку, поскольку многие из примеров, которые я уже пробовал (3 из них), имели шаг 0, поэтому я просто игнорировал атрибут до сих пор. Эти примеры отображаются просто отлично.

Я выводил «шаг» из типа. например, если тип был vec3, а тип компонента был float, я загружал каждые 12 байтов как один элемент. Вот некоторые вещи, в которых я не совсем уверен, читая спецификацию:,

Когда шаг не равен 0, означает ли это, что данные могут чередоваться? Если шаг не равен 0, могут ли данные быть непрерывными (например, байты заполнения)? Другими словами, можете ли вы столкнуться с ситуациями, когда буфер не чередуется, но общий размер sizeof(type_component) * element_count не является делителем общего объема считываемой памяти?

Ответ №1:

Да, средства доступа (в glTF) подобны атрибутам вершин в OpenGL / WebGL, и им разрешено чередовать. Шаг находится в BufferView, чтобы заставить средства доступа, которые совместно используют этот BufferView, иметь одинаковый шаг. Нулевое значение означает «плотно упакованный».

Обратите внимание, что вы можете чередовать компоненты разных размеров, такие как vec3 (ПОЗИЦИЯ) с vec2 (TEXCOORD_0), поэтому шаг может быть суммой разных размеров.

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

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