自己新建的shader ,使用在linerender或者Image等組件上面的時候,這些組件的顏色修改不能影響到材質球。lineRender的顏色漸變是很實用的功能。
lineRender顏色能夠改變材質顏色,是因爲LineRender修改了模型點的顏色。然後Shader通過這個顏色去混合材質球顏色就能實現LineRender控制材質顏色了。
頂點片段着色器可以在頂點片段中獲取頂點顏色,然後傳入片段着色器。
這裏主要說一下SurfaceShader,因爲不太常用到。
自定義頂點函數
#pragma surface surf Unlit vertex:vert noambient alpha
struct Input
{
float2 uv_MainTex;
float2 uv_EmissionMap;
float4 vertexcolor : COLOR;
};
void vert(inout appdata_full v,out Input o)
{
UNITY_INITIALIZE_OUTPUT(Input,o);
o.vertexcolor=v.color;
}
通過Input結構體中的vertextcolor傳遞頂點顏色。
UNITY_INITIALIZE_OUTPUT初始化一個Input結構體
Shader "Custom/lift"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_EmissionColor ("Color", Color) = (1,1,1,1)
_EmissionMap ("Emission", 2D) = "white" { }
_Opacity("Opacity", Range( 0 , 3)) = 1
[Toggle]_UseVertexColor ("UseVertexColor", float) = 1
}
SubShader
{
Tags {"RenderType"="Transparent" "Queue"= "Transparent"}
ZTest Off
CGPROGRAM
#pragma surface surf Unlit vertex:vert noambient alpha
#pragma target 3.0
sampler2D _MainTex;
sampler2D _EmissionMap;
fixed4 _Color;
fixed4 _EmissionColor;
float _Opacity;
float _UseVertexColor;
struct Input
{
float2 uv_MainTex;
float2 uv_EmissionMap;
float4 vertexcolor : COLOR;
};
void vert(inout appdata_full v,out Input o)
{
UNITY_INITIALIZE_OUTPUT(Input,o);
o.vertexcolor=v.color;
}
half4 LightingUnlit (SurfaceOutput s, half3 lightDir, half atten) {
return fixed4(s.Albedo, s.Alpha);
}
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_INSTANCING_BUFFER_END(Props)
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
if(_UseVertexColor)
o.Albedo = IN.vertexcolor;
else
o.Albedo = c * _Color;
o.Alpha = c.a * _Color.a ;
c = tex2D (_EmissionMap, IN.uv_EmissionMap);
o.Emission = _EmissionColor* c * _Opacity;
}
ENDCG
}
}
完整代碼,因爲要使用自發光效果,所以使用surfaceshader比較方便