b140299e50
Co-authored-by: mrange <marten_range@hotmail.com> I loved the pixel shaders in #7058, but that PR needed a bit of polish to be ready for ingestion. This PR is almost _exactly_ that PR, with some small changes. * It adds a new pre-profile setting `"experimental.pixelShaderPath"`, which lets the user set a pixel shader to use with the Terminal. - CHANGED FROM #7058: It does _not_ add any built-in shaders. - CHANGED FROM #7058: it will _override_ `experimental.retroTerminalEffect` * It adds a bunch of sample shaders in `samples/shaders`. Included: - A NOP shader as a base to build from. - An "invert" shader that inverts the colors, as a simple example - An "grayscale" shader that converts all colors to grayscale, as a simple example - An "raster bars" shader that draws some colored bars on the screen with a drop shadow, as a more involved example - The original retro terminal effects, as a more involved example - It also includes a broken shader, as an example of what heppens when the shader fails to compile - CHANGED FROM #7058: It does _not_ add the "retroII" shader we were all worried about. * When a shader fails to be found or fails to compile, we'll display an error dialog to the user with a relevant error message. - CHANGED FROM #7058: Originally, #7058 would display "error bars" on the screen. I've removed that, and had the Terminal disable the shader entirely then. * Renames the `toggleRetroEffect` action to `toggleShaderEffect`. (`toggleRetroEffect` is now an alias to `toggleShaderEffect`). This action will turn the shader OR the retro effects on/off. `toggleShaderEffect` works the way you'd expect it to, but the mental math on _how_ is a little weird. The logic is basically: ``` useShader = shaderEffectsEnabled ? (pixelShaderProvided ? pixelShader : (retroEffectEnabled ? retroEffect : null ) ) : null ``` and `toggleShaderEffect` toggles `shaderEffectsEnabled`. * If you've got both a shader and retro enabled, `toggleShaderEffect` will toggle between the shader on/off. * If you've got a shader and retro disabled, `toggleShaderEffect` will toggle between the shader on/off. References #6191 References #7058 Closes #7013 Closes #3930 "Add setting to retro terminal shader to control blur radius, color" Closes #3929 "Add setting to retro terminal shader to enable drawing scanlines" - At this point, just roll your own version of the shader.
92 lines
2.3 KiB
C++
92 lines
2.3 KiB
C++
#pragma once
|
|
|
|
#ifdef __INSIDE_WINDOWS
|
|
constexpr std::string_view retroPixelShaderString{ "" };
|
|
#else
|
|
constexpr std::string_view retroPixelShaderString{ R"(
|
|
// The original retro pixel shader
|
|
Texture2D shaderTexture;
|
|
SamplerState samplerState;
|
|
|
|
cbuffer PixelShaderSettings {
|
|
float Time;
|
|
float Scale;
|
|
float2 Resolution;
|
|
float4 Background;
|
|
};
|
|
|
|
#define SCANLINE_FACTOR 0.5
|
|
#define SCALED_SCANLINE_PERIOD Scale
|
|
#define SCALED_GAUSSIAN_SIGMA (2.0*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)
|
|
{
|
|
uint width, height;
|
|
shaderTexture.GetDimensions(width, height);
|
|
|
|
float texelWidth = 1.0f/width;
|
|
float texelHeight = 1.0f/height;
|
|
|
|
float4 color = { 0, 0, 0, 0 };
|
|
|
|
int sampleCount = 13;
|
|
|
|
for (int x = 0; x < sampleCount; x++)
|
|
{
|
|
float2 samplePos = { 0, 0 };
|
|
|
|
samplePos.x = tex_coord.x + (x - sampleCount/2) * texelWidth;
|
|
for (int y = 0; y < sampleCount; y++)
|
|
{
|
|
samplePos.y = tex_coord.y + (y - sampleCount/2) * texelHeight;
|
|
if (samplePos.x <= 0 || samplePos.y <= 0 || samplePos.x >= width || samplePos.y >= height) continue;
|
|
|
|
color += input.Sample(samplerState, samplePos) * Gaussian2D((x - sampleCount/2), (y - sampleCount/2), sigma);
|
|
}
|
|
}
|
|
|
|
return color;
|
|
}
|
|
|
|
float SquareWave(float y)
|
|
{
|
|
return 1 - (floor(y / SCALED_SCANLINE_PERIOD) % 2) * 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.2 && false)
|
|
{
|
|
return color + wave*0.1;
|
|
}
|
|
else
|
|
{
|
|
return color * wave;
|
|
}
|
|
}
|
|
|
|
float4 main(float4 pos : SV_POSITION, float2 tex : TEXCOORD) : SV_TARGET
|
|
{
|
|
Texture2D input = shaderTexture;
|
|
|
|
// TODO:GH#3930 Make these configurable in some way.
|
|
float4 color = input.Sample(samplerState, tex);
|
|
color += Blur(input, tex, SCALED_GAUSSIAN_SIGMA)*0.3;
|
|
color = Scanline(color, pos);
|
|
|
|
return color;
|
|
}
|
|
)" };
|
|
#endif
|