Unity Surface Shader 使用其他組件顏色

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章