使用顶点修改器函数,也可以在顶点着色器在 GPU 上运行的程序。 更多信息
参见 术语表中计算自定义数据,然后将该数据传递给每个像素的表面着色器用于内置渲染管线的简化着色器编写方式。 更多信息
参见 术语表函数。 使用相同的编译指令vertex:functionName
,但函数应采用两个参数:inout appdata_full
和 out Input
。 你可以填充任何不是内置值的 Input 成员。
注意: 以这种方式使用的自定义 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
被设置为法线的绝对值
更实际的应用可能是计算任何不在内置 Input 变量中提供的每个顶点数据;或优化着色器计算。 例如,可以在游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、路径点等。 游戏对象的功能由附加在其上的组件定义。 更多信息
参见 术语表的顶点处计算边缘光,而不是在表面着色器中每个像素执行此操作。