我正在开发一个网格着色器,无论游戏对象的形状如何,其网格单元格的大小应始终完全相同。例如,如果将着色器应用于具有不同缩放比例的两个立方体,网格的单元格仍应具有相同的大小(与以下屏幕截图中显示的当前着色器不同)。
我已经尝试使用世界空间,但无法获得有效的结果。我对着色器编程也很陌生,所以非常感谢任何帮助。
Shader "Unlit/ProceduralGrid"
{
Properties
{
_LineColor("Line Color", Color) = (1,1,1,1)
_BGColor("Background Color", Color) = (0,0,0,0)
_MainTex("Albedo (RGB)", 2D) = "white" {}
_GridSize("Grid Size", Range(1,100)) = 5
_LineThickness("Line Thickness", Range(0,1)) = 0.05
}
SubShader
{
Tags {"Queue" = "Transparent" "RenderType" = "Transparent" }
LOD 100
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
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;
};
half _Glossiness = 0.0;
half _Metallic = 0.0;
float4 _LineColor;
float4 _BGColor;
sampler2D _MainTex;
float _GridSize;
float _LineThickness;
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
float2 uv = i.uv;
fixed4 c = float4(0.0,0.0,0.0,0.0);
float brightness = 1.;
float gsize = floor(_GridSize);
gsize += _LineThickness;
float2 id;
id.x = floor(uv.x / (1.0 / gsize));
id.y = floor(uv.y / (1.0 / gsize));
float4 color = _BGColor;
brightness = _BGColor.w;
if (frac(uv.x*gsize) <= _LineThickness || frac(uv.y*gsize) <= _LineThickness)
{
brightness = _LineColor.w;
color = _LineColor;
}
if (brightness == 0.0) {
clip(c.a - 1.0);
}
c = fixed4(color.x*brightness,color.y*brightness,color.z*brightness,brightness);
return c;
}
ENDCG
}
}
}