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