您的位置:首页 > 移动开发 > Unity3D

UnityShader之OutLine

2017-06-19 16:17 225 查看
算法很简单,主要需要不同观察角度看上去线的宽度一样,需要转换到观察空间进行操作,空间变换请看我上一篇博客。
需要两个pass,一个画线,一个填充

Shader "Custom/Outline"
{
Properties
{

_OutlineVal("Outline value", Range(0., 2.)) = 1.                //描线的宽度
_OutlineCol("Outline color", color) = (1., 1., 1., 1.)
}
SubShader
{
Tags{ "Queue" = "Geometry" "RenderType" = "Opaque" }

Pass
{
Cull Front

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

struct v2f {
float4 pos : SV_POSITION;
};

float _OutlineVal;

v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MV, v.vertex);       //注意这里只换算到观察空间,还没有到裁剪空间
float3 normal = mul((float3x3) UNITY_MATRIX_IT_MV, v.normal); //上一篇博客说过,法线的变换需要用到UNITY_MATRIX_IT_MV
o.pos.xy += _OutlineVal*normal.xy;   //观察空间里xy方向始终和最终屏幕方向相同,这保证了描线始终面向我们,边缘朝外偏移一点点
o.pos = mul(UNITY_MATRIX_P, o.pos); //最终需要把坐标从观察空间变换到裁剪空间
return o;
}

fixed4 _OutlineCol;

fixed4 frag(v2f i) : SV_Target{
return _OutlineCol;
}

ENDCG
}

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

float4 vert(appdata_base v) : SV_POSITION
{
return mul(UNITY_MATRIX_MVP, v.vertex);
}

fixed4 frag(float4 i : VPOS) : SV_Target
{
return fixed4(1,1,0,1);
}

ENDCG
}
}
}

效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Unity Shader 算法