Продолжение поста «Как я создавал ландшафт в unity по реальным геоданным»
Вобщем настало время все это безобразие покрыть текстурами. Идея в том, что надо как-то покрывать все это разными текстурами, а если точнее, то делать привязку по высотам (для начала) . И вот тут я решил, что надо сразу заложить оптимизацию, ибо множество текстур для разных высот да плюс еще карты нормалей и все такое, вобщем надо чтобы не тормозило. Было приято решение передавать в шейдер не отдельные текстуры а массивы текстур. Итак, первая проблема, надо написать механизм который создаст карту слоев, на основании настроек привязки к высотам. Я решил, что буду делать одну большую текстуру и передавать в нее данные смещения для текселей и размер области выборки тайла. Это позволит передать в шейдер сразу всю карту. Так, значит скрипт в Unity генерирует текстуру R8, т.е. это одноканальное изображение с 255 значениями на пиксел, что по моей задумке будет указателем на индекс текстуры в массиве. Ну или проще говоря, мы будем делать семпл каждого текселя в слое с индексом взятым из карты слоев.
Аналогичным образом, очевидно надо строить и карту смешивания, потому что без смешивания мы видим резкие переходы. Тут меня ждал небольшой сюрприз. Дело в том, что мне надо как-то передать в шейдер, где "заканчивается" область одного слоя, и начинается область другого. Пока я остановился на том, что буду так-же генерировать еще одноканальную R8 текстуру (карту смешивания) которая будет содержать данные о "силе" пикселя, наверное это просто аналог альфа-канала. Значит, я делаю семпл для конкретного текселя из карты смешивания, и если значение больше 0, то делаю интерполяцию с нижним слоем... Ну это в теории, на практике пока это все еще не заработало
Все эти сложности и хитрости, мною задуманы исключительно ради оптимизации семплов, потому что я к примеру пробовал делать подобное на стандартном Terrain от Unity, и тормоза выхвали не слабые)
АААААА, точно, я ж еще и стохастическое семплирование прикрутил, так что это еще +3 семпла на тексель для текстуры и карты нормалей. так что думаю я еще отказаться от интерполяции между слоями, в пользу дезеринга ( https://ru.wikipedia.org/wiki/Дизеринг )
Это позволит экономит один-два семпла...поглядим
ну и вот видео-отчет: