不在水里的鱼 發表於 2017-3-14 10:25:08

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

<p><strong>Unity3D中shader 轮廓描边效果</strong></p>
<p>想利用Unity3D中shader这个功能实现描边轮廓边框效果该怎么做呢,相信有很多搞开发的人想知道,为此下面就给大家介绍下方法。</p>
<p>  Shade实现描边效果,如下图中的3D球效果图</p>
<p><img id="theimg" src="https://img.jbzj.com/file_images/article/201703/2017314103843985.png?2017214103858" alt="" /></p>
<p>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shade代码如下:<br />
</p>
<div class="jb51code">
<pre class="brush:cpp;">
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
Ambient
}
Lighting On
SetTexture {
ConstantColor
Combine texture * constant
}
SetTexture {
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 { combine primary }
}

Pass {
Name "BASE"
ZWrite On
ZTest LEqual
Blend SrcAlpha OneMinusSrcAlpha
Material {
Diffuse
Ambient
}
Lighting On
SetTexture {
ConstantColor
Combine texture * constant
}
SetTexture {
Combine previous * primary DOUBLE
}
}
}

Fallback "Diffuse"
}
</pre>
</div>
<p>  以上就是Unity3D中利用shader这个功能实现描边轮廓边框效果的方法,不会的话就直接那这串代码去尝试吧。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Unity shader实现消融效果</li><li>Unity shader实现自由放大缩小效果</li><li>Unity Shader实现序列帧动画效果</li><li>unity shader实现玻璃折射效果</li><li>Unity Shader实现玻璃材质效果</li><li>Unity Shader实现新手引导遮罩镂空效果</li><li>Unity Shader实现描边OutLine效果</li><li>Unity3D Shader实现贴图切换效果</li><li>Unity shader实现遮罩效果</li><li>浅谈Unity中的Shader</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Unity3D中shader 轮廓描边效果实现代码