捕食者视觉:热视觉效果


在寻找最佳的热着色器实现时,我遇到了bgolus在Unity论坛中发布的matcap着色器-一个很好的起点。

我做了很多更改,以使模型在不同角度下看起来更加一致,将顶盖绑在顶点和法线上。 也就是说,实际上,这已不再是matcap了,但是我仍然想向这个着色器(从此开始)致敬。


我们将按顺序移动,首先是顶点功能:

1.对象的法线:

float3 v.normal; 

2.顶点的归一化位置,从模型的参考点开始

 float3 vertexN = normalize(v.vertex); 

3.这些值的向量积:

 float3 viewCross = cross(vertexN, v.normal); 

4.将crossproduct.xy减半并将其偏差以产生更均匀的结果

 o.cap = viewCross.xy * 0.5 + 0.5; 

片段功能

5.创建一个蒙版并乘以

 fixed4 m = tex2D(_Mask, i.uv); i.cap *= (1 - mg); 

6.将颜色纹理投影到结果上。 (我使用橙紫色样式,但可以使用更大的渐变色或其他颜色)


 fixed4 color = tex2D(_Matcap, i.cap); 

就是这样,热着色器已经准备就绪。 重要的一点是,您需要给它提供自己的标签,以便替换脚本正确设置它,因此请确保标签包含以下内容:

  Tags{ "ThermalVision" = "ThermalColors"} 

这是完整的着色器: Pastebin链接

着色器更换


为了使热着色器可以替换另一个着色器,您只需要在需要替换的着色器上粘贴相同的标签:

 Tags{ "ThermalVision" = "ThermalColors"} 

并确保为可替换着色器打开了所有必要的属性:

 _Mask("G = no thermal", 2D) = "black" {} _Matcap("Matcap", 2D) = "white" {} _Strength("Mask Strength", Range(0,2)) = 0.4 

要切换着色器,您需要添加第二个摄像头并调用它

 camera.SetReplacementShader(Shader, "NamedShader"); 



因此,创建一个新相机,并使其相对于主相机成为子代,然后重置位置和旋转,以使其位于相同的位置。


将其设置为纯色和黑色背景。


在“相机预览”中,您应该看到与普通相机相同的所有内容,只是没有天空盒,背景为黑色。

是时候更改着色器了,

添加Shader公共变量并将热效果着色器拖到该变量上。

然后将相机添加为新变量,并使用公共着色器和标签中给定的名称在Start调用SetReplacementShader

  public Shader ThermalShader; Camera cam; void Start() { cam = GetComponent<Camera>(); cam.SetReplacementShader(ThermalShader, "ThermalVision"); } 


开始之后,您应该只在替换了着色器的网格上看到热效应。

影像效果



在此阶段,热着色器清晰可见,但除此之外看不到其他任何东西。 为了将环境带回相机,我结合使用了DepthNormals纹理和不透明纹理作为图像效果。

图像效果着色器: 链接到Pastebin

将这个 简单的blit脚本 添加到热像仪中,并使用“图像效果”拖动着色器

我在热着色器中放置了相同的图像,但是可以使用另一个图像!

热视觉开关脚本



现在,只需在游戏中进行切换即可。



要切换布尔值变量(包括相机,执行替换和后处理的数量),请使用T键;要切换回来,请再次按T.。

最后,向热室添加一些后处理。 我添加了色差和景深。

这是热视觉切换脚本: 链接到Pastebin链接

(使用PPS 2时,您可能需要升级到后期处理堆栈的较新版本)

选配


如果您不想让效果穿透墙壁,则对于备用摄像机,将“单色”设置为“不清晰”。 如果您也希望天空盒也变黑,则在开关代码中,缓存天空盒材料并将其设置为null

 Private Material SkyboxMaterial; skyboxMaterial = RenderSettings.skybox; RenderSettings.skybox = null; 

然后在热效应关闭时返回:

 RenderSettings.skybox = skyboxMaterial; 



现在,它不再像游戏机制,而更像是简单的视觉效果。

如果您对说明不感兴趣,请快速入门


1.下载热效应着色器

2.下载替换的Toon着色器,或将其添加到自己的着色器"ThermalVision" = "ThermalColors"和变量_Matcap_Mask_Strength

3.创建第二个摄像机,作为主摄像机的子摄像机,将其设置为纯色,黑色背景

4. 使用具有Image Effect热着色器 ,创建一种材质,然后通过拖动该材质将ThermalBlit脚本添加到第二台相机。

5.添加ThermalController脚本,拖动热效果着色器,添加后处理量(可选)

6.按T打开视觉。 (应显示的内容必须替换为着色器)。

资源资源


热着色器代码: Pastebin链接

着色器代码替换Toon着色器: 链接到Pastebin

图像效果着色器代码: 链接到Pastebin

C#Blit脚本: Pastebin链接

C#热视觉开关脚本: 链接到Pastebin

Matcap图片:





有关可替换着色器的其他信息:

这是一个老视频,我首先从中了解到它们: 通过使Unity中的内容看起来不错来显示有关替换着色器的视频

Source: https://habr.com/ru/post/zh-CN482928/


All Articles