sam0delk1n пишет:
Здорово.
Спасибо, однако пока все еще не очень съедобно, лишь после сглаживания можно будет окончательно судить о результате.
sam0delk1n пишет:
Моё мнение ещё вот какое: вместо того чтобы делить тайл на четыре триса, лучше поделить его на два с возможностью выбирать в редакторе положение ребра которое будет делить тайл пополам (горизонтально или вертикально). Тогда например горы будут выглядеть лучше и вообще будет возможность создавать более сложные детали, меньшим количеством трисов.
Спорный вопрос, во первых в ручную возиться с гранями муторно, во вторых это лишние ветления в коде (хотя с другой стороны меньше трианглов - меньше итераций), в третьих менее точный результат, в простейшем случае когда лишь одна вершина поднята опущена по Z действительно два триангла лучше, но если у 2х-3х вершин разные координаты по Z? То там уже не 2 плоскости, с другой стороны 5я вершина сейчас берется как усредненная по 4м вершинам, из-за чего не всегда лучшим способом определяется, к примеру тут лучше бы дополнительная диагональ выглядела бы так
Но что более важно трианглы больше нужны как раз для интерполяции, в данном случае освещение строиться из нормалей к поверхностям (транглам), а при интерполяции оно будет определяться из нормалей к граням и вершинам.
sam0delk1n пишет:
А что касается сглаживания: можно конечно интерполировать нормали, учитывая соседние трисы, а можно сделать проще -- делать выборку нормалей из normal map
В случае честного 3д это конечно хорошее решение, но не надо забывать что во первых у нас 2д, что дает возможность (а для оптимизации и требование) упростить и минимизировать расчеты, к примеру у меня как факта нет вектора определяющего положение камеры а вектор освещения является констатой для каждого тайла вне зависимости от его положения на экране. Собственно как и параллельные линии на плоскости в 2д изометрической проекции остаются параллельными, когда в перспективе сходятся как и положено в точку, ибо в зависимости от дальности геометрические размеры уменьшаются. В частности из-за этого даже физически возникает ряд сложностей для реализации алгоритмов применяемых в 3д. К примеру плоский тайл согласно томуже принципу изометрической проекции должен быть одинаково освещен в любом положении, но ведь освещенность определяется углом между векторами нормали и освещения.
А во вторых излишняя детализация и реалистичность тут не нужны, они не дадут значимого улучшения картинки (так как камеру вращать нельзя так что подвох и ошибку освещения заметить будет сложно), а возможно даже ухудшат картинку, опять же так как у нас 2д, главная цель освещения не выпендреж, а улучшение восприятие рельефа, т.е. подчеркивание склонов и спусков. Т.е. лучшим будет не более правильный и\или красивый вариант, а тот что позволяет лучше воспринимать объем рельефа. С этой точки зрения флат шейдинг даже лучше, правда конечно смотрится он через мерно "квадратно".
sam0delk1n пишет:
А вообще эта интерполяция в gpu аппаратная
Ну да я знаю что я изобретаю велосипед, правда есть и контра аргумент в случае 2д основное правило оптимизации это буфферизация и частичное обновление экрана, т.е. мне не потребуется по 100 раз в секунду рисовать рельеф с нуля. (хотя к слову оно и сейчас на моей машине на окне 2560х1440 под 200+ фпс дает, учитывая что это ручная обратка да еще на менеджмент языке очень даже не плохо)