09.Unity ShaderGraph实例(LWRP+UnitMaster节点制作自发光效果的精灵)

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"
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值