Node:Time
Node:Multiply
Node:Sine
Node:Remap
Node:Lerp
Node:OneMinus
Node:Branch
ShardGraph:基于时间的周期处理
ShardGraph:另一种过滤精灵Alpha方法
原始图和效果展示
Node:Time
功能定义
在Shader中提供访问时间单位的参数
端口介绍
代码生成
float Time_Time = _Time.y;
float Time_SineTime = _SinTime.w;
float Time_CosineTime = _CosTime.w;
float Time_DeltaTime = unity_DeltaTime.x;
float Time_SmoothDelta = unity_DeltaTime.z;
Node:Multiply
功能定义
返回A乘于B的结果,如果A和B是同一维度的向量,结果也是同维度;如果一个是Vector,另外一个是Martix,则返回Vector;如果一个是一维度另外一个是四维度,则返回四维度。
端口介绍
代码生成
Node:Sine
功能定义
返回输入值的正弦值
端口介绍
代码生成
void Unity_Sine_float4(float4 In, out float4 Out)
{
Out = sin(In);
}
Node:Remap
功能定义
Remap中文意思是重新映射,和Mathf.Clamp功能类似;限制一个数值的范围在[x,y]之间。限制输入的In最小值在In Min Max之间,输出值在Out Min Max之间。
端口介绍
代码生成
void Unity_Remap_float4(float4 In, float2 InMinMax, float2 OutMinMax, out float4 Out)
{
Out = OutMinMax.x + (In - InMinMax.x) * (OutMinMax.y - OutMinMax.x) / (InMinMax.y - InMinMax.x);
}
Node:Lerp
功能定义
返回基于T时间的进度[0,1]范围来取值A,B;如果T是0则取值A,如果T是1则取值B,如果T是0.5则取AB之间的值。
端口介绍
代码生成
void Unity_Lerp_float4(float4 A, float4 B, float4 T, out float4 Out)
{
Out = lerp(A, B, T);
}
Node:OneMinus
功能定义
返回输入的结果In通过1来相减
端口介绍
代码生成
void Unity_OneMinus_float4(float4 In, out float4 Out)
{
Out = 1 - In;
}
Node:Branch
功能定义
为Shader提供动态的分支;如果断言(Predicate)为真,则通过True来输入,反之False也成立;这个决策在Shader的每个顶点或每个像素阶段;两边的分支都会在Shader中计算,即使有一个分支永远无法输出。
端口介绍
代码生成
void Unity_Branch_float4(float Predicate, float4 True, float4 False, out float4 Out)
{
Out = lerp(False, True, Predicate);
}
ShardGraph:基于时间的周期处理
Thinking in logic
基于时间单位的周期处理
需要时间Time,通常会携带一个速度Vector1,Time进行输出,乘于速度方便调整
Time用Sine Time,NO!因为我们有携带速度,Sine Time是已经经过转换的速度,取值[-1,1];这个数据再和速度相乘没有 任何的意义,用普通Time,普通的Time是一个单位增量,1 2 3 … n;这个数据和速度搭配有意义;那么可以用Delta Time?
DeltaTime是每帧的执行时间间隔,1秒帧闪60下?没有意义
周期处理需要用到周期函数,Sine Cosine都可以,一个是正弦一个是余弦,功能上有一点差别,如果你想顺着来用正弦,你想倒着来则用余弦函数
正弦和余弦的取值都是[-1,1]
ShardGraph:另一种过滤精灵Alpha方法
上次实例的Alpha通道没有理清楚,这次又遇到,有了一些了解
无论是PBR还是Unit都有Alpha和AlphaClipThreshold字段输入端口
【0是全透明,1是不透明】
Alpha并不会改变纹理的透明度,只会作用于透明通道和自己功能AlphaClipThreshold;其实只有一个功能,给AlphaClipThreshold来当参数输入数值的,打前锋的
AlphaClipThreshold这个高大上的输入节点,开始剔除Alpha通道,如果低于上面输入的Alpha的值则不显示
显示预览图中,白色的是Alpha通道,白色的区域表示这里有其他颜色占领了,在Alpha通道中就变成了白色
不能直接剔除Alpha通道的区域,因为这块区域本来就是真实贴图内容,应该是剔除Alpha通道之外的区域
那么,Alpha的取值是[0,1];正常情况下的0要变成1,用1去相减就可以转换过来
最后取一个适中的值,不至于剔除太严重,>>>Alpha = 0.5
源码
新建一个文件,后缀为.shadergraph
{
"m_SerializedProperties": [
{
"typeInfo": {
"fullName": "UnityEditor.ShaderGraph.ColorShaderProperty"
},
"JSONnodeData": "{\n \"m_Value\": {\n \"r\": 0.0,\n \"g\": 0.0,\n \"b\": 0.0,\n \"a\": 0.0\n },\n \"m_Name\": \"Color\",\n \"m_GeneratePropertyBlock\": true,\n \"m_Guid\": {\n \"m_GuidSerialized\": \"4ca31b58-21c2-490d-940c-173e6ba2e55f\"\n },\n \"m_OverrideReferenceName\": \"\",\n \"m_ColorMode\": 0,\n \"m_Hidden\": false\n}"
},
{
"typeInfo": {
"fullName": "UnityEditor.ShaderGraph.Vector1ShaderProperty"
},
"JSONnodeData": "{\n \"m_Value\": 5.0,\n \"m_Name\": \"Speed\",\n \"m_GeneratePropertyBlock\": true,\n \"m_Guid\": {\n \"m_GuidSerialized\": \"82416e16-c90c-428a-9e5b-adadb1ba618d\"\n },\n \"m_OverrideReferenceName\": \"\",\n \"m_FloatType\": 0,\n \"m_RangeValues\": {\n \"x\": 0.0,\n \"y\": 1.0\n }\n}"
},
{
"typeInfo": {
"fullName": "UnityEditor.ShaderGraph.TextureShaderProperty"
},
"JSONnodeData": "{\n \"m_Value\": {\n \"m_SerializedTexture\": \"\",\n \"m_Guid\": \"0c8fd28e4403cae4db24f3320f7283dc\"\n },\n \"m_Name\": \"Texture2D\",\n \"m_GeneratePropertyBlock\": true,\n \"m_Guid\": {\n \"m_GuidSerialized\": \"aca9803b-8d12-4684-b70f-b99fa9c9c64d\"\n },\n \"m_OverrideReferenceName\": \"\",\n \"m_Modifiable\": true,\n \"m_DefaultType\": 0\n}"
},
{
"typeInfo": {
"fullName": "UnityEditor.ShaderGraph.BooleanShaderProperty"
},
"JSONnodeData": "{\n \"m_Value\": false,\n \"m_Name\": \"Branch\",\n \"m_GeneratePropertyBlock\": true,\n \"m_Guid\": {\n \"m_GuidSerialized\": \"116d4ca1-f251-4c54-aa5a-6a0d15449f72\"\n },\n \"m_OverrideReferenceName\": \"\"\n}"
}
],
"m_GUID": {
"m_GuidSerialized": "c6668da3-997c-4239-81a2-67efe3c928a9"
},
"m_SerializableNodes": [
{
"typeInfo": {
"fullName": "UnityEditor.ShaderGraph.UnlitMasterNode"
},
"JSONnodeData"