Unidad: aplique un efecto de imagen solo en una capa

8

Por favor considere esta simple escena.

ingrese la descripción de la imagen aquí

Se compone de 3 objetos de juego diferentes. 1 imagen de fondo + 1 imagen de personaje estática + 1 parte pequeña (con la mascota) que se cambia en tiempo de ejecución para realizar una animación.

ingrese la descripción de la imagen aquí

El fondo se representa con una cámara dedicada. El personaje (estático + anim) se representa con otra cámara dedicada. Ambas cámaras están configuradas en Profundidad solamente con una máscara de eliminación diferente (cada cámara representa solo su parte). Tenga en cuenta que la cámara a cargo del personaje tiene una profundidad mayor que la que está a cargo del fondo (es decir, el personaje se representa después del fondo).

Necesito aplicar un efecto de imagen solo en la cámara del personaje, pero no puedo encontrar una manera de que este efecto no afecte el fondo.

Ejemplo aquí con un efecto Vortex en la cámara del personaje.

ingrese la descripción de la imagen aquí

¿Cómo harías un truco así?

lvictorino
fuente

Respuestas:

8

El problema es que el efecto de imagen toma la pantalla actual después del render.

Como su cámara se procesa directamente en el backbuffer (solo borran la profundidad), el efecto de imagen se aplica a todo.

La solución puede ser:

  • Primero configure una cámara que tenga un color transparente, con un RenderTarget de configuración (puede crearla mediante un script para que tenga el mismo tamaño que su pantalla) y el proceso posterior deseado.
  • Configure una cámara en segundo lugar que represente su fondo, que sea claro para el color de fondo / skybox
  • Configure una cámara en tercer lugar, que no muestre nada (máscara de selección establecida en Nothing), borre nada y tenga el script AlphaBlit.cs adjunto. AlphaBlit necesita dos datos: un material que use AlphaBlit.shader y el rendertarget para combinar (necesitará asignarlo por script si lo creó por script en el primer paso)
  • Configura una cámara cuarta que represente tu personaje avanzado.

CUIDADO: este es un algoritmo de pintor. Lo que significa que todo el renderizado de la tercera cámara se renderiza sobre lo que ya está allí, y la cuarta cámara renderizará sobre eso.

No estoy seguro de que haya una manera de hacerlo mejor, ya que requeriría también distorsionar el búfer de profundidad, lo que no es posible ... (no sin renderizar directamente con un efecto de vórtice que es más difícil) ...

Por supuesto, la forma más optimizada de hacerlo sería no aplicar el postproceso en la primera cámara, sino simplemente hacer que se renderice en un rendertarget y modificar el sombreador AlphaBlit. para hacer el efecto de vórtice al bloquear ese RenderTarget. Pero eso es más complejo.

Sirithang
fuente
Gracias por tu respuesta. Tengo algunos problemas con "Renderizar una cámara con un script que simplemente hace en OnRenderImage un Blit de ese RenderTarget en el destino de renderizado de destino (es decir, el backbuffer aquí)". .. porque incluso si el color es negro transparente, todo es negro una vez que se borra.
lvictorino
respuesta editada con más precisión
Sirithang
El flujo de trabajo de la solución básica está bien, pero estoy enfrentando un problema inesperado con alfa aquí. En realidad quiero difuminar los niveles de primer plano. Esta solución funciona, pero se ve de alguna manera conectada. puu.sh/C6sSB/ca5d5162b0.jpg Si cambio el color de las banderas claras a Magenta con 0 transparencias, tiene un extraño contorno magenta a los lados (debería ser simplemente transparente). puu.sh/C6sSB/ca5d5162b0.jpg . Esto hace que toda la solución no funcione para mí. No estoy realmente seguro de por qué sucede esto. Cambiar banderas claras no ayuda.
AvrDragon