Unity — как показать холст мирового пространства над холстом наложения экрана?

#c# #unity3d #user-interface #canvas

#c# #unity3d

Вопрос:

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

Мне нужно сделать переключатель, в котором у меня все еще есть размытый фон и кнопка возврата, но сверху у меня есть холст мирового пространства («текстовые» объекты ниже):

введите описание изображения здесь

Установка флажков clear на none на второй камере позволяет мне видеть то, что видит первая камера, но не ее холст. Является ли здесь лучшим вариантом для захвата экрана холста первой камеры?

Или есть способ не заставлять холст экранного пространства блокировать мировое пространство?

Комментарии:

1. Вы можете добавить к нему CanvasGroup и временно отключить его.

2. Часть проблемы здесь заключается в том, как вы хотите, чтобы холсты мирового пространства и другие объекты мирового пространства вели себя. Например, если у вас есть камень, затем холст, затем еще один камень, частично друг за другом, тогда вы хотите, чтобы оба камня были размыты, но не холст? Если это так, у вас проблема, поскольку эти холсты мирового пространства отображаются в том же проходе, что и камни; поэтому вам нужен какой-то шейдер для последующей обработки, чтобы специально не размывать холсты… когда они видны.

Ответ №1:

Итак, если я вас правильно понял, у вас есть 2 камеры, скажем:

  • MainCamera : для отображения 3D-контента
  • ScreenSpaceCamera : для отображения только этой «плоскости» экранного пространства.

и что вы хотите: всегда отображать 3D-контент поверх содержимого ScreenSpace, верно?


Итак, что вы можете сделать, это создать специальный слой, например ScreenSpace , и чем

  • MainCamera -> Camera :
  • Depth = 0 (более высокое значение означает, что оно нарисовано сверху)
  • ClearFlags = DepthOnly
  • CullingMask = Все, кроме ScreenSpace

введите описание изображения здесь

  • ScreenSpaceCamera -> Camera :
  • Depth = -1 (таким образом, он нарисован за уровнем глубины 0)
  • ClearFlags = Ничего (или что угодно)
  • CullingMask = только ScreenSpace

введите описание изображения здесь


Как вы можете видеть теперь, 3D-контент (повторное изображение) всегда отображается поверх экранного пространства (белого).

введите описание изображения здесь


Примечание: если вы хотите иметь возможность включать Screenspace и выключать его, вам нужна дополнительная камера, которая фактически очищает изображение! Как вы можете видеть в буфере Camera Preview этой камеры, он не «очищен» (потому что мы так сказали).

Итак, если вы отключите Screenspace , вы получите то, что видите в окне предварительного просмотра! -> нехорошо ^^

Я бы просто добавил 3-ю камеру, например BackgroundCamera , как дочернюю MainCamera (чтобы она автоматически перемещалась правильно), и передал ее

  • Depth = -2 (так что за экранным пространством)
  • ClearFlags = например SkyBox
  • CullingMask = Ничего (так что вы действительно отображаете здесь только фон)

Если вы имеете в виду что-то более сложное, например,

  • пользовательский интерфейс ontop (глубина 0)
  • Экранное пространство (глубина -1)
  • другой 3D-контент
    позволяет им отображаться с помощью ScreenSpaceCamera instead . Поэтому, если вы деактивируете холст размытия, они отображаются нормально, в противном случае размыто.
  • Фон (глубина -2)

просто расширьте пример с помощью 4 камер, глубин и разных слоев.

Комментарии:

1. Спасибо. Теперь единственная проблема в том, что 3D-мир, который у меня есть за моими 3D-элементами пользовательского интерфейса, по-прежнему интерактивный. Есть ли способ отключить взаимодействие с тем, что видит камера 1?

2. Хм, это в значительной степени зависит от того, как именно вы взаимодействуете с материалом…. Это материал пользовательского интерфейса afaik, если вы отключите Raycaster компонент на камере, вы больше не сможете с ним взаимодействовать, но я не уверен