Shader实现描边

描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个物体。下面使用Shader实现简单的描边效果。

描边的实现通常有两种方式:一种是将模型顶点沿法线方向扩展一段距离,一种是使用深度偏移。

一、通过法线的延伸

原理:进行两次渲染,第一次剔除正面只渲染背面,把模型顶点沿法线方向延伸一定距离,只显示描边的颜色

第二次渲染剔除背面,只显示正面正常渲染。

Shader "Custom/Stroke"
{
	Properties
	{
		_MainTex("main tex",2D) = ""{}
		_Factor("factor",Range(0,0.1)) = 0.01		//描边粗细因子
		_OutLineColor("outline color",Color) = (0,0,0,1)//描边颜色
	}

		SubShader
	{
		Pass
	{
		Cull Front //剔除前面
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

		struct v2f
	{
		float4 vertex :POSITION;
	};

	float _Factor;
	half4 _OutLineColor;

	v2f vert(appdata_full v)
	{
		v2f o;
		//将顶点沿法线方向向外扩展一下
		v.vertex.xyz += v.normal * _Factor;
		o.vertex = UnityObjectToClipPos(v.vertex);

		return o;
	}

	half4 frag(v2f v) :COLOR
	{
		//只显示描边的颜色
		return _OutLineColor;
	}
		ENDCG
	}

		Pass
	{
		Cull Back //剔除后面
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

		struct v2f
	{
		float4 vertex :POSITION;
		float4 uv:TEXCOORD0;
	};

	sampler2D _MainTex;

	v2f vert(appdata_full v)
	{
		v2f o;
		o.vertex = UnityObjectToClipPos(v.vertex);
		o.uv = v.texcoord;
		return o;
	}

	half4 frag(v2f v) :COLOR
	{
		half4 c = tex2D(_MainTex,v.uv);
		return c;
	}
		ENDCG
	}
	}
		FallBack "Diffuse"
}

二、深度偏移

原理:进行两次渲染,第一次剔除正面只渲染背面,利用Offset指令,进行深度操作。

第二次渲染剔除背面,只显示正面正常渲染。

Offset 深度偏移

Offset   Factor , Units

Factor : 主要影响我们绘制多边形的深度斜率的最大值

Units  : 主要影响的能产生的在窗口坐标系的深度值中可变分辨率差异的最小值。

一般在使用Offset指令中,Units给一个统一值就行,主要起作用的是Factor.,Factor的调整是沿着Z轴方向的,Factor大于0,偏移值就沿着Z轴正方向移动,离屏幕越远。Factor小于0,偏移值就沿着Z轴的负方向,离屏幕近。

Shader "Custom/Stroke2" {
	Properties
	{
		_MainTex("main tex",2D) = ""{}
		_OutLineColor("outline color",Color) = (0,0,0,1)	//描边颜色
	}

	/*
		Offset:深度偏移
		Offset Factor,Units
		Factor参数表示 Z缩放的最大斜率的值。
		Units参数表示可分辨的最小深度缓冲区的值。
	*/
	SubShader{
		//描边
		pass {
			Cull Front		//剔除正面
			Offset -5,-1	//深度偏移
			CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

			sampler2D _MainTex;
			half4 _OutLineColor;

			struct v2f {
				float4 pos : SV_POSITION;
			};

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

			float4 frag(v2f i) : COLOR{
				return _OutLineColor;
			}
			ENDCG
		}

		//正常渲染物体
		pass {
			Cull Back		//剔除背面
			CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

			sampler2D _MainTex;
			float4 _MainTex_ST;

			struct v2f {
				float4 pos : SV_POSITION;
				float2 uv : TEXCOORD0;
			};

			v2f vert(appdata_base v)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				return o;
			}

			float4 frag(v2f i) : COLOR	
			{
				float4 c = tex2D(_MainTex,i.uv);
				return c;
			}

			ENDCG
		}
	}

	
	FallBack "Diffuse"
}

效果图:

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当然,我可以为您提供一个简单的Shader Graph边案例。以下是一个使用Unity的Shader Graph实现边效果的示例步骤: 1. 在Unity中创建一个新的Shader Graph材质。 2. 将材质应用于您想要进行边的对象上。 3. 在Shader Graph编辑器中,创建一个新的Sub Graph(子图),并将其命名为"Outline"(或其他您喜欢的名称)。 4. 在Sub Graph中添加一个"Sample Texture 2D"节点,并将其命名为"Main Texture"。将该节点连接到输出节点。 5. 添加一个"Color"节点,并连接到"Main Texture"节点的采样输出。 6. 添加一个"Gradient Noise"节点,并将其命名为"Noise". 这将用于创建边效果的噪声纹理。 7. 创建两个新的属性节点,一个用于控制边颜色,另一个用于控制边宽度。将这两个属性连接到"Outline" Sub Graph中的适当节点。 8. 使用"Step"节点和"Noise"节点结合创建边效果。将"Noise"节点的输出连接到"Step"节点的输入,并将边宽度属性连接到"Step"节点的阈值输入。然后将"Step"节点的输出连接到一个"Multiply"节点。 9. 将"Multiply"节点的输出连接到"Color"节点的输入。这样,您就可以通过调整边宽度属性来控制边的强度。 10. 将"Color"节点的输出连接到输出节点,然后将"Outline" Sub Graph的输出节点连接到Sub Graph的主输出节点。 11. 返回到主Shader Graph编辑器中,将"Outline" Sub Graph的输出节点连接到主输出节点。 12. 在主Shader Graph中添加一个"Color"节点,用于控制对象的基础颜色。 13. 将主Shader Graph的基础颜色连接到"Outline" Sub Graph的输入节点。 14. 调整边颜色和边宽度属性,来达到您想要的边效果。 15. 应用该材质,并查看对象的边效果。 这只是一个简单的示例,您可以根据自己的需求对边效果进行进一步定制。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值