Files
bluflame/nordlicht2015-intro/src/intro/shaders/lib/grid-lines.hlsl
2026-04-18 22:31:51 +02:00

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