Какие форматы данных сетки предоставляют индексы для положений, нормалей и UV-координат по отдельности?

В моей игре будет много низкополигональных мешей с твердыми краями. Это означает, что много раз одна позиция вершины будет использовать более одной нормали и UV-координаты. Поэтому для меня было бы разумным разделить Vertex Positions, Normals и UVs на 3 отдельных массива, а затем использовать 3 индекса на вершину для построения сетки. Существуют ли какие-либо форматы данных для сеток, которые поддерживают скелетную анимацию, свет, текстуры, материалы и все такое барахло вместе с отдельно индексируемыми позициями, нормалями и UV? Или это скорее вопрос в том, как я сохраняю данные в 3D редакторе (Blender)?


person stimulate    schedule 12.12.2016    source источник


Ответы (1)


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

В этом потоке обсуждается этот вопрос, но, как правило, гораздо эффективнее использовать отдельные вершины.

Если вы решите экспортировать из 3D-редактора в формат .obj, каждая вершина будет представлена ​​в файле вместе с данными.

В этом видео показан полный пример загрузки файла .obj из Blender. в OpenGL.

person SporreKing    schedule 12.12.2016
comment
Я также заметил, что файлы .obj используют этот способ хранения вершин. есть все позиции, нормали и uvs, а грани состоят из 3 * 3 целых чисел. К сожалению, у obj нет всей необходимой мне функциональности ... Теперь я решил просто придерживаться .dae, а затем я сам загружу 3 отдельных массива и проиндексирую их при загрузке меша. Таким образом, мне не придется отправлять столько данных в шейдеры, и я могу перенести больше вычислений на видеокарту, что кажется хорошим делом, поскольку моя программа вообще не будет обрабатывать видеокарту. Спасибо! - person stimulate; 12.12.2016
comment
@stimulate Нет проблем, не забудьте пометить как ответ :) - person SporreKing; 12.12.2016
comment
хе-хе жадный старик ты чокнутый;) - person stimulate; 12.12.2016
comment
@stimulate Это мое топливо;) - person SporreKing; 12.12.2016
comment
@SporreKing: К сожалению, нет эффективного способа использования разных индексов для положения, нормалей, UV и т. Д. Это не соответствует действительности. - person Nicol Bolas; 12.12.2016
comment
Сообщаем @NicolBolas, что это, вероятно, снизит производительность рендеринга, я сказал эффективно - person SporreKing; 12.12.2016
comment
@Nicol Bolas, почему это медленнее, чем наличие данных для каждой комбинации вершин? Графический процессор должен обрабатывать много данных, особенно с резкими сетками, поэтому отправка данных вершин в конвейер и доступ к ним должны быть быстрее, не так ли? Почему это не поддерживается? - person stimulate; 12.12.2016
comment
@stimulate Если я правильно понял, это потому, что чтение данных происходит быстрее, чем выполнение логики. Соединение вещей вместе требует больше времени, чем простое чтение. Хотя я могу ошибаться по этой причине. - person SporreKing; 12.12.2016
comment
@stimulate: это медленнее, потому что выборка выделенного оборудования может делать то, чего не может программное решение. Он может читать несколько индексов и извлекать данные для всех даже до того, как VS будет запущен. Поэтому, если при чтении из памяти происходят промахи в кэше, задержка конвейера может помочь уменьшить это. Чтения VS не могут быть конвейерными. Но разница в эффективности в первую очередь касается оборудования, которое фактически имеет выделенное оборудование для извлечения вершин. - person Nicol Bolas; 12.12.2016
comment
Хорошо, спасибо за информацию! Будем надеяться, что эта функция будет лучше поддерживаться в будущем, потому что мне кажется, что в целом это хорошая идея. - person stimulate; 13.12.2016