ПрограммированиеФорумГрафика

алгоритм для уменьшения количества полигонов для воксельной поверхности (minecraft)

#0
15:00, 21 фев 2014

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

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

ппппп | алгоритм для уменьшения количества полигонов для воксельной поверхности (minecraft)

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

прошу знающих ребят  помоч теоретически или практически помоч с таким алгоритмом.
кто заинтересовался пишите свои соображения.

я видел тут на форуме несколько тем по построению такого ландшафта, но и у них оптимизация довольно слабенькая ( как и у меня ), давайте вместе разберемся c данной темой, думаю многим станет полезно

#1
15:25, 21 фев 2014

stupid bot
тут где-то рядом есть тема про рендер майнкрафта

#2
16:56, 21 фев 2014

Не имеет смысла для игры типа Minecraft, с динамически изменяемой геометрией.  Там по 50 чанков в секунду перестраивается, и оптимизация геометрии будет только всё замедлять. Лучше добавить LODы чанков, чтобы вдалеке их можно было больше отрисовать.
Ещё ведь могут быть проблемы с текстурой, надо чтобы все объединяемые квадраты имели одну текстуру и общий базис текстурных координат.

#3
18:49, 21 фев 2014

Не взлетит. Только если одинаковые текстурные координаты.
Да и всё равно много поликов не понадобится - в кадр много чанков не влезает + много чанков в памяти не подержишь, тяжело.

#4
20:13, 21 фев 2014

ArchiDevil
в кадр может очень много чанков влезть если смотреть с какой-то горы. конечно если предел видимости не ограничивается радиусом в 5-10 чанков.
а чанк можно оптимизировать для памяти, хранить только видимые кубики. в виде проиндексированого массива. в теории

все это для увеличения фпс.

Panzerschrek[CN]
а если чанк оптимизируется еще во время его генерации?
да и всеравно, я же так или иначе его оптимизирую
тоесть отсекаю невидимые кубики, остаются только стенки, в середине чанк пустой.  - проверяю наличие 6 соседей, и добавляю полигон если соседа нету.
тоесть разве есть разница каким алгоритмом оптимизировать, крутым или моим простым?

а LOD - само собой, только я до этого еще не дошел )


п.с.
пока что все только на ЦПУ.
есть ли смысл пытатся генерить чанк на ГПУ? (думаю что лучше пока не поднимать этот вопрос )

#5
20:17, 21 фев 2014

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

#6
20:19, 21 фев 2014

stupid bot
Мне в голову ничего не приходит, кроме как отсортировать полученные при генерации квадраты по плоскостям, а это уже сложность n*Log(n). Говорю, смысла оптимизировать нет, видеокарта справляется с рендерингом.

#7
20:21, 21 фев 2014

stupid bot
> хранить только видимые кубики. в виде проиндексированого массива. в теории

Ну пойди придумай алгоритм для выделения видимых кубиков и содержания их в памяти, в массивах нефиксированного размера, я посмотрю как ты справишься. Лучше LOD систему сделай нормальную, а не занимайся извращениями.

#8
20:25, 21 фев 2014

stupid bot
> но и этого не достаточно. слышал о алгоритмах которые могут обьединять соседние
> кубики, которые находятся на одном уровне в один цельный полигон, таким образом
> плоскость кубиков например 32х32 можно обьединить всего в один полигон
Можно обходить октри на CPU. Но тут проблема с нормальной аппаратной реализацией -  не сможешь эффективно использовать ресурсы GPU.
Можно попробовать использовать тесселятор для генерации кубиков в блоке относительно небольшого размера - например 16*16*16 .

#9
20:29, 21 фев 2014

FROL
> Можно обходить октри
WAT? У вас octree? Зачем?
> Можно попробовать использовать тесселятор для генерации кубиков
Пример шейдера в студию.

#10
21:27, 21 фев 2014

тоесть вы мне советуете не заниматся такой оптимизацией ?
тогда вопрос "почему?" сам напрашивается.
какие существенные и не существенные минусы имеет такая оптимизацие?

п.с.
я тут прикинул, что может пострадать расчет освещения (для каждого кубика ) как в МК. из-за больших полигонов, хотя могу ошибатся

#11
22:07, 21 фев 2014

Panzerschrek[CN]
> WAT? У вас octree? Зачем?
У меня нет) Но если бы я делал майнкрафт я бы делал октри)

#12
8:26, 22 фев 2014

Ещё один минус, и довольно существенный:
> я тут прикинул, что может пострадать расчет освещения (для каждого кубика )
Короче, овчинка выделки не стоит, нефиг заниматься преждевременной оптимизацией.
FROL
> У меня нет) Но если бы я делал майнкрафт я бы делал октри)
А я делал свой майнкрафт, и поверь, там octree не нужен. Его можно применять разве что для сжатия чанков перед сохранением на диск, да и то, обычное сжатие с помощью zlib работает нормально.

#13
9:32, 24 фев 2014

алгоритм называется greedy meshing, как-то так. судя по этому http://0fps.net/2012/07/07/meshing-minecraft-part-2/ побыстрее наивного подхода. Но пиксельный шойдер посложнее будет, если один атлас для всех типов блоков использовать.

ПрограммированиеФорумГрафика

Тема в архиве.