• 分类

  • 重置

Unity3D中shader 轮廓描边效果实现代码

    Unity3D中shader 轮廓描边效果

    想利用Unity3D中shader这个功能实现描边轮廓边框效果该怎么做呢,相信有很多搞开发的人想知道,为此下面就给大家介绍下方法。

      Shade实现描边效果,如下图中的3D球效果图

              Shade代码如下:

    
    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; 
    } 
    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 
     } 
     } 
     } 
      
     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 } 
     } 
     
     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" 
    } 
    

      以上就是Unity3D中利用shader这个功能实现描边轮廓边框效果的方法,不会的话就直接那这串代码去尝试吧。

           感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!