以下为shader代码
cs
Shader "Custom/ArrowDottedLine"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_BaseColor ("Base Color", Color) = (1,1,1,1)
_TilingX ("Tiling X", Float) = 1
_OffsetX ("Offset X", Float) = 0
_AlphaClip ("Alpha Clip Threshold", Range(0,1)) = 0.5
}
SubShader
{
Tags
{
"RenderType"="TransparentCutout" "Queue"="AlphaTest"
}
LOD 100
ZTest Always
Cull Off
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float4 color : COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float4 color : COLOR;
};
sampler2D _MainTex;
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(fixed4, _BaseColor)
UNITY_DEFINE_INSTANCED_PROP(float, _TilingX)
UNITY_DEFINE_INSTANCED_PROP(float, _OffsetX)
UNITY_DEFINE_INSTANCED_PROP(float, _AlphaClip)
UNITY_INSTANCING_BUFFER_END(Props)
v2f vert(appdata v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
o.color = v.color;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
float tilingX = UNITY_ACCESS_INSTANCED_PROP(Props, _TilingX);
float offsetX = UNITY_ACCESS_INSTANCED_PROP(Props, _OffsetX);
float alphaClip = UNITY_ACCESS_INSTANCED_PROP(Props, _AlphaClip);
float2 uv = float2(i.uv.x * tilingX + offsetX, i.uv.y);
fixed4 texCol = tex2D(_MainTex, uv);
clip(texCol.a - alphaClip);
fixed4 baseCol = UNITY_ACCESS_INSTANCED_PROP(Props, _BaseColor);
fixed4 finalCol;
finalCol.rgb = texCol.rgb * baseCol.rgb;
finalCol.a = texCol.a * baseCol.a;
finalCol.a *= i.color.a;
return finalCol;
}
ENDCG
}
}
FallBack "Diffuse"
}
问题:
_AlphaClip ("Alpha Clip Threshold", Range(0,1)) = 0.5
Range精度问题
在某些设备上,Shader编译器的优化可能导致Range属性的默认值被截断,导致裁切空白像素时无法正常生效
解决方案:
cs
Shader "Custom/ArrowDottedLine"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_BaseColor ("Base Color", Color) = (1,1,1,1)
_TilingX ("Tiling X", Float) = 1
_OffsetX ("Offset X", Float) = 0
_AlphaClip ("Alpha Clip Threshold", Float) = 0.5
}
SubShader
{
Tags
{
"RenderType"="TransparentCutout" "Queue"="AlphaTest"
}
LOD 100
ZTest Always
Cull Off
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float4 color : COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float4 color : COLOR;
};
sampler2D _MainTex;
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(fixed4, _BaseColor)
UNITY_DEFINE_INSTANCED_PROP(float, _TilingX)
UNITY_DEFINE_INSTANCED_PROP(float, _OffsetX)
UNITY_DEFINE_INSTANCED_PROP(float, _AlphaClip)
UNITY_INSTANCING_BUFFER_END(Props)
v2f vert(appdata v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
o.color = v.color;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
float tilingX = UNITY_ACCESS_INSTANCED_PROP(Props, _TilingX);
float offsetX = UNITY_ACCESS_INSTANCED_PROP(Props, _OffsetX);
float alphaClip = UNITY_ACCESS_INSTANCED_PROP(Props, _AlphaClip);
float2 uv = float2(i.uv.x * tilingX + offsetX, i.uv.y);
fixed4 texCol = tex2D(_MainTex, uv);
clip(texCol.a - alphaClip);
fixed4 baseCol = UNITY_ACCESS_INSTANCED_PROP(Props, _BaseColor);
fixed4 finalCol;
finalCol.rgb = texCol.rgb * baseCol.rgb;
finalCol.a = texCol.a * baseCol.a;
finalCol.a *= i.color.a;
return finalCol;
}
ENDCG
}
}
FallBack "Diffuse"
}
_AlphaClip ("Alpha Clip Threshold", Float) = 0.5
声明透明度裁切阈值属性为Float