151 lines
3.4 KiB
HLSL
151 lines
3.4 KiB
HLSL
|
|
struct VOut
|
|
{
|
|
float3 pos : POSITION0;
|
|
int type : TYPE;
|
|
float4 offset : TEXCOORD0;
|
|
};
|
|
|
|
[numthreads(16, 16, 1)]
|
|
[entrypoint(cs)]
|
|
void cs_gridline(int3 id : SV_DispatchThreadID)
|
|
{
|
|
float2 uv = id.xy - 512;
|
|
float x = length(uv) - (_s.gridLineTime - 2 ) * 8 * pi+ 1;
|
|
o2d0[id.xy] = float4(5 * sin(x)/x, 0, 0, 0);
|
|
}
|
|
|
|
[entrypoint(vs)]
|
|
void vs_gridline(uint id : SV_VertexID, out VOut o)
|
|
{
|
|
int type = id / (1024 * 1024);
|
|
id %= (1024 * 1024);
|
|
int z = id / 1024;
|
|
int x = id % 1024;
|
|
o.pos = float3(x, z, 512);
|
|
o.type = type;
|
|
uint seed = id;
|
|
o.offset = float4(hash(seed++), hash(seed++), hash(seed++), hash(seed++));
|
|
}
|
|
|
|
struct GOut
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
float4 color : COLOR;
|
|
float4 offset : TEXCOORD0;
|
|
float2 uv : TEXCOORD1;
|
|
};
|
|
|
|
float4 transform(float3 v, float3 o, out float2 uv)
|
|
{
|
|
uv = o.xy;
|
|
float3 r = float3(v.xy + o.xy, 0).xzy;
|
|
float2 tc = r.xz / (2 * v.z);
|
|
r.y = t2d0.SampleLevel(samplerClamp, tc, 0).x + o.z;
|
|
r.xz -= v.z;
|
|
return ftransform(r);
|
|
}
|
|
|
|
[maxvertexcount(10)]
|
|
[entrypoint(gs)]
|
|
void gs_gridline(point VOut ia[1], inout TriangleStream<GOut> os)
|
|
{
|
|
VOut i = ia[0];
|
|
GOut o;
|
|
o.offset = i.offset;
|
|
float lw = 0.1;
|
|
float lh = -0.2;
|
|
float4 cellColor = 0;
|
|
float4 floorColor = float4(_s.gridBorderColor.xyz, 1);
|
|
if (i.type == 0 && time >= 16)
|
|
{
|
|
o.color = float4(_s.gridFaceColor.xyz, 1);
|
|
|
|
o.pos = transform(i.pos, float3(lw, lw, 0), o.uv);
|
|
os.Append(o);
|
|
o.pos = transform(i.pos, float3(1 - lw, lw, 0), o.uv);
|
|
os.Append(o);
|
|
o.pos = transform(i.pos, float3(lw, 1 - lw, 0), o.uv);
|
|
os.Append(o);
|
|
o.pos = transform(i.pos, float3(1 - lw, 1 - lw, 0), o.uv);
|
|
os.Append(o);
|
|
os.RestartStrip();
|
|
}
|
|
else if (i.type == 1)
|
|
{
|
|
o.color = cellColor;
|
|
o.pos = transform(i.pos, float3(0.0, 0.0, lh), o.uv);
|
|
os.Append(o);
|
|
|
|
o.color = floorColor;
|
|
o.pos = transform(i.pos, float3(lw, lw, 0), o.uv);
|
|
os.Append(o);
|
|
|
|
o.color = cellColor;
|
|
o.pos = transform(i.pos, float3(0.0, 1.0, lh), o.uv);
|
|
os.Append(o);
|
|
|
|
o.color = floorColor;
|
|
o.pos = transform(i.pos, float3(lw, 1 - lw, 0), o.uv);
|
|
os.Append(o);
|
|
|
|
o.color = cellColor;
|
|
o.pos = transform(i.pos, float3(1.0, 1.0, lh), o.uv);
|
|
os.Append(o);
|
|
|
|
o.color = floorColor;
|
|
o.pos = transform(i.pos, float3(1 - lw, 1 - lw, 0), o.uv);
|
|
os.Append(o);
|
|
|
|
o.color = cellColor;
|
|
o.pos = transform(i.pos, float3(1.0, 0.0, lh), o.uv);
|
|
os.Append(o);
|
|
|
|
o.color = floorColor;
|
|
o.pos = transform(i.pos, float3(1 - lw, lw, 0), o.uv);
|
|
os.Append(o);
|
|
|
|
o.color = cellColor;
|
|
o.pos = transform(i.pos, float3(0.0, 0.0, lh), o.uv);
|
|
os.Append(o);
|
|
|
|
o.color = floorColor;
|
|
o.pos = transform(i.pos, float3(lw, lw, 0), o.uv);
|
|
os.Append(o);
|
|
|
|
os.RestartStrip();
|
|
}
|
|
}
|
|
|
|
float4 gridFont(float2 uv, Texture2D tex)
|
|
{
|
|
uv.y = -0.5 + 2 * uv.y;
|
|
float font = 1 - tex.SampleLevel(samplerClamp, uv, 0).x;
|
|
float color = smoothstep(-100, 0, -font);
|
|
color = lerp(0, color, saturate(font));
|
|
color *= smoothstep(0, 0.05, uv.x);
|
|
color *= smoothstep(-1, -0.95, -uv.x);
|
|
color *= smoothstep(0, 0.05, uv.y);
|
|
color *= smoothstep(-1, -0.95, -uv.y);
|
|
return float4(0, 0, 0, color);
|
|
}
|
|
|
|
[entrypoint(ps)]
|
|
float4 ps_gridline(GOut i) : SV_Target0
|
|
{
|
|
float2 uv = i.uv;
|
|
if (uv.x<0.1||uv.y<0.1||uv.x>0.9||uv.y>0.9)
|
|
return i.color;
|
|
|
|
float4 fontColor = float4(0, 0, 0, 0);
|
|
int texId = floor(i.offset.x * 3);
|
|
if (texId == 0)
|
|
fontColor = gridFont(uv, t2d1);
|
|
else if (texId == 1)
|
|
fontColor = gridFont(uv, t2d2);
|
|
else if (texId == 2)
|
|
fontColor = gridFont(uv, t2d3);
|
|
|
|
return lerp(i.color, float4(fontColor.xyz, 1), fontColor.w);
|
|
}
|