您好,欢迎来到Unity之家!   unity.jb51.net 
  • 首 页
  • 你问我答
  • 当前位置:首页 > 学习培训 > Unity入门 >
    Unity3D 描边效果(轮廓边框)
    时间:2015-05-13 10:10 来源:Unity之家 作者:unity.jb51.net 浏览:收藏 挑错 推荐 打印


    描边效果,使用Shader就可以轻松实现

    这里先给出 效果图(PS:这是一个3D球)


    Unity3D 描边效果(轮廓边框)


    但是我并不熟悉shader这一块

    这里直接给出 shader 的代码


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


    虽然不懂,可以直接将代码拷贝过去测试下哟。。。


    (责任编辑:脚印)
    免责声明:Unity之家部分内容来源于互联网,如有侵权,请联系我们,本站将立即进行处理。