Процедурные плитки с графикой шейдеров


Отказ от ответственности

Я сам новичок, когда дело доходит до разработки игр. Возможно, это не лучший способ сделать это, но я не смог найти другой метод в Интернете, так что это может помочь новичкам.

Если вы заметили какие-либо ошибки или у вас есть лучшие решения, пожалуйста, укажите на них в комментариях.

Цель

Итак, я хотел создать шейдер, то есть материал с повторяющейся текстурой, который я мог бы просто назначить на куб и затем изменить его размер, как мне захочется. Он должен был выглядеть одинаково на каждой стороне, а размер плитки должен был быть постоянным.

Чтобы было понятно с самого начала, насколько я знаю, это будет работать правильно, только если вы используете куб.

Создание текстуры

Для этого примера я решил создать простую текстуру с черной рамкой и маленьким кругом в центре с помощью узла Rectangle and Eclipse.

Я буду считать, что вы уже знаете, как создать шейдерный граф, назначить его материалу и назначить этот материал объекту.

Я также предполагаю, что эта часть не требует объяснений.

Вот текстура на измененном кубе.

Эффект черепицы

Создание эффекта черепицы довольно простое; все, что нам нужно, это узел Tiling And Offset, соединенный с узлом Fraction, который мы затем соединяем с узлами текстуры, в данном случае Rectangle и Eclipse.

Затем мы можем работать с тайлингом Vector2, чтобы выбрать количество тайлов. Существует также вектор смещения Vector2, но я не буду использовать его здесь.

Мы видим, что эффект работает, но это все равно не то, что мы хотим.

Делаем размер плитки постоянным

Это, конечно, самая сложная часть. Однако, поскольку в качестве объекта мы используем кубик с измененными размерами, мы можем использовать масштаб объекта для определения количества плиток.

Получить масштаб объекта в шейдерном графе довольно просто. Это одно из двух свойств, которые мы получаем из узла Object.

Итак, чтобы получить количество плиток на грани, мы можем разделить масштаб на размер плитки.

Для определения размера плитки я создал свойство Vector2. В этом примере я установил его на .8.

Вы, наверное, заметили, что есть одна небольшая проблема, масштаб — это свойство Vector3, а плитка — свойство Vector2, так как же нам выбрать, какие две оси нам нужны?

Для решения этой проблемы нам понадобится вектор нормали, который мы можем получить с помощью узла Normal Vector. Нормальный вектор перпендикулярен к граням текстуры. Это означает, что если мы инвертируем, а затем умножим вектор нормалей на масштаб, то получим Vector3 с неактуальной осью, равной нулю.

Убедитесь, что вы используете узел Absolute где-то в этом процессе, чтобы избежать отрицательных значений. Также установите пространство нормального вектора на Object. В противном случае вращение куба испортит ваши плитки.

Последнее, что нужно сделать, это просто удалить 0 из нашего Vector3, превратив его в Vector2, который мы можем подключить к тайлам.

Я не был уверен, как подойти к этой проблеме, поэтому я просто повторно использовал пользовательский узел, который я создал для чего-то другого, который принимает три входа и возвращает два самых больших.

Если вы хотите использовать тот же метод, что и я, создайте пользовательский узел, задайте ему три входа с плавающей величиной (A, B, C) и два выхода с плавающей величиной (X, Y). Установите тип String и поместите этот код в Body.

bool a = A < B;

if (a) {
bool c=C<A;
Y=B;
X=c?A:C;
}

else {
bool b=C>B;
X=A;
Y=b?C:B;
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Вот и все! Теперь наш куб покрыт одинаково большими плитками. И мы можем использовать этот шейдер для создания стен, пола и прочего.

Вот моя реализация последней части.

А это наш куб. 😀

Если вы хотите, чтобы плитки идеально прилегали к поверхности, то есть не было обрезанных плиток (как на картинке), убедитесь, что размер куба кратен размеру плитки.

Спасибо за чтение!

Оцените статью
devanswers.ru
Добавить комментарий