Unity Shader实现线框效果的制作步骤

 更新时间:2021年06月07日 14:53:23   作者:小盖子  
最近比较忙,今天抽空给大家分享一篇文章,关于Unity Shader实现线框效果,本文给大家分享详细制作步骤,通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

先上图看看效果:

在这里插入图片描述

下面详细分享一下制作步骤吧:

一、首先模型本身需要特殊处理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、编写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<a,返回0;否则,返回1。
				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(_EdgeColor, _Color, num);

				clip((1-num)-0.1f);
				return col;
			}
			ENDCG
		}


			Cull Back
			Pass {
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

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

			};

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

			};

			fixed4 _Color;
			fixed4 _EdgeColor2;
			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<a,返回0;否则,返回1。
				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);

				clip((1 - num) - 0.1f);
				return col;
			}
			ENDCG
		}
	}
	FallBack "Diffuse"
}

三、讲解

模型部分:
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实现线框效果的制作步骤的详细内容,更多关于Unity Shader实现线框的资料请关注脚本之家其它相关文章!

相关文章

  • C#使用iTextSharp添加PDF水印

    C#使用iTextSharp添加PDF水印

    这篇文章主要为大家详细介绍了C#使用iTextSharp添加PDF水印的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • c#将字节数组转成易读的字符串的实现

    c#将字节数组转成易读的字符串的实现

    这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • C#/VB.NET 给Excel添加、删除数字签名的方法

    C#/VB.NET 给Excel添加、删除数字签名的方法

    这篇文章主要介绍了C#/VB.NET 给Excel添加、删除数字签名的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • C# SQLite库使用技巧

    C# SQLite库使用技巧

    SQLite是一个开源、免费的小型RDBMS(关系型数据库),能独立运行、无服务器、零配置、支持事物,用C实现,内存占用较小,支持绝大数的SQL92标准。下面跟随小编一起看下C# SQLite库使用
    2022-01-01
  • C#实现快速查询文件的方法

    C#实现快速查询文件的方法

    这篇文章介绍了C#实现快速查询文件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C# 提取PDF中的表格详情

    C# 提取PDF中的表格详情

    这篇文章主要给大家介绍C# 提取PDF中的表格,本文介绍在C#程序中(附VB.NET代码)提取PDF中的表格的方法,调用Spire.PDF for .NET提供的提取表格的 类 以及 方法 等来获取表格单元格中的文本内容,需要的朋友可以参考一下
    2021-10-10
  • C#使用泛型方法设计实现单向链表详解

    C#使用泛型方法设计实现单向链表详解

    这篇文章主要为大家详细介绍了C#如何使用泛型方法设计实现一个单向链表,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • C#使用QRCode生成海报图并嵌入定位带logo的二维码

    C#使用QRCode生成海报图并嵌入定位带logo的二维码

    这篇文章主要为大家详细介绍了C#如何使用QRCode生成海报图并嵌入定位带logo的二维码,文中的示例代码讲解详细,需要的小伙伴可以参考下
    2024-03-03
  • 深入分析NTFS中文件被锁定导致Process.Start失败的详解

    深入分析NTFS中文件被锁定导致Process.Start失败的详解

    本篇文章是对NTFS中文件被锁定导致Process.Start失败进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#实现过滤html标签并保留a标签的方法

    C#实现过滤html标签并保留a标签的方法

    这篇文章主要介绍了C#实现过滤html标签并保留a标签的方法,文中的自定义函数采用正则过滤实现了该功能,是非常实用的技巧,需要的朋友可以参考下
    2014-09-09

最新评论