美文网首页
Jtro的技术分享:模型外面一圈描边的Shader的制作

Jtro的技术分享:模型外面一圈描边的Shader的制作

作者: UnityPlane | 来源:发表于2018-03-22 18:11 被阅读57次

    HI:
    大家好,好久不见,现在给大家带来一个shader,作用就是在模型上描边。
    详情看代码:

    Shader "Outlined/zsg" {
        Properties {
            _Color ("Main Color", Color) = (.5,.5,.5,1)
            _OutlineColor ("Outline Color", Color) = (0,0,0,1)
            _Outline ("Outline width", Range (.002, 0.5)) = .005
            _MainTex ("Base (RGB)", 2D) = "white" { }
        }
        
    CGINCLUDE
    #include "UnityCG.cginc"
    
    struct appdata {
        float4 vertex : POSITION;
        float3 normal : NORMAL;
    };
    
    struct v2f {
        float4 pos : POSITION;
        float4 color : COLOR;
    };
    
    uniform float _Outline;
    uniform float4 _OutlineColor;
    
    v2f vert(appdata v) {
        // just make a copy of incoming vertex data but scaled according to normal direction
        v2f o;
        o.pos = UnityObjectToClipPos(v.vertex);
    
        float3 norm   = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal);
        float2 offset = TransformViewToProjection(norm.xy);
    
        o.pos.xy += offset * o.pos.z * _Outline;
        o.color = _OutlineColor;
        return o;
    }
    ENDCG
    
        SubShader {
            //Tags {"Queue" = "Overlay" }
    CGPROGRAM
    #pragma surface surf Lambert
    
    sampler2D _MainTex;
    fixed4 _Color;
    
    struct Input {
        float2 uv_MainTex;
    };
    
    void surf (Input IN, inout SurfaceOutput o) {
        fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
        o.Albedo = c.rgb;
        o.Alpha = c.a;
    }
    ENDCG
    
            // note that a vertex shader is specified here but its using the one above
            Pass {
                Name "OUTLINE"
                Tags { "LightMode" = "Always" "Queue" = "Overlay" }
                Cull Front
                ZWrite On
                ZTest LEqual
                ColorMask RGB
                Blend SrcAlpha OneMinusSrcAlpha
                Offset 15,15
    
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                half4 frag(v2f i) :COLOR { return i.color; }
                ENDCG
            }
        }
        
        SubShader {
            Tags {"Queue" = "Overlay" }
    CGPROGRAM
    #pragma surface surf Lambert
    
    sampler2D _MainTex;
    fixed4 _Color;
    
    struct Input {
        float2 uv_MainTex;
    };
    
    void surf (Input IN, inout SurfaceOutput o) {
        fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
        o.Albedo = c.rgb;
        o.Alpha = c.a;
    }
    ENDCG
    
            Pass {
                Name "OUTLINE"
                Tags { "LightMode" = "Always" }
                Cull Front
                ZWrite On
                ColorMask RGB
                Blend SrcAlpha OneMinusSrcAlpha
    
                CGPROGRAM
                #pragma vertex vert
                #pragma exclude_renderers gles xbox360 ps3
                ENDCG
                SetTexture [_MainTex] { combine primary }
            }
        }
        
        Fallback "Diffuse"
    }
    

    相关文章

      网友评论

          本文标题:Jtro的技术分享:模型外面一圈描边的Shader的制作

          本文链接:https://www.haomeiwen.com/subject/lhbrxftx.html