커스텀 데이터(Custom Data)
- 파티클 시스템의
Custom Data모듈에서 지정한 값을 쉐이더로 가져와 사용할 수 있다.
1. 파티클 시스템 설정
[1] Custom Data 모듈
-
Custom Data 모듈에 체크한다.
-
Mode를Vector또는Color로 설정한다. -
Vector로 설정한 경우, 사용할 채널 개수(Number of Components), 각 채널의 값을 지정한다.

[2] Renderer 모듈
Custom Vertex Streams에 체크한다.

-
우측 하단의
+버튼을 눌러 알맞은 커스텀 데이터를 목록에 추가한다. -
Custom Data 모듈에서 지정한 데이터를 정확히 추가해주어야 한다.
-
예시에서는 Custom Data 모듈에서
Custom1의x컴포넌트만 지정했으므로Custom1.x를 추가한다.

2. 쉐이더
[1] 쉐이더 코드
입력 어셈블리에서 들어오는 입력인 appdata,
버텍스 쉐이더에서 프래그먼트 쉐이더로 전달해주는 v2f 구조체의 내부 변수를
파티클 시스템의 Custom Vertex Streams에 맞게 수정해주어야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 color : COLOR;
float3 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float3 normal : NORMAL;
float4 color : COLOR;
float3 uv : TEXCOORD0;
};
원래 vertex, uv만 있었다면 normal, color를 각각 float3, float4로 추가해준다.
uv는 원래 float2였지만, Custom1.x가 TEXCOORD0.z로 명시되었으므로
uv를 float3로 수정하여 Custom1.x를 받을 수 있도록 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
// ...
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
// ...
return o;
}
버텍스 쉐이더 함수에서 원래 위와 같이 uv를 프래그먼트 쉐이더로 전달하고 있었다면,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
// ...
o.uv.xy = TRANSFORM_TEX(v.uv.xy, _MainTex);
o.uv.z = v.uv.z;
o.color = v.color;
// ...
return o;
}
uv는 3채널이 되었으므로 기존의 uv를 이렇게 uv.xy로 바꿔주고,
uv.z, color는 입력 어셈블리에서 전달받은 그대로 프래그먼트 쉐이더로 넘겨준다.
그리고 프래그먼트 쉐이더에서 알맞게 사용해주면 된다.
Vert/Frag 말고 서피스 쉐이더인 경우, 구조체가 둘이 아니라 하나라는 점만 다르고 똑같다.
그리고 어차피 서피스 함수는 프래그먼트 함수를 쓰듯 똑같이 해주면 된다.
[2] 앰플리파이 쉐이더

앰플리파이 쉐이더 에디터를 쓰는 경우, 더 쉽다.
Vertex Texcoord 노드의 설정에서 알맞게 타입을 변경해주고 가져다 쓰면 된다.
예시에서는 uv.z가 커스텀 데이터를 사용하므로 float3로 변경한 뒤 UVW 중에서 W를 사용하면 된다.
만약 TEXCOORD0이 아니라 TEXCOORD1로 들어오는 경우,
Vertex Texcoord 노드의 설정에서 UV Channel을 2로 변경해서 받아올 수 있다.