Unity: применить эффект изображения только на один слой

8

Пожалуйста, рассмотрите эту простую сцену.

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

Он состоит из 3 разных игровых объектов. 1 фоновое изображение + 1 статичное изображение персонажа + 1 небольшая часть (с домашним животным), которая изменяется во время выполнения для выполнения анимации.

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

Фон отображается с помощью специальной камеры. Символ (статический + аним) отображается с помощью другой выделенной камеры. Обе камеры установлены на глубину только с различной маской отбора (каждая камера отображает только свою часть). Обратите внимание, что камера, отвечающая за персонажа, имеет большую глубину, чем камера, отвечающая за фон (т.е. персонаж отображается после фона).

Мне нужно применить эффект изображения только к камере персонажа, но я не могу найти способ, чтобы этот эффект не влиял на фон.

Пример здесь с эффектом Vortex на камеру персонажа.

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

Как бы вы сделали такой трюк?

lvictorino
источник

Ответы:

8

Проблема в том, что эффект изображения захватывает текущий экран после рендера.

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

Решение может быть:

  • Сначала настройте камеру с прозрачным цветом, с помощью настройки RenderTarget (вы можете создать ее по сценарию, чтобы она была такого же размера, как ваш экран) и требуемого постобработки.
  • Установите секунду камеры, которая отрисовывает ваш фон, который становится ясным для цвета фона / скайбокс
  • Настройте третью камеру, которая ничего не рендерит (маска отбраковки установлена ​​на Nothing), ничего не очищайте и к ней прикреплен скрипт AlphaBlit.cs . AlphaBlit нужно две информации: материал, который использует AlphaBlit.shader и rendertarget для смешивания (вам нужно будет назначить его по сценарию, если вы создали его по сценарию на 1-м шаге)
  • Настройте четвертую камеру, которая отображает вашего прямого персонажа.

ОСТОРОЖНО: это алгоритм художника. Это означает, что все рендеринг третьей камеры визуализируется поверх того, что уже есть, а четвертая камера рендерит поверх этого.

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

Конечно, более оптимизированный способ сделать это состоит в том, чтобы не применять постпроцесс на 1-й камере, а просто заставить его визуализировать в объекте rendertarget и изменить AlphaBlit.shader, чтобы он создавал эффект вихря, когда он скрывает RenderTarget. Но это сложнее.

Sirithang
источник
Спасибо за Ваш ответ. У меня есть некоторые проблемы с «Рендерингом камеры с помощью скрипта, который просто выполняет в OnRenderImage Blit этого RenderTarget в целевую цель рендеринга (т. Е. В буфер)» .. потому что даже если цвет прозрачный черный, все черное один раз блит.
lvictorino
отредактированный ответ с большей точностью
Sirithang
Основной рабочий процесс решения в порядке, но я столкнулся с неожиданной проблемой с альфа здесь. На самом деле я хочу размыть передний план. Это решение работает, но выглядит как-то зашито. puu.sh/C6sSB/ca5d5162b0.jpg Если я изменю цвет прозрачных флагов на пурпурный с прозрачностью 0, у него будет странный пурпурный контур по бокам (должен быть просто прозрачным). puu.sh/C6sSB/ca5d5162b0.jpg . Это делает все решение не работает для меня. Я не совсем уверен, почему это происходит. Переключение флажков сброса не помогает.
AvrDragon