我有一个2d网格(所有顶点的z坐标均为0)。我使用网格法线创建线边界。因此,每个法线都在网格内部。
着色器使用2次传递。第一次通过时,全网格以黑色绘制。然后在第二遍绘制内部网格。看起来不错,但是当我缩放线宽时也可以缩放,但是我希望它保持恒定。
我要使线宽保持恒定。我尝试使用fwidth,但没有结果。这是着色器代码
Shader "Custom/Outline" {
Properties
{
_Color("Color", Color) = (1, 1, 1, 1)
_OutlineExtrusion("Outline Extrusion", float) = 0
}
SubShader
{
//inner polygon
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
Stencil
{
Ref 4
Pass replace
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// Properties
uniform float _OutlineExtrusion;
struct vertexInput
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 color : COLOR;
};
struct vertexOutput
{
float4 pos : SV_POSITION;
float4 color : COLOR;
};
vertexOutput vert(vertexInput input)
{
vertexOutput output;
float4 newPos = input.vertex;
float3 normal = normalize(input.normal);
newPos += float4(normal, 0.0) * _OutlineExtrusion;
output.pos = UnityObjectToClipPos(newPos);
output.color = input.color;
return output;
}
float4 frag(vertexOutput input) : COLOR
{
return input.color;
}
ENDCG
}
//bigger polygon
Pass
{
Stencil
{
Ref 4
Comp notequal
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float4 _Color;
struct vertexInput
{
float4 vertex : POSITION;
};
struct vertexOutput
{
float4 pos : SV_POSITION;
};
vertexOutput vert(vertexInput input)
{
vertexOutput output;
output.pos = UnityObjectToClipPos(input.vertex);
return output;
}
float4 frag(vertexOutput input) : COLOR
{
return _Color;
}
ENDCG
}
}
}