버텍스 모디파이어 함수를 사용하면 버텍스 셰이더에서 커스텀 데이터를 계산한 후 픽셀 단위로 표면 셰이더 함수에 전달할 수도 있습니다. 동일한 컴파일 지시문 vertex:functionName이 사용되지만 함수는 inout appdata_full과 out Input이라는 두 개의 파라미터를 사용해야 합니다. 빌트인 값이 아닌 모든 입력 멤버를 채울 수 있습니다.
참고: 이 방식으로 사용되는 커스텀 입력 멤버는 ‘uv’로 시작하는 이름을 사용해서는 안 되며, 만약 그럴 경우 제대로 작동하지 않습니다.
아래 예시에서는 커스텀 float3 customColor 멤버를 정의하며 버텍스 함수에서 계산됩니다.
Shader "Example/Custom Vertex Data" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert vertex:vert
struct Input {
float2 uv_MainTex;
float3 customColor;
};
void vert (inout appdata_full v, out Input o) {
UNITY_INITIALIZE_OUTPUT(Input,o);
o.customColor = abs(v.normal);
}
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
o.Albedo *= IN.customColor;
}
ENDCG
}
Fallback "Diffuse"
}
이 예시에서 customColor는 노멀의 절댓값으로 설정됩니다.
더 실용적인 용도는 빌트인 입력 변수로 제공되지 않는 버텍스당 데이터를 계산하거나 셰이더 계산을 최적화하는 데 사용하는 것입니다. 예를 들어 표면 셰이더 픽셀당 계산하는 대신 게임 오브젝트의 버텍스에서 림 조명을 계산할 수 있습니다.