Unity可视化Shader工具ASE介绍——7、ASE实现Matcap效果和自定义节点

阿赵的Unity可视化Shader工具ASE介绍目录

大家好,我是阿赵。继续介绍Unity可视化Shader编辑工具ASE。上一篇用了很长的篇幅来做了一个遮挡X光的效果。这一篇来做一个MatCap效果。不过做MatCap并不是目的,是想说明一下,怎样在ASE里面自定义方法节点。

一、在ASE里面做MatCap材质

由于在上一篇里面说得比较详细,所以一些小操作在这一篇就不会很啰嗦,稍微说得快一点。

先把上一篇的模型找出来,然后建一个叫做Matcap的Unlit模板shader。然后把之前的漫反射贴图部分的节点拷贝过来。于是现在有了这样的效果:

在这个基础上,继续做MatCap效果。

MatCap效果的原理是normalView.xy*0.5+0.5,然后作为UV坐标采样MatCap贴图。如果不明白原理,可以在我的CSDN博客搜索一下,有2篇文章专门说明了MatCap的做法,这里就不重复了。

先来获得观察空间的法线方向:

然后乘以0.5再加上0.5

建一个贴图采样节点,命名为matcapTex,然后把刚才算出的uv值连到matcapTex的uv入口

最后,把原来的漫反射颜色,加上matcapTex的颜色,输入到FragColor

这时候,这个 Shader已经做完了,保存Shader,然后在材质球赋予一张MatCap贴图:

这时候模型就已经有了MatCap效果了

为了可以控制MatCap的范围和强度,增加两个参数,用先乘再power的方式连接

通过控制这两个参数,就能调整MatCap的效果。

二、自定义节点

在模拟假高光效果的时候,MatCap算是一个很常用的效果。但如果每次都需要像上面的例子一样连接一次MatCap效果,感觉很麻烦。如果能把MatCap做出一个节点就好了。

这是可以的,接下来看看怎样实现把自己的效果做成自定义节点。

先创建一个Amplify Shader Function。

这里我命名为azhapMatCap。建好之后,打开的效果和新建一个Shader时差不多, 只有一个输出节点。

接下来回到之前做的MatCap的Shader里面,稍微修改一下,把输入的Matcap贴图从TextureSampler改成新增一个TextureObject来输入。

然后把这些和MatCap相关的节点全部选择,ctrl+c复制。

然后到新建的自定义节点azhaoMatCap里面,把这些节点复制进去,并把输出的结果连接到output里面。

我们来思考一下,一个节点一般会有输入和输出,现在输出有了,我们需要输入哪些参数才能让这个节点可以自由控制呢?这个例子有这些参数可以输入:

1.MatCap贴图

2.WorldNormal世界法线方向

3.MatCapIntensity控制MatCap的强度

4.MatCapPow控制MatCap的范围

于是开始修改这个自定义节点。搜索input,可以找到Function Input节点

选择这个输入节点,在属性栏里面可以看到,可以修改属性的名称,还有类型。

这个新建的输入节点我打算用来做MatCap贴图的输入,所以我把名字改成matcapTex,然后把类型改成Sampler2D,并把原来的TextureObject节点删掉,用这个输入节点代替,连接到TextureSampler节点。

接下来,按照设想,通过新建3个输入节点,把worldNormal、MatCapIntensity和MatCapPowMatCapPow替代了。

接下来,保存这个节点。然后回到之前做的MatCap的shader节点编辑界面。

右键搜索azhaoMatCap,可以看到已经有刚才新建的节点可以选择了

可以看到这个节点,有4个输入,一个输出。那四个输入的,就是我们刚才新建的Input节点了。把之前的代码删掉,然后输入这个四个节点,并把output输入到之前的结果里面。

发现得到的结果和之前一样的。所以这个节点是成功的。

接下来有一些优化的空间:

现在返回的节点只有一个output,首先output这个名字比较不好看,不清楚含义,然后有些节点可以有多个输出,这是怎样实现?

回到自定义节点azhaoMatCap,选择output,发现在属性栏可以改名字的,所以我这里把它改成RGBA。

然后再新建4个Output节点,命名为R、G、B、A,然后把前一步的结果用BreakToComponent拆分,连接到RGBA四个输出节点:

保存节点,回去MatCap编辑界面看看

发现刚才新增的输出接口都出现了。不过接口的顺序不太好看。其实这些输入和输出的接口顺序可以在自定义节点的下面指定顺序

调整一下顺序

然后节点的接口顺序就被调整过来了

到这里,这个azhaoMatCap的自定义节点就做完了。下次如果想复用MatCap效果,就可以直接创建这个节点,不需要重复拖节点了。

最后给一下这个自定义节点的源码,只要在项目内新建一个文本,把源码拷贝进去,然后重命名为azhaoMatCap.asset,应该就能变成自定义节点,可以打开编辑或者使用:

bash 复制代码
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 0}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3}
  m_Name: azhaoMatCap
  m_EditorClassIdentifier: 
  m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity
    Asset Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=18500\n195;310;1661;651;955.3268;334.6914;1.3;True;True\nNode;AmplifyShaderEditor.ViewMatrixNode;2;-1489.023,-20.07257;Inherit;False;0;1;FLOAT4x4;0\nNode;AmplifyShaderEditor.FunctionInput;13;-1073.171,-170.9945;Inherit;False;matcapTex;9;0;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.FunctionInput;16;-354.2866,132.0066;Inherit;False;MatCapPow;1;3;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;15;-615.2866,128.0066;Inherit;False;MatCapIntensity;1;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;14;-1489.287,144.0066;Inherit;False;worldNormal;3;1;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;10;-350.9913,-9.497155;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.PowerNode;11;-185.8009,-9.497064;Inherit;False;False;2;0;COLOR;0,0,0,0;False;1;FLOAT;1;False;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;6;-931.623,177.1276;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;4;-1276.023,45.92745;Inherit;False;2;2;0;FLOAT4x4;0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.RangedFloatNode;3;-1234.923,254.1276;Inherit;False;Constant;_Float0;Float
    0;2;0;Create;True;0;0;False;0;False;0.5;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;8;-784.1555,-96.65796;Inherit;True;Property;_matcapTex;matcapTex;2;0;Create;True;0;0;False;0;False;-1;None;d1adcd85d9c7bc646a30b7c1e4bb684b;True;0;False;black;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.BreakToComponentsNode;22;-41.42676,108.6085;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;5;-1079.223,91.12754;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;18;198.4805,-42.67558;Inherit;False;False;-1;R;1;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;19;200.8805,38.9244;Inherit;False;False;-1;G;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;21;197.7805,215.4245;Inherit;False;False;-1;A;4;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;182.2821,-166.8074;Inherit;False;True;-1;RGBA;0;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionOutput;20;197.0805,133.7243;Inherit;False;False;-1;B;3;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;10;0;8;0\nWireConnection;10;1;15;0\nWireConnection;11;0;10;0\nWireConnection;11;1;16;0\nWireConnection;6;0;5;0\nWireConnection;6;1;3;0\nWireConnection;4;0;2;0\nWireConnection;4;1;14;0\nWireConnection;8;0;13;0\nWireConnection;8;1;6;0\nWireConnection;22;0;11;0\nWireConnection;5;0;4;0\nWireConnection;5;1;3;0\nWireConnection;18;0;22;0\nWireConnection;19;0;22;1\nWireConnection;21;0;22;3\nWireConnection;0;0;11;0\nWireConnection;20;0;22;2\nASEEND*/\n//CHKSM=10A9D6D01C6AE2DB216075889F902D5308EDF5B1"
  m_functionName: 
  m_description: 
  m_additionalIncludes:
    m_additionalIncludes: []
    m_outsideIncludes: []
  m_additionalPragmas:
    m_additionalPragmas: []
    m_outsidePragmas: []
  m_additionalDirectives:
    m_validData: 0
    m_isDirty: 0
    m_moduleName: ' Additional Directives'
    m_independentModule: 1
    m_additionalDirectives: []
    m_shaderFunctionDirectives: []
    m_nativeDirectives: []
    m_nativeDirectivesIndex: -1
    m_nativeDirectivesFoldout: 0
    m_directivesSaveItems: []
  m_nodeCategory: 3
  m_customNodeCategory: 
  m_previewPosition: 0
  m_hidden: 0
相关推荐
牙膏上的小苏打23332 小时前
Unity Surround开关后导致获取主显示器分辨率错误
unity·主屏幕
Unity大海4 小时前
诠视科技Unity SDK开发环境配置、项目设置、apk打包。
科技·unity·游戏引擎
浅陌sss9 小时前
Unity中 粒子系统使用整理(一)
unity·游戏引擎
维度攻城狮14 小时前
实现在Unity3D中仿真汽车,而且还能使用ros2控制
python·unity·docker·汽车·ros2·rviz2
为你写首诗ge17 小时前
【Unity网络编程知识】FTP学习
网络·unity
神码编程19 小时前
【Unity】 HTFramework框架(六十四)SaveDataRuntime运行时保存组件参数、预制体
unity·编辑器·游戏引擎
菲fay20 小时前
Unity 单例模式写法
unity·单例模式
火一线1 天前
【Framework-Client系列】UIGenerate介绍
游戏·unity
ZKY_241 天前
【工具】Json在线解析工具
unity·json
ZKY_241 天前
【Unity】处理文字显示不全的问题
unity·游戏引擎