LINUX.ORG.RU

Как представляют уровни в 3D играх?

 ,


1

2

Делаю графический/игровой 3D движок Kawaii3D. Параллельно с этим пишу первую серьёзную технодемку к нему — геймплей что-то вроде трёхмерной версии hedgewars. Управляемые игроками модельки закидывают друг-друга гранатами. Требуется модель разрушений (после взрывов остаются кратеры и дыры в статических объектах, при этом висящие в воздухе куски ландшафта — норма). Вопрос: как лучше представить ландшафт: вокселями (ака minetest), картой высот, или чем ещё?

★★★★★

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

Нужны либо блоки крупного размера (что для ландшафта терпимо), либо динамически пересчитывать повреждённые меши. У тебя есть преимущество, так как можешь своё двигло как угодно для этого гнуть.

Bfgeshka ★★★★★
()
Ответ на: комментарий от Bfgeshka

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

Уже начались. При рендеринге всего лишь 2 359 296 блоков (6x1x6 чанков, каждый чанк 64x16x64 блоков) фреймтайм растёт безмерно (60, а то и 70 мс). По этому и затык.

Нужны либо блоки крупного размера (что для ландшафта терпимо)

Блок и так всего в 64 раза (в 4 раза по каждой из осей) меньше, чем в minetest. Если делать совсем кубач, будет грустно.

либо динамически пересчитывать повреждённые меши

Не. Тесселяция и динамическая геометрия у меня на десерт.

У тебя есть преимущество, так как можешь своё двигло как угодно для этого гнуть.

Вот и гну. Поддержку instanced rendering туда затолкал, а оно всё равно тормозит (шевелится уже гораздо бодрее, но всё равно неприемлемо).

Эх! Видимо придётся делать отсечение невидимой геометрии, при разрушении блока обновлять видимость соседних, пересчитывать UBO всех затронутых чанков — так тормозить будет хотя бы не постоянно.

robus ★★★★★
() автор топика
Последнее исправление: robus (всего исправлений: 1)

подозреваю, что задолго до твоего рождения...

...(1969) придумали bsp... без него 3d уровни пока никак

anonymous
()

придумали bsp... без него 3d уровни пока никакуровни пока никак

Спасибо. Но, к сожалению, перестраивать UBO чанка на клиенте (!), при каждой отрисовке (!!!) совершенно не вариант. Разве что выкидывать невидимые для игрока чанки целиком — уже даст немало. Так или иначе за наводку на бинарное разбиение, спасибо.

robus ★★★★★
() автор топика

Вопрос: как лучше представить ландшафт: вокселями (ака minetest), картой высот, или чем ещё?

Используй тесселяцию, если сможешь физический движок замутить и генерацию тесселяции на лету.

V1KT0P ★★
()
Ответ на: комментарий от robus

резать, конечно, на сервере.

но чтобы было что резать, все современные 3d-уровни имеют «коридорный» характер.

ps. если придумают как обойти эту проблему, об этом быстро узнают даже люди, которые не имеют отношения к разработке игр.

anonymous
()

GDC посмотри там был вариант. Ямы можно и heightmap'ом сделать мусор можно правильными вокселями. Можно мусор запекать в текстуру после прохождения времени для уникальности. Еще можно добавить текстуру с смещениями чтобы нависания и пещеры делать. Куски можно еще через transparency map гонять. Вариантов много, смотри на что фантазии хватит.

slapin ★★★★★
()
Ответ на: комментарий от robus

Посмотри еще на octree и kdtree до кучи тогда.

slapin ★★★★★
()

Kawaii3D

Если движок с таким названием не умеет в целшейдинг и обводку из коробки, то он не нужен.

O02eg ★★★★★
()

картой высот

Не подходит по причине двумерности.

вокселями (ака minetest),

Прекратите называть кубы вокселями. Это кубы, просто кубы.

или чем ещё?

Сотни вариантов. Хочешь - храни кубами. Хочешь - храни 3D сетку с булевыми значениями и строй по неё геометрию marching cubes'ами. Хочешь - храни 3D сетку float'ов, и строй более плавную геометрию. Хочешь - храни сразу полигональный меш, и модифицируй его пересекая со сферой взрыва. Хочешь - храни тетраэдрами. Хочешь - храни облако точек. Хочешь - вообще не модифицируй геометрию, а храни набор сфер пустоты и используй его в рендеринге и физике.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 3)
Ответ на: комментарий от robus

Instanced rendering это не та штука про которую разрабы Факторио писали? Херовое решение, если так. Оно будет работать у тебя и не работать у Васи — очень от железа зависит.

anonymous
()
Ответ на: комментарий от robus

Ага, именно оно. Ну там конечно не совсем такие выводы, выводы что у этого метода есть большие ограничения по применимости. Презенташка: https://www.slideshare.net/DevCentralAMD/vertex-shader-tricks-bill-bilodeau

Да и в любом случае, лучше оптимизировать свои шейдеры. Всё остальное каменный век.

anonymous
()

Всем спасибо, почитал про разные методы и решил, что буду представлять уровни кубами, кубы объединять в чанки. Отсекать невидимые для игрока чанки на стороне клиента перед каждой отрисовкой (чанков в карте будет не так уж много). И самое главное: отсекать гарантированно невидимые кубы (с каждой стороны которых есть куб) внутри чанка на серваке. И да поможет нам Instanced rendering не возлагать :D

robus ★★★★★
() автор топика
Ответ на: комментарий от anonymous

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

Attribute divisor нужен. Меня ведь блоб NVIDIA никогда и ни за что не простит за массив размерности 65536 в UBO — там у них всё строго, это вам не mesa, систематически балующая кодеров.

Да и в любом случае, лучше оптимизировать свои шейдеры. Всё остальное каменный век.

Это да. А ещё лучше с оптимизированными шейдерами юзать оптимальные способы передачи информации в них :)

robus ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.