Я пытаюсь написать небольшой воксельный движок, потому что это весело, но изо всех сил пытаюсь найти лучший способ хранения реальных вокселей. Я знаю, что мне понадобятся какие-то куски, поэтому мне не нужно хранить весь мир в памяти, и я знаю, что мне нужно их рендерить с разумной производительностью.
Я читал о октреях и из того, что я понимаю, он начинается с 1 куба, и в этом кубе может быть еще 8 кубов, и во всех этих 8 кубах может быть еще 8 кубов и т. Д. Но я не думаю, что это соответствует моему вокселевому движку, мои воксельные кубы / предметы будут одинакового размера.
Поэтому другой вариант - просто создать массив размером 16 * 16 * 16 и иметь один кусок, и вы заполните его элементами. И части, где нет никаких предметов, будут иметь значение 0 (0 = воздух). Но я боюсь, что это приведет к потере большого количества памяти и не будет очень быстрым.
Тогда другой вариант - это вектор для каждого чанка и заполнить его кубиками. И куб держит свою позицию в куске. Это экономит память (без воздушных блоков), но делает поиск куба в определенном месте намного медленнее.
Поэтому я не могу найти хорошее решение, и я надеюсь, что кто-то может мне помочь с этим. Так что бы вы использовали и почему?
Но другая проблема - рендеринг. Просто прочитать каждый блок и отправить его в графический процессор с помощью OpenGL легко, но очень медленно. Генерация одного меша на чанк будет лучше, но это означает, что каждый раз, когда я разбиваю один блок, мне приходится перестраивать весь чанк, что может занять некоторое время, вызывая незначительный, но заметный сбой, который я, очевидно, тоже не хочу. Так что это будет сложнее. Так как бы я рендерил кубики? Просто создайте все кубы в одном буфере вершин для каждого чанка и визуализируйте это и, возможно, попытайтесь поместить это в другой поток, или есть другой способ?
Спасибо!