Что такое разреженные воксельные октреи? - PullRequest
31 голосов
/ 12 июня 2009

Я много читал о возможном использовании разреженных октетов вокселов в будущих графических движках.

Однако мне не удалось найти техническую информацию о них.

Я понимаю, что такое воксель, однако я не знаю, что такое редкие октель вокселей или как они более эффективны, чем используемые сейчас многоугольные методы.

Может ли кто-нибудь объяснить или указать мне объяснение этого?

Ответы [ 5 ]

26 голосов
/ 12 июня 2009

Вот фрагмент кода id Software на эту тему.

id Tech 6 будет использовать более продвинутую технику, основанную на идее MegaTexture и виртуализирующую геометрию и текстуры для получения уникальной геометрии вплоть до эквивалента текселя: Sparse Voxel Octree (SVO).

Работает путем лучевой передачи геометрии, представленной вокселями (вместо треугольников), хранящимися в октрое.

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

Также вот статья по этому вопросу.

Более подробную информацию можно найти в этой замечательной записи блога.

Что ж, одни воксели не так уж интересны, потому что для любого достаточно детально смоделированного моделирования вам понадобится чрезвычайно большое количество вокселей (при использовании равномерной сетки).

Итак, нужна иерархическая система, которая приводит нас к октодам. Октри - это очень простая пространственная структура данных, которая подразделяет каждый узел на 8 одинаково больших подузлов.

Разреженное октре - это октре, где большинство узлов пусто, подобно разреженным матрицам, которые вы получаете при дискретизации дифференциальных уравнений

18 голосов
/ 15 ноября 2011

у октри есть 8 соседей, потому что если вы представляете квадрат, который был разрезан на 4 равных квартала, вот так

______________
|     |      |
|     |      |
|_____|______|
|     |      |
|     |      |
|_____|______|

тогда это будет "четырехъядерное" (четыре) дерево.

но в 3-х измерениях у вас есть сам куб, а не квадрат, поэтому, разрезая его по горизонтали, вертикали и по оси Z, вы найдете 8 кусков, а не 4, вот так

    _____________
   /     /     / |
  /-----/-----/  |
 /_____/_____/ | |
 |     |     | |/|
 |-----|-----|/| |
 |     |     | |/
 |_____|_____|/

надеюсь, что делает с тех пор ..

Что делает SVO уникальным, так это то, что он хранит информацию о Voxel, которая представляет собой точку в пространстве и имеет такие свойства, как Color, Normal и т. Д.

Идея SVO состоит в том, чтобы игнорировать треугольники и необходимость текстур, объединяя их в один SVO, который содержит Voxelized Triangle Hull (Модель) и его текстуры поверхности в одном объекте.

Причина, по которой здесь необходим Octree, заключается в том, что в противном случае единообразная структура сетки потребовала бы много памяти для работы существующих видеокарт.

, поэтому использование SVO позволяет использовать Mip-Mapped 3D-текстуру.

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

таким образом, вблизи объекты могут течь из SVO с большей детализацией, в то время как другие объекты текут с меньшей детализацией, то есть, если вы используете литье лучей, чем дальше луч от камеры, тем меньше мы копаем в нашу мегатекстуру / SVO

Но, если вы мыслите нестандартно, как «Евклидон» с его «неограниченной детализацией», вы просто использовали бы нарезку фрустума и пересечение плоскости / aabb с проецируемым ультрафиолетовым излучением нашего нарезанного билборда для нахождения каждого цвета текселей на экран, в отличие от ширины * высоты пикселей, стреляющих лучами, с наивной "оптимизацией луча" nvidia.

PS (что-то не по теме): для тех, кто не понимает, как Евклидон делает свою работу, я считаю, что это наиболее практичное решение, и у меня есть причина, чтобы поддержать его (что они НЕ используют лучевую отливку)

Самая большая загадка, которую они имеют, это не рендеринг, а хранение их данных ... RLE просто не обрезает их ... потому что некоторые данные объема / вокселя могут быть более случайными и менее "твердыми", когда RLE бесполезен, также сжатие, которое для меня обычно требует по крайней мере 5 байтов во что-то меньшее. они говорят, что выводят примерно половину того, что вставлено) через сжатие ... поэтому они используют 2,5 байта, что примерно столько же, сколько сейчас у треугольника

8 голосов
/ 04 сентября 2012

Технический документ nVidia описывает его очень подробно ~ http://www.nvidia.com/object/nvidia_research_pub_018.html

3 голосов
/ 27 апреля 2010

На самом деле, 1,15 бит заставляют меня подозревать, что они просто хранят вещи последовательно, каким-то блестяще простым способом. то есть, если они хранят только данные объема, а не такие вещи, как данные цвета или текстуры.

Подумайте об этом так: 1 воксель должен быть только 1 бит: он есть или его нет? (быть или не быть, другими словами: P). узел octree, в котором он находится, состоит из 8 вокселей и немного для хранения информации, содержит ли вещь что-либо вообще. это один бит на воксель плюс один на 8. 1 + 1/8 = 1,125. добавьте еще один родительский узел с 7 братьями и сестрами, и вы получите 1 + 1/8 + 1/8/8 = 1,140625. подозрительно близко к 1.15 они упомянули. хотя я, вероятно, далеко, это может дать кому-то подсказку.

1 голос
/ 16 сентября 2011

Вы можете даже просто растрировать все точки, вы должны использовать raytrace или raycast в эти дни, так как видеокарты могут проецировать непристойное количество точек. Вы используете октодерево, потому что оно имеет форму куба, непрерывно разделяя его на кубы. (вокселы) У меня есть движок, использующий растровую технику, и он хорошо выглядит. Для тех, кто говорит, что вы не можете оживить вокселей, я думаю, что они действительно мало думают о теме, конечно, это возможно. На мой взгляд, создание мира очень похоже на «бесконечное 3d-пальто», так что ищите 3d пальто, и дизайн уровней будет очень похож на работу этой программы. Основное отступление заключается в том, что скорость потоковой передачи недостаточно высока, трассировка лучей или растр не достигают 60 кадров в секунду, а построение реальных объектов вокселей очень затратно в вычислительном отношении, в настоящий момент я могу построить сферу 1024x1024x1024 примерно за 12 секунд, но все эти проблемы может быть исправлено, это захватывающее будущее. Мой максимальный размер мира на данный момент составляет мег на мег на мег, но на самом деле я могу увеличить его в 8 раз. Конечно, другая проблема, которая на самом деле является довольно серьезной, заключается в том, что для хранения символа 8192x8192x8192 даже после сжатия требуется около 100 мегабайт, поэтому среда будет даже больше, чем эта. Даже если говорить, что вы будете иметь персонажей 8192x8192x8192, совершенно абсурдно по сравнению с тем, что мы видим в современных играх ... весь мир раньше был 8192x8192x8192:)

Как вы делаете это, только сохраняя биты на указатель, если указатели создаются во время выполнения в видеопамяти ... подумайте об этом, и у вас может быть свой собственный движок. :)

...