unity 里面实现描边shader
时间: 2023-08-29 17:08:00 浏览: 192
unity描边shader
3星 · 编辑精心推荐
在Unity中实现描边效果,可以通过编写Shader来实现。具体实现方法如下:
1. 首先,在Shader中需要先声明一个描边颜色的变量:
```csharp
// 描边颜色
_Color ("Outline Color", Color) = (0,0,0,1)
```
2. 接着,需要在Shader中将表面进行放大,然后将描边颜色填充到放大后的表面上:
```csharp
// 放大表面,并填充描边颜色
float2 borderOffset[4] = {float2(1,0), float2(-1,0), float2(0,1), float2(0,-1)};
float border = _OutlineWidth * (1.0 / _ScreenParams.z);
float4 borderColor = _Color;
float4 c;
for (int i = 0; i < 4; i++)
{
c = tex2D(_MainTex, i.uv + border * borderOffset[i]);
borderColor.a *= c.a;
o.Normal += borderColor.a * borderOffset[i];
}
```
这里,`borderOffset`表示描边的偏移量,`border`表示描边的宽度,`borderColor`表示描边的颜色,`c`表示当前像素点的颜色值。在循环中,依次对当前像素点的上、下、左、右四个方向进行采样,并将采样到的颜色值和描边颜色进行叠加。
3. 最后,在Shader中将表面的颜色和描边颜色进行混合:
```csharp
// 混合表面颜色和描边颜色
o.Albedo = lerp(_Color.rgb, o.Albedo, o.Normal);
```
这里使用了`lerp`函数来对表面颜色和描边颜色进行混合,根据描边的程度不同,可以调整`_Color`的alpha值来控制描边的显示程度。
综上所述,完整的描边Shader代码如下:
```csharp
Shader "Custom/Outline" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
_Color ("Outline Color", Color) = (0,0,0,1)
_OutlineWidth ("Outline Width", Range(0, 2)) = 1
_ScreenParams ("Screen Params", Vector) = (0,0,0,0)
}
SubShader {
Tags {"Queue"="Transparent" "RenderType"="Transparent"}
LOD 100
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata {
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f {
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float4 Normal : TEXCOORD1;
};
sampler2D _MainTex;
float4 _Color;
float _OutlineWidth;
float4 _ScreenParams;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
o.Normal = float4(0,0,0,0);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float2 borderOffset[4] = {float2(1,0), float2(-1,0), float2(0,1), float2(0,-1)};
float border = _OutlineWidth * (1.0 / _ScreenParams.z);
float4 borderColor = _Color;
float4 c;
for (int j = 0; j < 4; j++)
{
c = tex2D(_MainTex, i.uv + border * borderOffset[j]);
borderColor.a *= c.a;
i.Normal += borderColor.a * borderOffset[j];
}
i.Normal.a = 1.0;
i.Normal = normalize(i.Normal);
fixed4 col = tex2D(_MainTex, i.uv);
col.rgb = lerp(_Color.rgb, col.rgb, i.Normal);
col.a = col.a * i.Normal.a;
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
```
使用该Shader,你可以在游戏中对需要描边的物体进行材质替换,从而实现描边效果。
阅读全文