Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / OpenGL динамическое текстурирование тайлового ландшафта

OpenGL динамическое текстурирование тайлового ландшафта

Джек АллигаторПостоялецwww13 авг. 20170:01#0
Есть карта высот и карта покрытий.
+ Показать

В карте покрытий по (х,у) можно получить id текстуры тайла по заданным координатам.
Цель - получить ландшафт, в котором в любой момент времени можно изменить текстуру произвольного тайла.
Пока что экспериментирую на квадратных тайлах, а вообще алгоритм не должен зависеть от формы тайла, т.к. в будущем перенесу всё это на сферу с пентагонами+гексагонами.
Текстур может быть десятки, а может сотни - ограничимся максимумом в 16 пока что.
Алгоритм не должен зависеть от меша, тк сетка будет тесселироваться в зависимости от расстояния до камеры.

Из-за последнего требования решил делать всё через фрагментный шейдер. В карте покрытий меняю цвета на нужные индексы. Загружаю на гпу как одноканальную текстуру без фильтрации. Идея простая - изменять текстуру произвольного тайла можно перезаписав нужный индекс в карте через glTexSubImage2D.
Во фрагментном шейдере сэмплится по x,y фрагмента - получили индекс текстуры из этой карты. Затем уже по индексу текстуры из GL_TEXTURE_2D_ARRAY выбирается и рисуется нужная текстура.

Получился привет из 90х:

+ Показать

Надо сгладить. Единственное, что смог придумать, сглаживать повершинно, через интерполяцию. Но получилось по-дэбильному, понимаю что так делать нельзя(см. код). К тому же, при увеличении кол-ва текстур фпс вообще до нуля спустится.

+ Показать

+ шейдера

Вопросы:
1. Что-то с идеями у меня туго, ничего лучше вышеописанного не могу придумать. Как ещё можно произвольно менять текстуру тайла?
2. Как правильно смешивать текстуры в таком случае?
3. Запросил GL_MAX_ARRAY_TEXTURE_LAYERS, выдало 2048 - это реально чтоль можно тысячи текстур за проход сэмплить и накладывать? чето во всех уроках по мультитекстурам утверждается, что не больше 16

strategoПостоялецwww13 авг. 20179:41#1
3 - Это сколько текстур можно в массив запихнуть, и то если памяти хватит
strategoПостоялецwww13 авг. 20179:46#2
Я бы просто брал текстуру и ничего не смешивал, а переходы между тайлами, надо делать на основе какой то маски, или переходные тайлы рисовать. Потому что смешивание сотни тайлов и сотня выборок из текстуру пожалуй сведут на нет всю производительность )) Ели до сотен айлов доведёшь )
Panzerschrek[CN]Участникwww13 авг. 201710:28#3
Джек Аллигатор
Делал как-то раз примерно так:

Есть сетка некой формы. Есть текстура с номерами тайлов в каждой клетке. Есть массив текстур (GL_ARRAY_TEXTURE), содержащий эти тайлы.
Во фрагментном шейдере по координатам вычисляется позиция в карте, определяются 4 текстуры для данного места и их веса. Делается выборка из этих четырёх текстур и суммируется с учётом весов.

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

Как это выглядело:

+ Показать

Шейдеры для всего этого дела. Они минифицированы, но разобраться, думаю, можно:

+ Показать

Правка: 13 авг. 2017 10:33

Джек АллигаторПостоялецwww13 авг. 201711:32#4
stratego
> Я бы просто брал текстуру и ничего не смешивал, а переходы между тайлами, надо
> делать на основе какой то маски, или переходные тайлы рисовать.
Слишком гемморно.

> Потому что смешивание сотни тайлов и сотня выборок из текстуру пожалуй сведут
> на нет всю производительность )) Ели до сотен айлов доведёшь )
Я пытаюсь повторить Medieval II Total War. Там более 70 текстур, текстура любого тайла может измениться, раз в несколько ходов северная часть ландшафта по карте климата заснеживается, и всё это с правильным смешиванием без масок. Уверен в этом тк никаких масок в ресурсах игры не нашел.

+ Показать
+ произвольная текстура выжженой земли под армией


Panzerschrek[CN]
Спасибо за развернутый ответ!
Простой и хитрый трюк у тебя, то что надо.

strategoПостоялецwww13 авг. 201716:19#5
Джек, покажи потом, что вышло - интересно, особенно когда будешь уже на сфере делать (тоже когда то была мысль замутить стратегию на целую планету из шестиугольников (20 пятиугольников планировал тупо закрыть горами - непроходимыми клетками), но я спёкся ещё на стадии системы координат)
Джек АллигаторПостоялецwww13 авг. 201716:48#6
На самом деле сфера - меньшая из проблем. Ещё зимой сделал планету из гексов. По гексам можно кликать - есть попиксельное отслеживание курсора мыши. На кляксы по углам не обращай внимания - это я тестил интефрейс.
+ Показать

С пентагонами проблем нет, с точки зрения движка форма тайлов не имеет значения.
Сначала думал сделать всё в лоб - каждый тайл отрисовывается независимо от остальных, у каждого свой меш и своя текстура. Но таким образом удается отобразить максимум 10к тайлов, больше - существенное снижение фпс + потребление гигабайтов памяти. К тому же, не было продумано произвольное изменение текстур, рисование границ регионов и рек и тд. Кароче думал только о гексах, получил сферические гексы в вакууме, которые ни для чего кроме этой демки неприменимы.

В начале августа вернулся к проекту и поставил себе четкую цель - делать игру а не технодемку. Отсюда и желание повторить карту М2ТВ.
Переосмыслил всё, пришел к идее что надо отделить сетку от текстур, всё что касается тайлов отображать на текстурах, а сетка будет жить своей жизнью. Потому как рисовать каждый тайл отдельно нереально - их число будет приближаться к миллону, а то и больше.
Вот тесселированный икосаэдр:

+ Показать

На гпу грузится лишь 12 вершин и 20*3 индексов треугольников, остальное - достраивается в реалтайме.
Что касается клика по тайлу - отслеживать одновременно все тайлы нет необходимости т.к. такова специфика геймплея, поэтому пока что забил на это.

Затем думал что делать с текстурой. Тут уперся в проблему маппинга текстуры на икосаэдр. Простейший способ замапить текстуру материков Земли - проекция Димаксиона. Но всё равно неочевидно, что делать с этим дальше.
Порылся в закладках - обнаружил, что гуру по гексам написал новую статью, как раз на нужную мне тему: http://www.redblobgames.com/x/1640-hexagon-tiling-of-sphere/
Лучше материала представить невозможно. Особенно заинтересовал метод Flat rendering - это на случай, если со сферой ничего не выйдет. Но трехмерная сфера в приоритете, да и не вижу ничего сложного в её реализации.

Решил сначала разобраться в деталях рендеринга М2ТВ не запариваясь по гексам и сфере, а когда всё будет готово - свести всё воедино.
Благодаря Panzerschrek[CN] осилил смешивание текстур, фпс не проседает, качество отличное(для прототипа):

+ Показать

На очереди - рендеринг рек, границ регионов и дорог.
Порылся в исходниках М2ТВ и что-то кажется, там дороги отрисовываются процедурно, по сплайнам или кривым безье. А затем накладываются на карту подобно тому, как рендерятся декали.

+ Показать

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

Что мне более всего интересно в рендеринге М2ТВ - там в меш ландшафта встраиваются кастомные меши гор, вулканов, берегов, рек и пр.
Там прям в ресурсах игры по пути data/terrain/aerial_map/tile_models лежат модельки, так что это не догадки а точный факт.
Никак не могу понять как это происходит. В чем-то созвучно с проблемой встраивания пещер из соседней темы. Впрочем, пока что особо и не надо - для прототипирования геймплея хватит и того, что есть на данный момент.

+ вулканы

Правка: 13 авг. 2017 16:57

slava_mibМодераторwww13 авг. 201720:24#7
> Я пытаюсь повторить Medieval II Total War. Там более 70 текстур
Джек Аллигатор, если надо то, что на скрине - мне кажется, можно любой метод вообще, включая чисто ЦПУшные - слишком низкая нагрузка, её даже калькулятор разрулить сможет.

Если же надо что-то более сложное - то Panzerschrek[CN] Написал верный метод. Я юзаю такой же, работает отлично. 30+ текстур тянет норм, больше - не пробовал.

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

2001—2018 © GameDev.ru — Разработка игр