【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.xyzwUV2(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上

参考