mirror of
https://github.com/microsoft/terminal.git
synced 2025-12-11 04:20:31 -06:00
This commit implements support for custom shaders in AtlasEngine (`experimental.retroTerminalEffect` and `experimental.pixelShaderPath`). Setting these properties invalidates the device because that made it the easiest to implement this less often used feature. The retro shader was slightly rewritten so that it compiles without warnings. Additionally we noticed that AtlasEngine works well with D3D 10.0 hardware, so support for that was added bringing feature parity with DxRenderer. Closes #13853 ## Validation Steps Performed * Default settings (Independent Flip) ✅ * ClearType (Independent Flip) ✅ * Retro Terminal Effect (Composed Flip) ✅ * Use wallpaper as background image (Composed Flip) ✅ * Running `color 40` draws everything red ✅ * With Retro Terminal Effect ✅
83 lines
2.1 KiB
HLSL
83 lines
2.1 KiB
HLSL
// The original retro pixel shader
|
|
Texture2D shaderTexture;
|
|
SamplerState samplerState;
|
|
|
|
cbuffer PixelShaderSettings
|
|
{
|
|
float time;
|
|
float scale;
|
|
float2 resolution;
|
|
float4 background;
|
|
};
|
|
|
|
#define SCANLINE_FACTOR 0.5f
|
|
#define SCALED_SCANLINE_PERIOD scale
|
|
#define SCALED_GAUSSIAN_SIGMA (2.0f * scale)
|
|
|
|
static const float M_PI = 3.14159265f;
|
|
|
|
float Gaussian2D(float x, float y, float sigma)
|
|
{
|
|
return 1 / (sigma * sqrt(2 * M_PI)) * exp(-0.5 * (x * x + y * y) / sigma / sigma);
|
|
}
|
|
|
|
float4 Blur(Texture2D input, float2 tex_coord, float sigma)
|
|
{
|
|
float width, height;
|
|
shaderTexture.GetDimensions(width, height);
|
|
|
|
float texelWidth = 1.0f / width;
|
|
float texelHeight = 1.0f / height;
|
|
|
|
float4 color = { 0, 0, 0, 0 };
|
|
|
|
float sampleCount = 13;
|
|
|
|
for (float x = 0; x < sampleCount; x++)
|
|
{
|
|
float2 samplePos = { 0, 0 };
|
|
samplePos.x = tex_coord.x + (x - sampleCount / 2.0f) * texelWidth;
|
|
|
|
for (float y = 0; y < sampleCount; y++)
|
|
{
|
|
samplePos.y = tex_coord.y + (y - sampleCount / 2.0f) * texelHeight;
|
|
color += input.Sample(samplerState, samplePos) * Gaussian2D(x - sampleCount / 2.0f, y - sampleCount / 2.0f, sigma);
|
|
}
|
|
}
|
|
|
|
return color;
|
|
}
|
|
|
|
float SquareWave(float y)
|
|
{
|
|
return 1.0f - (floor(y / SCALED_SCANLINE_PERIOD) % 2.0f) * SCANLINE_FACTOR;
|
|
}
|
|
|
|
float4 Scanline(float4 color, float4 pos)
|
|
{
|
|
float wave = SquareWave(pos.y);
|
|
|
|
// TODO:GH#3929 make this configurable.
|
|
// Remove the && false to draw scanlines everywhere.
|
|
if (length(color.rgb) < 0.2f && false)
|
|
{
|
|
return color + wave * 0.1f;
|
|
}
|
|
else
|
|
{
|
|
return color * wave;
|
|
}
|
|
}
|
|
|
|
// clang-format off
|
|
float4 main(float4 pos : SV_POSITION, float2 tex : TEXCOORD) : SV_TARGET
|
|
// clang-format on
|
|
{
|
|
// TODO:GH#3930 Make these configurable in some way.
|
|
float4 color = shaderTexture.Sample(samplerState, tex);
|
|
color += Blur(shaderTexture, tex, SCALED_GAUSSIAN_SIGMA) * 0.3f;
|
|
color = Scanline(color, pos);
|
|
|
|
return color;
|
|
}
|