Управление данными Voxel

8

Я программирую на C ++ как хобби уже около 4 месяцев, и мне действительно нравится создавать вещи с использованием вокселей. Я написал «игру» (больше, чем просто личный вызов, так как на самом деле я занимался только ландшафтом, а не геймплеем), в котором появился мир, похожий на Minecraft, но недавно я подумывал о попытке написать игру / вызов / и т.д. который использует алгоритм, такой как Marching Cubes или Dual Contouring и уменьшающий размер вокселя. Когда я писал свой проект, похожий на Minecraft, я сохранял данные каждого чанка в многомерном массиве шорт без знака (таким образом, у меня было до 65536 различных типов блоков). Кроме того, для рендеринга я сохранил только одну точку (как GLubyte) и другой GLubyte, чтобы указать, какая из 6 граней представляет точку, представленную. Затем я отрисовал лицо с помощью геометрического шейдера.

Что касается нового проекта, о котором я думал, то, что я не могу обернуть вокруг себя, это то, как я могу хранить достаточно данных о вокселях, чтобы иметь воксели размером ~ 5 см или 10 см по сравнению со старыми вокселями размером 1 м, которые я имел. Когда я рендерил область блоков 704x704x704, мой старый проект использовал около 670 МБ оперативной памяти. Если бы я сократил размер вокселя до 10 см и сохранил то же расстояние рендеринга, это было бы около 649 ГБ данных вокселей (при условии 2 байта на воксель и площадью 7040 ^ 3 вокселей). Можно ли как-то более эффективно хранить данные вокселей, которые по-прежнему позволяют мне широкий спектр различных типов вокселей?

Тень
источник

Ответы:

5

Вам нужно иметь каждый отдельный блок (предполагая, что вы используете блоки) в памяти сразу? Некоторые из них будут закрыты - особенно под землей - или за горами и т. Д. Многие из них, вероятно, будут просто воздушными / пустыми и поэтому могут быть помечены флагом.

Также вы можете использовать октодерево LOD или аналогичную структуру, чтобы попытаться сохранить видимые детали обратно пропорционально расстоянию от наблюдателя. По словам Джейсона, это гораздо более вероятно, чтобы купить вам производительность, но это серьезное структурное изменение по сравнению с плоской картой чанка.

См. Эту статью о клип-картах из моего любимого блога (у него есть воксельная машина, похожая на ту, что вы описываете с размером вокселя ~ дециметр).

ThorinII
источник
2
Во-первых, да, я использую куски. Во-вторых, ваше предложение о разгрузке полностью скрытых кусков определенно поможет, спасибо. Скорее всего, потенциальным методом, который я мог бы использовать, было бы использование запроса окклюзии с ограничительной рамкой чанка (так как все размеры чанков известны), чтобы увидеть, виден ли чанк, и загрузить / выгрузить чанк. в зависимости от результата. Редактировать: только что видел ваши изменения, и я на самом деле уже видел этот блог. Вот почему я хочу поэкспериментировать с меньшим размером вокселя =)
Shadow
Окклюзия гораздо менее важна, чем LOD. Окклюзия не принесет вам ничего, если вы не находитесь под землей или не смотрите на склон горы. LOD сам по себе позволяет визуализировать всю планету. Запросы окклюзии - плохая идея, так как они вводят GPU-> CPU-> GPU в оба конца. Условный рендеринг, тем не менее, жизнеспособен, но процессор, вероятно, может сделать достаточно хорошо сам по себе.
Хорошая точка зрения. Я только что заявил LOD вторым, потому что это серьезное структурное изменение.
ThorinII
3

Стандартный подход для таких механизмов, как VoxLap Кена Сильвермана и его преемника Ace of Spades, заключается в использовании сжатия RLE и нескольких других приемов на битовом уровне для хранения и доступа к данным. Этот вид одномерного сжатия имеет тенденцию быть высокоэффективным и значительно более простым в использовании, чем октодеревья. Я полагаю, что двигатель Сильвермана достиг воксельного разрешения примерно в 10 см в кубе. То, что вы обычно не видите сегодня, и это было достигнуто на гораздо более слабом оборудовании.

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

Octree не плохие, но их сложно использовать на практике, а распределение с эффективным использованием кэша значительно сложнее, чем RLE, которое легко линеаризовать с помощью фрагментов. Семинар Теро Карраса и Самули Лейна о SVO показывает, сколько усилий уходит на действительно эффективную реализацию октре - и это касается только рендеринга, а не геймплея или сетевых коммуникаций.

инженер
источник
0

Я не знаю, как далеко вы продвинулись в вашем проекте, но я и мой друг используем алгоритм Dual Marching Cubes , основанный на структуре фрагмента Octree и использующий двойную сетку для визуализации данных. У него много преимуществ, таких как очень низкий объем памяти и очень быстрый рендеринг. Может быть немного сложно реализовать Level Of Detail (LOD) на границах чанка с другими чанками, но если у вас есть свободное время, вы можете узнать, как разработчики Ogre3D сделали .

Leggy7
источник