在unity中,写一个shader,使物体有描边,材质不受光影响只受uv影响,且描边有材质
时间: 2024-03-06 13:51:54 浏览: 11
好的,以下是一个简单的Shader示例,可以在Unity中实现对物体的描边效果:
```
Shader "Custom/OutlineShader" {
Properties {
_OutlineColor ("Outline Color", Color) = (0,0,0,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
_Outline ("Outline width", Range(0.0, 0.1)) = 0.01
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 100
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 vertex : SV_POSITION;
};
float _Outline;
float4 _OutlineColor;
v2f vert (appdata v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
float4 frag (v2f i) : SV_Target {
float4 tex = tex2D(_MainTex, i.uv);
float4 outline = tex2D(_MainTex, i.uv + float2(_Outline, 0));
outline += tex2D(_MainTex, i.uv + float2(-_Outline, 0));
outline += tex2D(_MainTex, i.uv + float2(0, _Outline));
outline += tex2D(_MainTex, i.uv + float2(0, -_Outline));
outline = outline / 4;
outline.a = 1;
float4 final = tex + outline * _OutlineColor;
final.a = tex.a;
return final;
}
ENDCG
}
}
FallBack "Diffuse"
}
```
这个Shader使用了一个名为“OutlineShader”的自定义着色器,其中包含了三个属性:描边的颜色、材质的基本颜色、以及描边的宽度。
在SubShader中,我们定义了一个Pass,这个Pass包含了我们的顶点着色器和片段着色器。其中,顶点着色器返回的是经过变换后的顶点坐标,而片段着色器则对每个像素进行计算,并返回最终的颜色。
在这个Shader中,我们通过对像素周围的像素进行采样来计算描边的效果。我们使用了一个名为“_Outline”的变量来控制描边的宽度,然后对每个像素周围的四个像素进行采样,计算出一个平均值,最后将这个平均值和描边的颜色相乘,得到最终的描边颜色。
最后,我们将这个描边颜色和材质的基本颜色相加,得到最终的颜色并返回。这样就实现了对物体的描边效果,并且材质不受光影响只受UV影响,同时描边也有材质。