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