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 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); }