Что такое разреженные воксельные октреи?
Я много читал о возможном использовании разреженных воксельных октод в будущих графических движках.
Однако я не смог найти техническую информацию о них.
Я понимаю, что такое воксель, однако я не знаю, что такое редкие октель вокселей или как они более эффективны, чем используемые в настоящее время полигональные методы.
Может ли кто-нибудь объяснить или указать мне объяснение этого?
5 ответов
Технический документ nVidia описывает его очень подробно ~ http://www.nvidia.com/object/nvidia_research_pub_018.html
Вот фрагмент кода id Software на эту тему.
id Tech 6 будет использовать более продвинутую технику, основанную на идее MegaTexture и виртуализирующую как геометрию, так и текстуры для получения уникальной геометрии вплоть до эквивалента текселя: Sparse Voxel Octree (SVO).
Он работает путем лучевой передачи геометрии, представленной вокселями (вместо треугольников), хранящимися в октрее.
Цель состоит в том, чтобы иметь возможность передавать части октодерева в видеопамять, идти дальше вниз по дереву для соседних объектов, чтобы дать им больше деталей, и использовать более высокие вокселы более высокого уровня для других объектов, которые дают автоматический уровень детализации (LOD) система для геометрии и текстур одновременно.
Также вот статья об этом.
Нашел больше информации в этой замечательной записи блога.
Что ж, одни воксели не так уж интересны, потому что для любого достаточно детализированного моделирования вам понадобится чрезвычайно большое количество вокселей (при использовании равномерной сетки).
Итак, иерархическая система необходима, что приводит нас к октодам. Октри - это очень простая структура пространственных данных, которая подразделяет каждый узел на 8 одинаково больших подузлов.
Разреженное октре - это октре, где большинство узлов пустые, аналогично разреженным матрицам, получаемым при дискретизации дифференциальных уравнений.
У октроя есть 8 соседей, потому что если вы представляете квадрат, который был разрезан на 4 равных части, как это
______________
| | |
| | |
|_____|______|
| | |
| | |
|_____|______|
тогда это будет "четырехъядерное"(четыре) дерево.
но в 3-х измерениях у вас есть сам куб, а не квадрат, поэтому, разрезая его по горизонтали, вертикали и по оси Z, вы найдете 8 кусков, а не 4, вот так
_____________
/ / / |
/-----/-----/ |
/_____/_____/ | |
| | | |/|
|-----|-----|/| |
| | | |/
|_____|_____|/
надеюсь, что делает с тех пор..
Что делает SVO уникальным, так это то, что он хранит информацию о Voxel, которая является точкой в пространстве и имеет такие свойства, как Color, Normal и т. д.
Идея SVO состоит в том, чтобы игнорировать треугольники и необходимость текстур, объединяя их в один SVO, который содержит Voxelized Triangle Hull(Модель) и его текстуры поверхности в одном объекте.
Причина, по которой здесь необходим Octree, заключается в том, что в противном случае единообразная структура сетки потребовала бы много-много памяти для работы существующих видеокарт.
таким образом, использование SVO позволяет создать вид Mip-Mapped 3D Texture.
MipMapping - это в основном то же изображение, но в разностных масштабах, которое имеет больше деталей, а последнее - наименьшее количество деталей (но на расстоянии они выглядят довольно похоже)
таким образом, ближние объекты могут течь из SVO с большей детализацией, а другие объекты - с меньшей детализацией, т. е. если вы используете литье лучей. -Texture/SVO
Но если вы мыслите нестандартно, как "Евклидон" с его "неограниченной детализацией", вы просто используете нарезку фрустума и пересечение плоскости /aabb с проецируемым ультрафиолетовым излучением нашего нарезанного билборда для нахождения каждого цвета текселей на экране, в противоположность в ширину * Высота пикселей, стреляющих лучами, с наивной nvidia "оптимизацией луча".
PS (что-то не по теме): для тех, кто не понимает, как Евклидон делает свою работу, я считаю, что это наиболее практичное решение, и у меня есть причина, чтобы поддержать его (что они НЕ используют лучевую отливку)
Самая большая загадка, которую они имеют, это не рендеринг, а хранение их данных... RLE просто не обрезает их... потому что некоторые данные объема / вокселя могут быть более случайными и менее "твердыми", когда RLE бесполезен, а также сжатие что для меня обычно требует как минимум 5 байтов на что-то меньшее. они говорят, что выводят примерно половину того, что вставлено) через сжатие... поэтому они используют 2,5 байта, что примерно столько же, сколько сейчас в треугольнике
Фактически, 1,15 бита заставляют меня подозревать, что они просто хранят вещи последовательно, каким-то блестяще простым способом. то есть, если они хранят только данные объема, а не такие вещи, как данные цвета или текстуры.
Подумайте об этом так: 1 воксель должен быть только 1 бит: он есть или его нет? (быть или не быть, другими словами:P). узел octree, в котором он находится, состоит из 8 вокселей и немного для хранения информации, содержит ли вещь что-либо вообще. это один бит на воксель плюс один на 8. 1 + 1/8 = 1,125. добавьте еще один родительский узел с 7 братьями и сестрами, и вы получите 1 + 1/8 + 1/8/8 = 1,140625. подозрительно близко к 1.15 они упомянули. хотя я, вероятно, далеко, это может дать кому-то ключ к разгадке.
Вы можете даже просто растренировать все точки, в прошлом вы нуждались в raytrace или raycast, так как видеокарты могут проецировать непристойное количество точек. Вы используете октодерево, потому что оно имеет форму куба, непрерывно разделяя его на кубы. (вокселы) У меня есть движок, использующий растровую технику, и он хорошо выглядит. Для тех, кто говорит, что вы не можете оживить вокселей, я думаю, что они действительно мало думают о теме, конечно, это возможно. На мой взгляд, создание мира во многом похоже на "бесконечное 3d-пальто", так что ищите 3d пальто, и дизайн уровней будет очень похож на работу этой программы. Основное отступление заключается в том, что скорость потоковой передачи недостаточно высока, трассировка лучей или растр не достигают 60 кадров в секунду, а построение реальных воксельных объектов очень затратно в вычислительном отношении, в настоящий момент я могу построить сферу 1024x1024x1024 примерно за 12 секунд, но все эти проблемы может быть исправлено, это захватывающее будущее. Мой максимальный размер мира на данный момент составляет мег на мег на мег, но на самом деле я могу увеличить его в 8 раз. Конечно, другая проблема, которая на самом деле является довольно серьезной, заключается в том, что для хранения символа 8192x8192x8192 даже после сжатия требуется около 100 мегабайт, поэтому среда будет даже больше, чем эта. Несмотря на то, что говорить о том, что вы будете иметь персонажей 8192x8192x8192, совершенно абсурдно по сравнению с тем, что мы видим в современных играх... весь мир раньше был 8192x8192x8192:)
Как вы делаете это, только сохраняя биты на указатель, если указатели создаются во время выполнения в видеопамяти... обдумайте это, и у вас может быть свой собственный движок.:)