Я программирую на C ++ как хобби уже около 4 месяцев, и мне действительно нравится создавать вещи с использованием вокселей. Я написал «игру» (больше, чем просто личный вызов, так как на самом деле я занимался только ландшафтом, а не геймплеем), в котором появился мир, похожий на Minecraft, но недавно я подумывал о попытке написать игру / вызов / и т.д. который использует алгоритм, такой как Marching Cubes или Dual Contouring и уменьшающий размер вокселя. Когда я писал свой проект, похожий на Minecraft, я сохранял данные каждого чанка в многомерном массиве шорт без знака (таким образом, у меня было до 65536 различных типов блоков). Кроме того, для рендеринга я сохранил только одну точку (как GLubyte) и другой GLubyte, чтобы указать, какая из 6 граней представляет точку, представленную. Затем я отрисовал лицо с помощью геометрического шейдера.
Что касается нового проекта, о котором я думал, то, что я не могу обернуть вокруг себя, это то, как я могу хранить достаточно данных о вокселях, чтобы иметь воксели размером ~ 5 см или 10 см по сравнению со старыми вокселями размером 1 м, которые я имел. Когда я рендерил область блоков 704x704x704, мой старый проект использовал около 670 МБ оперативной памяти. Если бы я сократил размер вокселя до 10 см и сохранил то же расстояние рендеринга, это было бы около 649 ГБ данных вокселей (при условии 2 байта на воксель и площадью 7040 ^ 3 вокселей). Можно ли как-то более эффективно хранить данные вокселей, которые по-прежнему позволяют мне широкий спектр различных типов вокселей?
Стандартный подход для таких механизмов, как VoxLap Кена Сильвермана и его преемника Ace of Spades, заключается в использовании сжатия RLE и нескольких других приемов на битовом уровне для хранения и доступа к данным. Этот вид одномерного сжатия имеет тенденцию быть высокоэффективным и значительно более простым в использовании, чем октодеревья. Я полагаю, что двигатель Сильвермана достиг воксельного разрешения примерно в 10 см в кубе. То, что вы обычно не видите сегодня, и это было достигнуто на гораздо более слабом оборудовании.
Я также верю, что его подход не сохранял цвета для неэкспонированных вокселей, что вместо этого он вычислял цвет для поверхностных вокселей как функцию высоты или вспоминая, какие участки местности были взорваны открытыми, и окрашивая их как «свежую почву». ». Вы можете использовать какую-то непрерывную функцию, например, перлин-шум, чтобы сделать это, но она может быстро стать дорогостоящей для больших площадей поверхности (если, возможно, не выполняется на GPU).
Octree не плохие, но их сложно использовать на практике, а распределение с эффективным использованием кэша значительно сложнее, чем RLE, которое легко линеаризовать с помощью фрагментов. Семинар Теро Карраса и Самули Лейна о SVO показывает, сколько усилий уходит на действительно эффективную реализацию октре - и это касается только рендеринга, а не геймплея или сетевых коммуникаций.
источник
Я не знаю, как далеко вы продвинулись в вашем проекте, но я и мой друг используем алгоритм Dual Marching Cubes , основанный на структуре фрагмента Octree и использующий двойную сетку для визуализации данных. У него много преимуществ, таких как очень низкий объем памяти и очень быстрый рендеринг. Может быть немного сложно реализовать Level Of Detail (LOD) на границах чанка с другими чанками, но если у вас есть свободное время, вы можете узнать, как разработчики Ogre3D сделали .
источник