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

Итак, многие из нас знают о трёх подходах работы с материалами и текстурами. Коснёмся преимуществ и недостатков каждого из них.

1111 показов
10K10K открытий
11 репост

1) Если значения можно выразить константами - делай это, вариативность обеспечивается массивами с индексами нужных значений в нем. Массив может быть хоть из матриц (что, кстати удобно, например, для анимации прямо в шейдере)
Так же лучше умножать на константу, чем делить, т.к. процесс умножения для любых процессоров проще, тем более что шейдеры вызываются каждый кадр для каждого пикселя (если это пиксельный шейдер).

2) Возвращаясь к теме массивов. Если нужно как-то пометить сетку, то лучше custom id. Там аж vec4, чего хватит на всё что угодно. Значение, скажем, vec4.x  можно пользовать, чтобы хранить индексы огромного числа материалов.(правда придется покапаться в инстансмеше уже на CPU).

3) Ну и собственно UV нужна только одна, просто в вертексном (если это возможно) шейдере по условию смещаем координаты в ту область, которую укажем в массиве по индексу.

Вот тогда да: "Один атлас, чтобы править всеми")))

Ответить

Мне нужно ещё иметь удобный рабочий процесс и 2 UV подходят как нельзя лучше. Насколько я знаю, в годот нельзя получить в шейдерах доступ к кастомным ид и прочим прелестям. Вертекс колор у меня уже занят. Да и, повторюсь, рабочий процесс с двумя UV  в блендере интуитивно понятен и прост.
Технически можно всё запихнуть в 1 UV, если сильно нужно. Например, номер тайла записать в целую часть, а сама UV не должна выходить за рамки 0...1 (этого хватит, так как один тайл до этих рамок можно масштабировать аж в 8 раз). Но это лениво и лишние движения при импорте.

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

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

Если же в годоте использовать просто текстуру, то это убьёт мипмаппинг и фильтрацию. И ничего с этим не поделать. Можно попытаться использовать вручную сгенерированные мипмапы, но стоит ли игра свеч?

Ответить