Unity Shader实现线框效果(详细图解)

先上图看看效果:


下面详细分享一下制作步骤吧:
一、首先模型本身需要特殊处理
Unity Shader实现线框效果(详细图解)_第1张图片
Unity Shader实现线框效果(详细图解)_第2张图片
Unity Shader实现线框效果(详细图解)_第3张图片
Unity Shader实现线框效果(详细图解)_第4张图片
Unity Shader实现线框效果(详细图解)_第5张图片
Unity Shader实现线框效果(详细图解)_第6张图片
Unity Shader实现线框效果(详细图解)_第7张图片
Unity Shader实现线框效果(详细图解)_第8张图片
Unity Shader实现线框效果(详细图解)_第9张图片
Unity Shader实现线框效果(详细图解)_第10张图片
Unity Shader实现线框效果(详细图解)_第11张图片
二、编写Shader

shader "Giraffe/Wireframe" {
	properties{
		   _Color("Color",Color) = (1.0,1.0,1.0,1.0)
		   _EdgeColor("Edge Color",Color) = (1.0,1.0,1.0,1.0)
		   _EdgeColor2("Edge Color",Color) = (1.0,1.0,1.0,1.0)
		   _Width("Width",Range(0,1)) = 0.2
	}
		SubShader{
			Tags {"Queue" = "Transparent" "IgnoreProjector" = "True"}
			Cull Front

			Pass {

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma target 3.0
			#include "UnityCG.cginc"

			struct a2v {
				half4 uv : TEXCOORD0;
				half4 vertex : POSITION;
			};

			struct v2f {
				half4 pos : SV_POSITION;
				half4 uv : TEXCOORD0;
			};

			fixed4 _Color;
			fixed4 _EdgeColor;
			float _Width;

			v2f vert(a2v v)
			{
				v2f o;
				o.uv = v.uv;
				o.pos = UnityObjectToClipPos(v.vertex);
				return o;
			}

			fixed4 frag(v2f i) : COLOR
			{
				fixed4 col;
				//step(a, x) : 如果 x

三、讲解
模型部分:
1、处理是为了把所有模型面,以重叠的方式撑满整个UV。
2、为什么会用四边面,因为试过了三角面过多,看起来非常乱,效果不好。
代码部分:
1、分成两个Pass,分别渲染剔除正面和剔除背面的,这个比较好理解。
2、核心代码部分是:

float LowX = step(_Width, i.uv.x);
float LowY = step(_Width, i.uv.y);
float HighX = step(i.uv.x, 1.0 - _Width);
float HighY = step(i.uv.y, 1.0 - _Width);
float num = LowX * LowY*HighX*HighY;
col = lerp(_EdgeColor2, _Color, num);

在UV上找到对应的范围进行着色,其他位置透明化,如图所示:
Unity Shader实现线框效果(详细图解)_第12张图片

你可能感兴趣的:(Shader,Shader实现线框效果,UnityShader线框,UnityShader实现线框,Unity,Shader线框,Shader线框详细图解)