Comments 25
Что мешает в этом случае использовать обычный random?
Обычный рандом это какой? Вас наверное смутили иллюстрации, вообще мозаику можно запросто использовать для фотореалистичных текстур, но мои способности художника пока не позволяют рисовать что-либо пиксель арта. Вот, например, переделанные текстуры из Minecraft:

Слева оригинал, справа мозаика из атласа с увеличенной и немного перемешанной текстурой

Слева оригинал, справа мозаика из атласа с увеличенной и немного перемешанной текстурой
Возможно, просто было мало примеров из «жизни»
На скорую руку сваял мозаику из этой текстуры. Над швами сильно не работал, но, думаю, смысл понятен.


Для полного рандома надо, чтобы каждая плитка из атласа сочеталась с каждой (либо перебирать рандомом, пока не совпадут грани), а заодно рандомные значения зависели от некого seed и не менялись с каждым запуском или вообще с каждой отрисовкой.
Оба ограничения не актуальны, если можно «запечь» мозаику, а в игре уже ее отрисовывать, но для этого нужен промежуточный слой — текстура или текстурные координаты (если у нас детальная полигональная сетка). Но гораздо удобнее было бы сделать шейдер для отрисовки текстуры из атласа по некому алгоритму без промежуточных расчетов и лишних инструкций.
Оба ограничения не актуальны, если можно «запечь» мозаику, а в игре уже ее отрисовывать, но для этого нужен промежуточный слой — текстура или текстурные координаты (если у нас детальная полигональная сетка). Но гораздо удобнее было бы сделать шейдер для отрисовки текстуры из атласа по некому алгоритму без промежуточных расчетов и лишних инструкций.
Мои глаза! Не могли на какой-нибудь траве показывать? :(
Интересный подход.
А можно ли как-то переделать алгоритм, чтобы он был не итеративным, а позиционным. То есть, я передаю ему координаты ячейки, а он мне индекс тайла в атласе. Это было бы идеально для текстурирования «на лету» сразу в пиксельном шейдере.
Конечно, полноценная переделка вряд-ли возможна, но можно, наверное, как-то разбить тайлы на подмножества, чтобы в любой ячейке по координатам можно было бы определить подмножество и рандомно выбирать тайл из него.
А можно ли как-то переделать алгоритм, чтобы он был не итеративным, а позиционным. То есть, я передаю ему координаты ячейки, а он мне индекс тайла в атласе. Это было бы идеально для текстурирования «на лету» сразу в пиксельном шейдере.
Конечно, полноценная переделка вряд-ли возможна, но можно, наверное, как-то разбить тайлы на подмножества, чтобы в любой ячейке по координатам можно было бы определить подмножество и рандомно выбирать тайл из него.
Алгоритм создания мозаики Вана полностью локален, если вам известны цвета соседей, то выбрать из атласа множество подходящих тайлов совсем не сложно, нужно всего пара условий. У меня в коде просто строит проверка «если правая грань соседа слева такая, то выбираем один из этих столбцов в атласе», потом аналогичным образом выбираю колонку и получаю нужный тайл.
В том-то и дело, что в шейдере состояние соседей не известно, так как эти состояния нигде не хранятся. Но если алгоритм будет повторяемым, то можно будет лишь гарантировать, что сверху — снизу — справа — слева определенная группа тайлов, но не ясно какой конкретно.
Как раз по ссылке на GPU Gems 2 описан подход для текстурирования подобным методом на лету, то есть в пиксельном шейдере. То, что я и искал.
Отличный материал, осталось дело за малым — всем авторам движков добавить поддержку таких текстур =) на уровне движка
Постановка задачи напомнила одну популярную статью на этом ресурсе.
Если честно, то момент с контейнерами абсолютно не понял. Картинки сколько не рассматривал — ясности не добавило. Принцип «стыковки» сторон — понятен, а дальше — тупик. Какой контейнер, из чего он получается, и почему он «хорошо укладывается» — вообще не могу «сложить паззл».
Представьте, что у вас есть ящик советской кафельной плитки. Плитка кривая и плохо стыкуется, приходиться долго подбирать подходящую, чтобы она не упиралась в соседей. Теперь представьте, что вместо кривой плитки у вас есть ровная и качественная, и вы можете положить любую плитку куда угодно и она будет хорошо смотреться. Получается, что для гладкого и красивого пола в ванной важна не середина, а края плитки. Рисунок на любой плитке можно поменять, и она всё равно впишется в окружение, потому что её края сочетаются с соседями. Если плитка не квадратная, а фигурная, то менять плитки немного сложнее, но рисунок по-прежнему играет второстепенную роль, он может иметь больше или меньше деталей, может быть с вариациями или без. Плитка делится на два компонента: края, которые определяют возможность укладывания плитки, и лицевую поверхность, которая отвечает за общий внешний вид и может меняться.
В статье очень непонятно описан процесс. А вот ссылки по теме — раскрывают смысл очень хорошо:
смотрите тут: http.developer.nvidia.com/GPUGems2/gpugems2_chapter12.html и тут: www.pathofexile.com/forum/view-thread/55091
смотрите тут: http.developer.nvidia.com/GPUGems2/gpugems2_chapter12.html и тут: www.pathofexile.com/forum/view-thread/55091
Sign up to leave a comment.
Бесконечные неповторяющиеся текстуры с помощью мозаики Вана