diff --git a/shaders/slang/stencilbuffer/outline.slang b/shaders/slang/stencilbuffer/outline.slang new file mode 100644 index 00000000..332f220d --- /dev/null +++ b/shaders/slang/stencilbuffer/outline.slang @@ -0,0 +1,42 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: MIT + * + */ + +struct VSInput +{ + float4 Pos; + float3 Color; + float3 Normal; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; +} + +struct UBO +{ + float4x4 projection; + float4x4 model; + float4 lightPos; + float outlineWidth; +}; +ConstantBuffer ubo; + +[shader("vertex")] +VSOutput vertexMain(VSInput input) +{ + // Extrude along normal + VSOutput output; + float4 pos = float4(input.Pos.xyz + input.Normal * ubo.outlineWidth, input.Pos.w); + output.Pos = mul(ubo.projection, mul(ubo.model, pos)); + return output; +} + +[shader("fragment")] +float4 fragmentMain() +{ + return float4(1.0, 1.0, 1.0, 1.0); +} \ No newline at end of file diff --git a/shaders/slang/stencilbuffer/toon.slang b/shaders/slang/stencilbuffer/toon.slang new file mode 100644 index 00000000..b7bf1314 --- /dev/null +++ b/shaders/slang/stencilbuffer/toon.slang @@ -0,0 +1,65 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: MIT + * + */ + +struct VSInput +{ + float3 Pos; + float3 Color; + float3 Normal; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float3 Color; + float3 LightVec; +}; + +struct UBO +{ + float4x4 projection; + float4x4 model; + float4 lightPos; +}; +ConstantBuffer ubo; + +Sampler2D samplerColorMap; + +[shader("vertex")] +VSOutput vertexMain(VSInput input) +{ + VSOutput output; + output.Color = float3(1.0, 0.0, 0.0); + output.Pos = mul(ubo.projection, mul(ubo.model, float4(input.Pos.xyz, 1.0))); + output.Normal = mul((float3x3)ubo.model, input.Normal); + float4 pos = mul(ubo.model, float4(input.Pos, 1.0)); + float3 lPos = mul((float3x3)ubo.model, ubo.lightPos.xyz); + output.LightVec = lPos - pos.xyz; + return output; +} + +[shader("fragment")] +float4 fragmentMain(VSOutput input) +{ + float3 color; + float3 N = normalize(input.Normal); + float3 L = normalize(input.LightVec); + float intensity = dot(N,L); + if (intensity > 0.98) + color = input.Color * 1.5; + else if (intensity > 0.9) + color = input.Color * 1.0; + else if (intensity > 0.5) + color = input.Color * 0.6; + else if (intensity > 0.25) + color = input.Color * 0.4; + else + color = input.Color * 0.2; + // Desaturate a bit + color = lerp(color, dot(float3(0.2126,0.7152,0.0722), color).xxx, 0.1); + return float4(color, 1); +} \ No newline at end of file diff --git a/shaders/slang/textoverlay/mesh.slang b/shaders/slang/textoverlay/mesh.slang new file mode 100644 index 00000000..a7c4d07d --- /dev/null +++ b/shaders/slang/textoverlay/mesh.slang @@ -0,0 +1,56 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: MIT + * + */ + +struct VSInput +{ + float3 Pos; + float3 Normal; + float2 UV; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float3 Normal; + float2 UV; + float3 ViewVec; + float3 LightVec; +}; + +struct UBO +{ + float4x4 projection; + float4x4 model; + float4 lightPos; +}; +ConstantBuffer ubo; + +[shader("vertex")] +VSOutput vertexMain(VSInput input) +{ + VSOutput output; + output.Normal = input.Normal; + output.UV = input.UV; + output.Pos = mul(ubo.projection, mul(ubo.model, float4(input.Pos.xyz, 1.0))); + float4 pos = mul(ubo.model, float4(input.Pos, 1.0)); + output.Normal = mul((float3x3)ubo.model, normalize(input.Normal)); + float3 lPos = mul((float3x3)ubo.model, ubo.lightPos.xyz); + output.LightVec = lPos - pos.xyz; + output.ViewVec = -pos.xyz; + return output; +} + +[shader("fragment")] +float4 fragmentMain(VSOutput input) +{ + float3 N = normalize(input.Normal); + float3 L = normalize(input.LightVec); + float3 V = normalize(input.ViewVec); + float3 R = reflect(-L, N); + float diffuse = max(dot(N, L), 0.0); + float specular = pow(max(dot(R, V), 0.0), 1.0); + return float4(((diffuse + specular) * 0.25).xxx, 1.0); +} \ No newline at end of file diff --git a/shaders/slang/textoverlay/text.slang b/shaders/slang/textoverlay/text.slang new file mode 100644 index 00000000..f4ca9337 --- /dev/null +++ b/shaders/slang/textoverlay/text.slang @@ -0,0 +1,35 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: MIT + * + */ + + struct VSInput +{ + float2 Pos; + float2 UV; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +Sampler2D samplerFont; + +[shader("vertex")] +VSOutput vertexMain(VSInput input) +{ + VSOutput output; + output.Pos = float4(input.Pos, 0.0, 1.0); + output.UV = input.UV; + return output; +} + +[shader("fragment")] +float4 fragmentMain(VSOutput input) +{ + float color = samplerFont.Sample(input.UV).r; + return color.xxxx; +}