在寻找最佳的热着色器实现时,我遇到了
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图像效果着色器代码: 链接到PastebinC#Blit脚本: Pastebin链接C#热视觉开关脚本: 链接到PastebinMatcap图片:
有关可替换着色器的其他信息:这是一个老视频,我首先从中了解到它们:
通过使Unity中的内容看起来不错来显示有关替换着色器的视频