一、访问顶点颜色
Shader "Cookbook/Chapter07/SimpleVertexColor" { Properties { _MainTint("Global Color Tint", Color) = (1,1,1,1) } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Lambert vertex:vert float4 _MainTint; struct Input { float2 uv_MainTex; float4 vertColor; }; void vert(inout appdata_full v, out Input o) { UNITY_INITIALIZE_OUTPUT(Input, o); o.vertColor = v.color; } void surf (Input IN, inout SurfaceOutput o) { o.Albedo = IN.vertColor.rgb * _MainTint.rgb; } ENDCG } FallBack "Diffuse" }
二、顶点动画
Shader "Cookbook/Chapter07/VertexAnimation" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _tintAmount ("Tint Amount", Range(0,1)) = 0.5 _ColorA ("Color A", Color) = (1,1,1,1) _ColorB ("Color B", Color) = (1,1,1,1) _Speed ("Wave Speed", Range(0.1, 80)) = 5 _Frequency ("Wave Frequency", Range(0, 5)) = 2 _Amplitude ("Wave Amplitude", Range(-1, 1)) = 1 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Lambert vertex:vert sampler2D _MainTex; float4 _ColorA; float4 _ColorB; float _tintAmount; float _Speed; float _Frequency; float _Amplitude; float _OffsetVal; struct Input { float2 uv_MainTex; float3 vertColor; }; void vert(inout appdata_full v, out Input o) { UNITY_INITIALIZE_OUTPUT(Input, o); float time = _Time * _Speed; float waveValueA = sin(time + v.vertex.x * _Frequency) * _Amplitude; v.vertex.xyz = float3(v.vertex.x, v.vertex.y + waveValueA, v.vertex.z); v.normal = normalize(float3(v.normal.x + waveValueA, v.normal.y, v.normal.z)); o.vertColor = float3(waveValueA,waveValueA,waveValueA); } void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D (_MainTex, IN.uv_MainTex); float3 tintColor = lerp(_ColorA, _ColorB, IN.vertColor).rgb; o.Albedo = c.rgb * (tintColor * _tintAmount); o.Alpha = c.a; } ENDCG } FallBack "Diffuse" }
三、顶点颜色混合
Shader "Cookbook/Chapter07/VertexHeightMapBlend" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _SecondaryTex ("Secondary Texture", 2D) = "white"{} _HeightMap ("HeightMap", 2D) = "white" {} _Value ("Value", Range(1, 20)) = 3 _Switch ("Swtich", Float) = 0 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Lambert vertex:vert sampler2D _MainTex; sampler2D _SecondaryTex; sampler2D _HeightMap; float _Value; float _Switch; struct Input { float2 uv_MainTex; float2 uv_SecondaryTex; float3 vertColor; }; void vert (inout appdata_full v, out Input o) { UNITY_INITIALIZE_OUTPUT(Input, o); o.vertColor = v.color.rgb; } void surf (Input IN, inout SurfaceOutput o) { //Sample our textures half4 base = tex2D (_MainTex, IN.uv_MainTex); half4 secondTex = tex2D (_SecondaryTex, IN.uv_SecondaryTex); float4 height = tex2D(_HeightMap, IN.uv_MainTex); //perform blending float redChannel = 1-IN.vertColor.r; float rHeight = height.r * redChannel; float invertHeight = 1-height.r; float finalHeight = (invertHeight * redChannel)*4; float finalBlend = saturate(rHeight + finalHeight + pow(IN.vertColor.b, _Value)); //Lets create more detail in how the vertex colors //blend. Either very hard edge or very soft. float hardness = ((1-IN.vertColor.g) * _Value)+1; finalBlend = pow(finalBlend, hardness); //Produce the final color float3 finalColor = lerp(base, secondTex, finalBlend); if(_Switch == 0) { o.Albedo = finalColor; } else { o.Albedo = IN.vertColor; } o.Alpha = base.a; } ENDCG } FallBack "Diffuse" }