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比较方便

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值