Unity Shader学习:2D3D物体描边

这篇博客介绍了Unity中实现2D和3D物体描边的Shader技术。针对3D物体,通过法线挤出但对法线夹角过大的物体效果不佳;2D物体则采用复制并偏移图片的方式,叠加上原图来实现描边效果。文中提到了Unity内置Outline组件的不足,并提供了简单的实现方案。
摘要由CSDN通过智能技术生成

Unity Shader学习:2D3D物体描边

参考了下法线挤出的方法感觉对于法线夹角过大的物体来说效果不好,先简单实现一下,大部分情况应该能用。UI描边效果找不到特别好的,仿照了Unity自带的Outline组建,其实方法挺差的而且估计挺费性能,基本效果还是能将就着用用。

描边基本原理:3D物体沿发现拉升扩大图像,渲染成纯色的,然后把原图像叠上去。2D物体复制多个相同的图片渲染成纯色的然后进行少量偏移,最后把原图叠上去。(Unity的Outline组建是复制了4个图片,大家觉得效果不好可以试试复制八个方向的,感觉这个方法不好,图片透明度也基本放弃操作了,我用的2017.3,不知道官方更新过组件了没)

3D物体shader:

//3D物体描边效果
Shader "Custom/Outline3D" {
   
	Properties{
   
	_MainTex("Albedo (RGB)", 2D) = "white" {
   }
	//描边宽度
	_OutlineWidth("OutlineWidth", float) = 1.2
	_OutlineColor("_OutlineColor",Color)=(1,1,1,1)
	}
	SubShader{
   
	//让渲染队列靠后,并且渲染顺序为从后向前,保证描边效果不被其他对象遮挡。
	Tags{
    "Queue" = "Transparent" }
		//描边使用两个Pass,第一个pass沿法线挤出一点,只输出描边的颜色
		Pass
		{
   
			//剔除正面,只渲染背面
			Cull Front
			//关闭深度写入
			ZWrite Off
			//控制深度偏移,描边pass远离相机一些,防止与正常pass穿插
			Offset 1,1

			CGPROGRAM
            #include "UnityCG.cginc"
            #pragma vertex vert
            #pragma fragment frag
		    float _OutlineFactor;

		    struct v2f
		    {
   
			    float4 pos : SV_POSITION;
		    };

		    v2f vert(appdata_full v)
		    {
   
			    v2f o;
			    o.pos = UnityObjectToClipPos(v.vertex);
			    //将法线方向转换到视空间
			    float3 vnormal = mul((float3x3)UNITY_MATRIX_IT_MV, v
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值