查看: 2678|回复: 1
打印 上一主题 下一主题

[Shaders] 新手教程:shader实现描边轮廓边框效果

[复制链接]

4

主题

1

听众

268

积分

设计实习生

Rank: 2

纳金币
62
精华
0

最佳新人

跳转到指定楼层
楼主
发表于 2016-6-23 11:16:18 |只看该作者 |倒序浏览

    Shader "Outlined/Silhouetted Diffuse" {         
        Properties {         
            _Color ("Main Color", Color) = (1,1,1,1)         
            _OutlineColor ("Outline Color", Color) = (0,0,0,1)  //改变这个能改变轮廓边的颜色         
            _Outline ("Outline width", Range (0.0, 0.03)) = 0.008   //改变这个能改变轮廓边的粗细         
            _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 = mul(UNITY_MATRIX_MVP, 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;         
    }  //unity3d教程手册www.unitymanual.com       
    ENDCG         
       
        SubShader {         
            Tags { "Queue" = "Transparent" }         
       
            // note that a vertex shader is specified here but its using the one above         
            Pass {         
                Name "OUTLINE"         
                Tags { "LightMode" = "Always" }         
                Cull Off         
                ZWrite Off         
                ZTest Always         
                ColorMask RGB // alpha not used         
       
                // you can choose what kind of blending mode you want for the outline         
                Blend SrcAlpha OneMinusSrcAlpha // Normal         
                //Blend One One // Additive         
                //Blend One OneMinusDstColor // Soft Additive         
                //Blend DstColor Zero // Multiplicative         
                //Blend DstColor SrcColor // 2x Multiplicative         
       
    CGPROGRAM         
    #pragma vertex vert         
    #pragma fragment frag         
       
    half4 frag(v2f i) :COLOR {         
        return i.color;         
    }         
    ENDCG         
            }         
       
            Pass {         
                Name "BASE"         
                ZWrite On         
                ZTest LEqual         
                Blend SrcAlpha OneMinusSrcAlpha         
                Material {         
                    Diffuse [_Color]         
                    Ambient [_Color]         
                }         
                Lighting On         
                SetTexture [_MainTex] {         
                    ConstantColor [_Color]         
                    Combine texture * constant         
                }         
                SetTexture [_MainTex] {         
                    Combine previous * primary DOUBLE         
                }  //Unity3D教程手册:www.unitymanual.com       
            }         
        }         
       
        SubShader {         
            Tags { "Queue" = "Transparent" }         
       
            Pass {         
                Name "OUTLINE"         
                Tags { "LightMode" = "Always" }         
                Cull Front         
                ZWrite Off         
                ZTest Always         
                ColorMask RGB         
       
                // you can choose what kind of blending mode you want for the outline         
                Blend SrcAlpha OneMinusSrcAlpha // Normal         
                //Blend One One // Additive         
                //Blend One OneMinusDstColor // Soft Additive         
                //Blend DstColor Zero // Multiplicative         
                //Blend DstColor SrcColor // 2x Multiplicative         
       
                CGPROGRAM         
                #pragma vertex vert         
                #pragma exclude_renderers gles xbox360 ps3         
                ENDCG         
                SetTexture [_MainTex] { combine primary }         
            }  //Unity3D教程手册:www.unitymanual.com       
       
            Pass {         
                Name "BASE"         
                ZWrite On         
                ZTest LEqual         
                Blend SrcAlpha OneMinusSrcAlpha         
                Material {         
                    Diffuse [_Color]         
                    Ambient [_Color]         
                }         
                Lighting On         
                SetTexture [_MainTex] {         
                    ConstantColor [_Color]         
                    Combine texture * constant         
                }         
                SetTexture [_MainTex] {         
                    Combine previous * primary DOUBLE         
                }         
            }         
        }         
       
        Fallback "Diffuse"         
    }        
       


分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

13

主题

8

听众

4583

积分

中级设计师

Rank: 5Rank: 5

纳金币
13
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2016-8-30 10:12:43 |只看该作者
谢谢分享,我先试试好用不
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-14 21:13 , Processed in 0.183344 second(s), 31 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部