Unity3d: как растянуть (или разделить) шейдер между несколькими объектами - PullRequest
0 голосов
/ 20 марта 2020

Я возился с кубами, пытаясь построить вариации «типов блоков» (чтобы лучше познакомиться со способностями Unity, шейдерами, инструментами редактирования и т. Д. c).

У меня есть родовой c куб:

enter image description here

Что я хочу добавить материал / шейдер .. который у меня есть сделано (без проблем):

enter image description here

Что выглядит достаточно хорошо (для моих целей), когда это всего лишь один блок, но когда я их втыкаю, Мне не нравится эффект; Вы можете видеть отдельные блоки, а шейдер (который вы не видите на неподвижном изображении) на самом деле является анимированной водой, поэтому при анимации он выглядит ... довольно уродливо.

(плохо / нежелательно) enter image description here

Я пытаюсь растянуть или разделить шейдер / материал по всем выбранным блокам. См. Пример ниже (в данном случае я взял ОДИН блок и растянул его, но это не соответствует духу наличия отдельных блоков, поэтому тоже не то, что я хочу).

(лучше / более желательно) )

enter image description here

Я подумал, что следующее может помочь, но все они кажутся слишком сложными (я думаю, что я ошибаюсь )

  1. Имеют отдельные блоки, но растягивают одну плоскость через них и затем применяют материал.
  2. Я нашел примеры программно соединяющихся сеток, а затем применил материал / шейдер к одному объекту.
  3. Возьмите один блок и растяните его до необходимых размеров.
  4. Может быть (не уверен, что смогу), но у вас есть самолет с нанесенным на него водным материалом и вы используете блоки в качестве масок, чтобы показывать воду только для этих блоков? Не уверен, как это работает ...

В конце я надеюсь получить следующее:

  1. Отдельные блоки (чтобы я мог взаимодействовать с ними.
  2. Анимация / цвета шейдера распределяются между общими / подключенными блоками.
  3. Это не всегда будет сетка 2x3 ... она может быть диагональной или содержать странные формы соединенных блоков ...

(это все в режиме РЕДАКТОРА).

Есть мысли о том, как я могу подойти к этому?

1 Ответ

1 голос
/ 21 марта 2020

Фразы, которые вы можете попробовать найти: «преобразование из мирового пространства в ультрафиолетовое пространство», «преобразование ультрафиолетовых координат», «ультрафиолетовая математика». UV - это название координат в текстурах, из которых берется шейдер, и если вы берете уже существующий код шейдера, вы можете делать интересные вещи, изменяя используемые им UV. Одна из этих вещей позволяет вам «растянуть» его.

В вашем примере куба 2x3 вы могли бы сказать каждому кубу, что его значение U следует рассматривать как значение от 0 до 0,5 или от 0,5 до 1, а значение V - от 0 до 0,33 или от 0,33 до 0,67 или от 0,67 до 1, в зависимости от того, где он находится вместо того, чтобы каждый из них переходил от 0 до 1. Вы можете сделать это, установив свойство в шейдере, чтобы указать ему, где запускать ультрафиолет (a) и где закончить его уф (b), и вы скачок от (0,0) - (1,1) до a - b.

В моем ответе на другой вопрос используется некоторая логика c, аналогичная той, в которой сравнивается мировое положение пикселя с диапазоном мировых положений для получения УФ. Соответствующий код шейдера:

fixed4 colorizedMapUV = (IN.worldPos.xz-_WorldSpaceRange.xy) 
        / (_WorldSpaceRange.zw-_WorldSpaceRange.xy); 

Другой вариант - смотреть только на мировую позицию и полностью игнорировать представление о том, где должны быть «углы» ультрафиолета. Метод под названием «трипланарное отображение» может помочь вам найти решение, которое делает это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...