自己新建的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比较方便