【Unity】Shader学习笔记-粒子效果自定义数据
Shader制作
这里需要注意的是:
- 粒子系统的参数并不是直接将float类型的数据来当做参数,而是将不同通道的UV当做参数
- 当做通道的参数需要将
UV Set
设置为非0
源码(删除掉了注释和预编译):
1 | Shader "CustomizeInformation_ASE" |
代码解析(使用反推法):
可以通过
lerp
函数看出来,texCoord5
就是我们的UVSet=11
2
3
4
5
6fixed4 frag (v2f i ) : SV_Target
{
...
float2 lerpResult7 = lerp( ( uv_MainTexture + appendResult6 ) , temp_cast_0 , texCoord5.z);
...
}所以结构体
v2f
中的ase_texcoord2
存储的就是UVSet=11
2
3
4
5
6
7
8fixed4 frag (v2f i ) : SV_Target
{
...
float4 texCoord5 = i.ase_texcoord2;
...
float2 lerpResult7 = lerp( ( uv_MainTexture + appendResult6 ) , temp_cast_0 , texCoord5.z);
...
}结构体
v2f
中的ase_texcoord2
是从appdata
的ase_texcoord1
赋值过来的1
2
3
4
5
6v2f vert ( appdata v )
{
...
o.ase_texcoord2 = v.ase_texcoord1;
...
}还需要注意到结构体
appdata
中的ase_texcoord.zw
并没有被赋值(整个代码ase_texcoord
只使用过一次)1
2
3
4
5
6v2f vert ( appdata v )
{
...
o.ase_texcoord1.xy = v.ase_texcoord.xy;
...
}
粒子系统设置
勾选
Custom Vertex Streams
并按顺序添加UV2
和Custom1.xyzw
UV2(TEXCOORD0.zw)
:初始化appdata
中的ase_texcoord.zw
,对应代码解析的第四步Custom1.xyzw(TEXCOORD1.xyzw)
:将下一步的Custom1.xyzw
对应上appdata
中的ase_texcoord1
,对应代码解析的第三步
1
2
3
4
5
6
7
8struct appdata
{
float4 vertex : POSITION;
float4 color : COLOR;
float4 ase_texcoord : TEXCOORD0;
float4 ase_texcoord1 : TEXCOORD1;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
- 启动
Custom Data
,并添加Vector4
使用自定义参数
测试
- 经测试,U、V并不一定是只能控制X、Y方向的移动,可以控制其他数据。换句话说,这个节点已经与普通的UV坐标节点没有任何关系了,可以直接当做
Vector4
来使用。如下图连接,U控制流动,V控制透明,W、T控制X、Y方向的偏移
- 如果需要再添加一个参数,可以再添加一个UVSet=2的节点。并在粒子系统中添加
Custom2.xyzw(TEXCOORD2.xyzw)
。
- 也可以只用一个UV通道
- 只有一个UV通道,U、V当做普通的UV坐标了,所以只能用W和T
- 将
Custom1.x
映射到TEXCOORD.z
上
参考