今天做的效果是连接模型的各顶点,将模型线框化。这个效果的灵感来自于昨天做的星座连线,因为星座间的连线没有规律,所以想用制作好的模型来生成各种线框图。
原理其实也很简单,获取顶点,然后连线……好吧,这条路没走通,换个方案。
根据UV的渲染原理,限制其渲染范围,倒是也能实现边框的感觉,类似这种:
感觉不太理想,三角面没体现出来。要体现出三角面,还得靠Geometry渲染,今天就不深入研究这个了。还是先把UV限制方案完善吧。
这时还要处理3D模型时,背面不显示的问题:
一般用双Pass就行。但是如果用的是SRP管线,它只会识别一个Pass,第二个Pass是无效的,所以要添加一个Tags。
最后的代码:
Shader "MyShader/SS_8" {
Properties {
_Color("Color",Color)=(0,0,0,0)
_EdgeColor("EdgeColor",Color)=(0,0,0,1)
_Width("Width",Range(0,0.5))=0.2
}
SubShader {
CGINCLUDE
#include "UnityCG.cginc"
fixed4 _Color;
fixed4 _EdgeColor;
float _Width;
struct appdata {
half4 vertex : POSITION ;
half2 uv : TEXCOORD0 ;
};
struct v2f{
half4 vertex : SV_POSITION ;
half2 uv : TEXCOORD0 ;
float4 worldPos : TEXCOORD1;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos( v.vertex);
o.uv = v.uv;
o.worldPos= mul(unity_ObjectToWorld, v.vertex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
fixed4 col;
float lx = step(_Width, i.uv.x);
float ly = step(_Width, i.uv.y);
float hx = step(i.uv.x, 1.0 - _Width);
float hy = step(i.uv.y, 1.0 - _Width);
col = lerp(_EdgeColor, _Color, lx*ly*hx*hy);
return col;
}
ENDCG
Pass {
Tags{ "LightMode" = "LightweightForward" }
Blend SrcAlpha OneMinusSrcAlpha
Cull Front//要写在CullBack前面
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
Pass {
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
}
}
以及最终的效果: