Разъяснение о октреях и как они работают в мире Voxel
Я читал о октреях, и я не до конца понимал, как они работают / реализуются в мире вокселей, где цель октри состоит в том, чтобы уменьшить количество вокселей, которые вы визуализируете, соединяя повторяющиеся воксели с одним большим "вокселем".
Вот вопросы, которые я хочу уточнить:
- Какой тип структуры данных вы бы использовали? Как можно превратить трехмерный массив вокселей в массив, имеющий воксели разных размеров, которые занимают несколько мест в массиве?
- Что такое узлы и для чего они используются?
- Связывает ли октрея вокселы так, что есть ТОЛЬКО квадратные формы или это может быть прямоугольник или L-образная форма или целый Y-столбец вокселей или что?
- Действительно ли октреи улучшают производительность воксельной игры? Если да, то как обычно?
2 ответа
Быстрые ответы:
- Дерево:
Каждый узел имеет 8 дочерних элементов: верхний-задний левый, верхний-задний правый и т. Д. До определенного уровня
Код для этого может быть довольно сложным, особенно если вокселы могут меняться во время выполнения. - Тип вокселя (цвет, материал, список предметов)
- Ага. Только кубики
В частности, 1x1, 2x2, 4x4, 8x8 и т. Д. Это должен быть целый узел.
Если вы действительно хотите, вы можете определить какие-то шаблоны, но это больше не октодерево. - да, но это зависит от ваших данных. Представьте, что вы описываете 256 одинаковых блоков по отдельности или описали их один раз (например, воздух в Minecraft)
Я бы начал с того, чтобы сначала попытаться понять квадри. Вы можете сделать это на бумаге или составить тестовую программу. Вы сами ответите на эти вопросы, если будете экспериментировать
Правильно выполненное октри может также помочь вам в поисках соседей, которые позволят вам определить, считается ли лицо "видимым" (т. Е. В итоге вы получаете корпус видимых вокселей). После того, как вы установили окто-дерево, вы можете использовать его для хранения координат XYZ, которые затем извлекаете в один массив. Затем вы передаете этот массив в буфер VERTEX (решения GL требуют этого), который затем можно при необходимости отобразить в виде фрагментов (по мере движения камеры вперед и т. Д.).
Кроме того, у Octree сама природа сворачивает кубы в более крупные, если есть такие же, как у Тетриса, когда у вас есть цвета / формы, которые "соответствуют" друг другу... это, в свою очередь, может уменьшить количество вершин и рендер вы действительно рисуете комбинацию квадратов и прямоугольников
Если все сделано правильно, вы получите много фрагментов, которые имеют только видимые "грани", видимые в буферах вершин. Теперь вам нужно также создать свой собственный алгоритм окклюзионной отбраковки, который затем уменьшает видимость этого, что приводит к меньшему требованию рендеринга.
Я сделал пример здесь:
Заметьте, как внешняя сторона только визуализируется, но сами куски идут до самого дна, хотя грани глубины кусков должны компенсировать друг друга? (нужна дополнительная оптимизация). Также обратите внимание, как камера поворачивается и лица удаляются из буферов рендеринга?