Mientras buscaba la mejor implementación del sombreador térmico, me encontré con un sombreador matcap publicado
por bgolus en los foros de Unity , un buen punto de partida.
Lo cambié mucho para que los modelos se vean más consistentes en diferentes ángulos, uniendo la tapa a los vértices y normales. Es decir, de hecho, esto ya no es matcap, pero todavía me gustaría rendir homenaje a este sombreador, desde el que todo comenzó.
Nos moveremos en orden, primero la función de vértice:
1. Normal del objeto:
float3 v.normal;
2. La posición normalizada del vértice, comienza desde el punto de referencia del modelo.
float3 vertexN = normalize(v.vertex);
3. El producto vectorial de estos valores:
float3 viewCross = cross(vertexN, v.normal);
4. Reduzca a la mitad el crossproduct.xy y el sesgo para crear un resultado más uniforme
o.cap = viewCross.xy * 0.5 + 0.5;
En función de fragmento
5. Crea una máscara y multiplica
fixed4 m = tex2D(_Mask, i.uv); i.cap *= (1 - mg);
6. Proyecte la textura de color sobre el resultado. (Uso el estilo naranja-violeta, pero puedes usar un degradado más grande u otra cosa)
fixed4 color = tex2D(_Matcap, i.cap);
Eso es todo, el sombreador térmico está listo; El punto importante es que debe darle su propia etiqueta para que el script de reemplazo lo establezca correctamente, así que asegúrese de que las etiquetas contengan esto:
Tags{ "ThermalVision" = "ThermalColors"}
Aquí está el sombreador completo: enlace de PastebinReemplazo de sombreador
Para que el sombreador térmico pueda reemplazar a otro, solo necesita aplicar la misma etiqueta al sombreador que debe reemplazarse:
Tags{ "ThermalVision" = "ThermalColors"}
Y asegúrese de que todas las propiedades necesarias estén abiertas para el sombreador reemplazable:
_Mask("G = no thermal", 2D) = "black" {} _Matcap("Matcap", 2D) = "white" {} _Strength("Mask Strength", Range(0,2)) = 0.4
Para cambiar el sombreador, debe agregar una segunda cámara y solicitarla.
camera.SetReplacementShader(Shader, "NamedShader");
.
Cree una nueva cámara y conviértala en un niño en relación con la cámara principal, y luego restablezca la posición y la rotación para que se ubiquen de la misma manera.
Configúrelo en Color sólido y un fondo negro.
En “Vista previa de la cámara”, debería ver todo igual que en una cámara normal, solo sin skybox, con un fondo negro.
Es hora de cambiar los sombreadores,
Agregue la variable pública
Shader
y arrastre el sombreador de efectos térmicos sobre ella.
Luego, agregue la cámara como una nueva variable y llame a
SetReplacementShader
en Comenzar usando el sombreador público y el nombre dado en las etiquetas
public Shader ThermalShader; Camera cam; void Start() { cam = GetComponent<Camera>(); cam.SetReplacementShader(ThermalShader, "ThermalVision"); }
Después de comenzar, debería ver el efecto térmico solo en mallas con un sombreador reemplazado.
Efecto de imagen
En esta etapa, el sombreador térmico es claramente visible, pero no hay nada visible aparte de él. Para devolver el entorno a la cámara, utilizo la textura DepthNormals como efecto de imagen en combinación con la textura opaca.
Sombreador de efectos de imagen: enlace a PastebinAgregue este sencillo script blit a la cámara térmica y arrastre el sombreador con Image Effect
Pongo la misma imagen que en el sombreador térmico, ¡pero puedes usar otra!
Script de cambio de visión térmica
Ahora solo cámbialo durante el juego.
Para cambiar la variable booleana, que incluye la cámara, realizar el reemplazo y la cantidad de procesamiento posterior, uso la tecla T. Para volver, presione T. nuevamente.
Para finalizar, agregue un poco de procesamiento posterior a la cámara térmica. Agregué Abberación cromática y Profundidad de campo.
Aquí está el script de cambio de visión térmica: enlace a Pastebin Link(Al usar PPS 2, es posible que deba actualizar a una versión más nueva de la pila de Postprocesamiento)Opcional
Si no desea que el efecto brille a través de las paredes, entonces para la cámara de reemplazo, configure "Color sólido" en "No borrar". Si desea que el skybox se vuelva negro también, entonces en el código del interruptor, guarde en caché el material del skybox y configúrelo como nulo
Private Material SkyboxMaterial; skyboxMaterial = RenderSettings.skybox; RenderSettings.skybox = null;
y luego devolverlo cuando el efecto térmico está desactivado:
RenderSettings.skybox = skyboxMaterial;
Ahora se parece menos a la mecánica de juego y más a un simple efecto visual.
Inicio rápido si no está interesado en explicaciones
1. Descargue el sombreador de efecto térmico
2. Descargue el sombreador Toon reemplazado O agréguelo a su propio sombreador
"ThermalVision" = "ThermalColors"
y las variables
_Matcap
,
_Mask
,
_Strength
.
3. Cree una segunda cámara, una hija para la principal, configúrela en Color sólido, Fondo negro
4. Tome el
sombreador térmico con efecto de imagen , cree un material y agregue el script ThermalBlit a esta segunda cámara arrastrando este material.
5. Agregue el script
ThermalController
, arrastre el sombreador de efectos térmicos, agregue la cantidad de procesamiento posterior (opcional)
6. Presione
T
para encender la visión. (Lo que se debe mostrar debe tener un sombreador reemplazado).
Recursos
Código de sombreador térmico: enlace de PastebinCódigo de sombreador que reemplaza al sombreador de Toon: enlace a PastebinCódigo de sombreador de efecto de imagen: enlace a PastebinC # Blit Script: Enlace PastebinScript de cambio de visión térmica C #: enlace a PastebinImágenes de matcap:
Información adicional sobre sombreadores reemplazables:Este es un video antiguo del que aprendí por primera vez sobre ellos:
video sobre sombreadores de reemplazo haciendo que las cosas se vean bien en Unity