diff --git a/app/app.pro b/app/app.pro index ce41a2b..338e0a6 100644 --- a/app/app.pro +++ b/app/app.pro @@ -21,6 +21,9 @@ isEmpty(QSB_BIN): QSB_BIN = $$[QT_INSTALL_BINS]/qsb SHADERS_DIR = $${_PRO_FILE_PWD_}/shaders SHADERS += $$files($$SHADERS_DIR/*.frag) $$files($$SHADERS_DIR/*.vert) +SHADERS -= $$SHADERS_DIR/terminal_dynamic.frag +SHADERS -= $$SHADERS_DIR/terminal_static.frag +SHADERS -= $$SHADERS_DIR/passthrough.vert qsb.input = SHADERS qsb.output = ../../app/shaders/${QMAKE_FILE_NAME}.qsb @@ -32,6 +35,45 @@ QMAKE_EXTRA_COMPILERS += qsb PRE_TARGETDEPS += $$QSB_FILES OTHER_FILES += $$SHADERS $$QSB_FILES +DYNAMIC_SHADER = $$SHADERS_DIR/terminal_dynamic.frag +STATIC_SHADER = $$SHADERS_DIR/terminal_static.frag + +RASTER_MODES = 0 1 2 3 +BINARY_FLAGS = 0 1 +VARIANT_SHADER_DIR = $$relative_path($$PWD/shaders, $$OUT_PWD) + +for(raster_mode, RASTER_MODES) { + for(burn_in, BINARY_FLAGS) { + for(display_frame, BINARY_FLAGS) { + for(chroma_on, BINARY_FLAGS) { + dynamic_variant = terminal_dynamic_raster$${raster_mode}_burn$${burn_in}_frame$${display_frame}_chroma$${chroma_on} + dynamic_output = $${VARIANT_SHADER_DIR}/$${dynamic_variant}.frag.qsb + dynamic_target = shader_variant_$${dynamic_variant} + $${dynamic_target}.target = $${dynamic_output} + $${dynamic_target}.depends = $$DYNAMIC_SHADER + $${dynamic_target}.commands = $$QSB_BIN --glsl \"100 es,120,150\" --hlsl 50 --msl 12 --qt6 -DCRT_RASTER_MODE=$${raster_mode} -DCRT_BURN_IN=$${burn_in} -DCRT_DISPLAY_FRAME=$${display_frame} -DCRT_CHROMA=$${chroma_on} -o $${dynamic_output} $$DYNAMIC_SHADER + QMAKE_EXTRA_TARGETS += $${dynamic_target} + } + } + } +} + +for(rgb_shift, BINARY_FLAGS) { + for(chroma_on, BINARY_FLAGS) { + for(bloom_on, BINARY_FLAGS) { + for(curve_on, BINARY_FLAGS) { + static_variant = terminal_static_rgb$${rgb_shift}_chroma$${chroma_on}_bloom$${bloom_on}_curve$${curve_on} + static_output = $${VARIANT_SHADER_DIR}/$${static_variant}.frag.qsb + static_target = shader_variant_$${static_variant} + $${static_target}.target = $${static_output} + $${static_target}.depends = $$STATIC_SHADER + $${static_target}.commands = $$QSB_BIN --glsl \"100 es,120,150\" --hlsl 50 --msl 12 --qt6 -DCRT_RGB_SHIFT=$${rgb_shift} -DCRT_CHROMA=$${chroma_on} -DCRT_BLOOM=$${bloom_on} -DCRT_CURVATURE=$${curve_on} -o $${static_output} $$STATIC_SHADER + QMAKE_EXTRA_TARGETS += $${static_target} + } + } + } +} + ######################################### ## INTALLS ######################################### diff --git a/app/qml/BurnInEffect.qml b/app/qml/BurnInEffect.qml index 4f5fd53..88a6966 100644 --- a/app/qml/BurnInEffect.qml +++ b/app/qml/BurnInEffect.qml @@ -105,6 +105,8 @@ Loader { ShaderEffect { id: burnInShaderEffect + property real time: timeManager.time + property variant txt_source: kterminalSource property variant burnInSource: burnInEffectSource property real burnInTime: burnInFadeTime @@ -114,37 +116,8 @@ Loader { anchors.fill: parent blending: false - // Extra uniforms required by shared block - property real qt_Opacity: 1.0 - property real time: timeManager.time - property color fontColor: appSettings.fontColor - property color backgroundColor: appSettings.backgroundColor - property real shadowLength: 0 - property size virtualResolution: Qt.size(width, height) - property real rasterizationIntensity: 0 - property int rasterizationMode: 0 - property real burnIn: appSettings.burnIn - property real staticNoise: 0 - property real screenCurvature: 0 - property real glowingLine: 0 - property real chromaColor: 0 - property size jitterDisplacement: Qt.size(0, 0) - property real ambientLight: 0 - property real jitter: 0 - property real horizontalSync: 0 - property real horizontalSyncStrength: 0 - property real flickering: 0 - property real displayTerminalFrame: 0 - property size scaleNoiseSize: Qt.size(0, 0) - property real screen_brightness: 1.0 - property real bloom: 0 - property real rbgShift: 0 - property real frameShadowCoeff: 0 - property real frameShininess: 0 - property color frameColor: backgroundColor - property real frameSize: 0 fragmentShader: "qrc:/shaders/burn_in.frag.qsb" - vertexShader: "qrc:/shaders/passthrough.vert.qsb" + vertexShader: "qrc:/shaders/burn_in.vert.qsb" onStatusChanged: if (log) console.log(log) //Print warning messages } diff --git a/app/qml/ShaderTerminal.qml b/app/qml/ShaderTerminal.qml index 50ba426..1a9bb92 100644 --- a/app/qml/ShaderTerminal.qml +++ b/app/qml/ShaderTerminal.qml @@ -23,6 +23,30 @@ import QtQuick 2.2 import "utils.js" as Utils Item { + function dynamicFragmentPath() { + var rasterMode = appSettings.rasterization; + var burnInOn = appSettings.burnIn > 0 ? 1 : 0; + var frameOn = (appSettings._frameSize > 0 || appSettings.screenCurvature > 0) ? 1 : 0; + var chromaOn = appSettings.chromaColor > 0 ? 1 : 0; + return "qrc:/shaders/terminal_dynamic_raster" + rasterMode + + "_burn" + burnInOn + + "_frame" + frameOn + + "_chroma" + chromaOn + + ".frag.qsb"; + } + + function staticFragmentPath() { + var rgbShiftOn = appSettings.rbgShift > 0 ? 1 : 0; + var chromaOn = appSettings.chromaColor > 0 ? 1 : 0; + var bloomOn = appSettings.bloom > 0 ? 1 : 0; + var curvatureOn = (appSettings.screenCurvature > 0 || appSettings.frameSize > 0) ? 1 : 0; + return "qrc:/shaders/terminal_static_rgb" + rgbShiftOn + + "_chroma" + chromaOn + + "_bloom" + bloomOn + + "_curve" + curvatureOn + + ".frag.qsb"; + } + property ShaderEffectSource source property BurnInEffect burnInEffect property ShaderEffectSource bloomSource @@ -69,7 +93,6 @@ Item { property real jitter: appSettings.jitter property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter) - property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight) property real staticNoise: appSettings.staticNoise property size scaleNoiseSize: Qt.size((width * 0.75) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling), (height * 0.75) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling)) @@ -79,21 +102,13 @@ Item { // Rasterization might display oversamping issues if virtual resolution is close to physical display resolution. // We progressively disable rasterization from 4x up to 2x resolution. property real rasterizationIntensity: Utils.smoothstep(2.0, 4.0, _screenDensity) - property int rasterizationMode: appSettings.rasterization property real displayTerminalFrame: appSettings._frameSize > 0 || appSettings.screenCurvature > 0 property real time: timeManager.time property ShaderEffectSource noiseSource: noiseShaderSource - // Extra uniforms expected by the shared uniform block - property real frameShadowCoeff: 0 - property color frameColor: backgroundColor property real frameSize: appSettings.frameSize - property real prevLastUpdate: burnInEffect.prevLastUpdate - property real screen_brightness: Utils.lint(0.5, 1.5, appSettings.brightness) - property real bloom: appSettings.bloom - property real rbgShift: (appSettings.rbgShift / Math.max(width, 1)) * appSettings.totalFontScaling property real frameShininess: appSettings.frameShininess anchors.fill: parent @@ -116,7 +131,7 @@ Item { } vertexShader: "qrc:/shaders/terminal_dynamic.vert.qsb" - fragmentShader: "qrc:/shaders/terminal_dynamic.frag.qsb" + fragmentShader: dynamicFragmentPath() onStatusChanged: if (log) console.log(log) } @@ -167,43 +182,15 @@ Item { property real rbgShift: (appSettings.rbgShift / width) * appSettings.totalFontScaling - property int rasterization: appSettings.rasterization - property real screen_brightness: Utils.lint(0.5, 1.5, appSettings.brightness) - - property real ambientLight: parent.ambientLight - - property size virtualResolution: parent.virtualResolution property real frameShininess: appSettings.frameShininess - - // Extra uniforms to match shared uniform block - property real time: timeManager.time - property real shadowLength: 0 - property real rasterizationIntensity: Utils.smoothstep(2.0, 4.0, _screenDensity) - property int rasterizationMode: appSettings.rasterization - property real burnInLastUpdate: burnInEffect.lastUpdate - property real burnInTime: burnInEffect.burnInFadeTime - property real burnIn: appSettings.burnIn - property real staticNoise: appSettings.staticNoise - property real glowingLine: appSettings.glowingLine * 0.2 - property size jitterDisplacement: Qt.size(0, 0) - property real jitter: appSettings.jitter - property real horizontalSync: appSettings.horizontalSync - property real horizontalSyncStrength: Utils.lint(0.05, 0.35, horizontalSync) - property real flickering: appSettings.flickering - property real displayTerminalFrame: dynamicShader.displayTerminalFrame - property size scaleNoiseSize: Qt.size((width * 0.75) / (512 * appSettings.windowScaling * appSettings.totalFontScaling), - (height * 0.75) / (512 * appSettings.windowScaling * appSettings.totalFontScaling)) - property real frameShadowCoeff: 0 - property color frameColor: backgroundColor property real frameSize: appSettings.frameSize - property real prevLastUpdate: burnInEffect.prevLastUpdate blending: false visible: false - vertexShader: "qrc:/shaders/passthrough.vert.qsb" - fragmentShader: "qrc:/shaders/terminal_static.frag.qsb" + vertexShader: "qrc:/shaders/terminal_static.vert.qsb" + fragmentShader: staticFragmentPath() onStatusChanged: if (log) console.log(log) } diff --git a/app/qml/TerminalFrame.qml b/app/qml/TerminalFrame.qml index dd0e56c..4fd07a8 100644 --- a/app/qml/TerminalFrame.qml +++ b/app/qml/TerminalFrame.qml @@ -42,35 +42,9 @@ ShaderEffect { property real frameSize: appSettings.frameSize - // Uniforms required by the shared block property real qt_Opacity: 1.0 - property real time: timeManager.time - property color fontColor: appSettings.fontColor - property color backgroundColor: appSettings.backgroundColor - property real shadowLength: 0 - property size virtualResolution: Qt.size(width, height) - property real rasterizationIntensity: 0 - property int rasterizationMode: 0 - property real burnInLastUpdate: 0 - property real burnInTime: 0 - property real burnIn: 0 - property real staticNoise: 0 - property real glowingLine: 0 - property real chromaColor: 0 - property size jitterDisplacement: Qt.size(0, 0) - property real ambientLight: _ambientLight - property real jitter: 0 - property real horizontalSync: 0 - property real horizontalSyncStrength: 0 - property real flickering: 0 - property real displayTerminalFrame: 0 - property size scaleNoiseSize: Qt.size(0, 0) - property real screen_brightness: 1.0 - property real bloom: 0 - property real rbgShift: 0 - property real prevLastUpdate: 0 - vertexShader: "qrc:/shaders/passthrough.vert.qsb" + vertexShader: "qrc:/shaders/terminal_frame.vert.qsb" fragmentShader: "qrc:/shaders/terminal_frame.frag.qsb" onStatusChanged: if (log) console.log(log) //Print warning messages diff --git a/app/qml/resources.qrc b/app/qml/resources.qrc index 57f43da..ecb5287 100644 --- a/app/qml/resources.qrc +++ b/app/qml/resources.qrc @@ -45,9 +45,57 @@ ShaderLibrary.qml menus/OSXMenu.qml ../shaders/terminal_dynamic.vert.qsb - ../shaders/terminal_dynamic.frag.qsb - ../shaders/passthrough.vert.qsb - ../shaders/terminal_static.frag.qsb + ../shaders/terminal_static.vert.qsb + ../shaders/terminal_frame.vert.qsb + ../shaders/burn_in.vert.qsb + ../shaders/terminal_dynamic_raster0_burn0_frame0_chroma0.frag.qsb + ../shaders/terminal_dynamic_raster0_burn0_frame0_chroma1.frag.qsb + ../shaders/terminal_dynamic_raster0_burn0_frame1_chroma0.frag.qsb + ../shaders/terminal_dynamic_raster0_burn0_frame1_chroma1.frag.qsb + ../shaders/terminal_dynamic_raster0_burn1_frame0_chroma0.frag.qsb + ../shaders/terminal_dynamic_raster0_burn1_frame0_chroma1.frag.qsb + ../shaders/terminal_dynamic_raster0_burn1_frame1_chroma0.frag.qsb + ../shaders/terminal_dynamic_raster0_burn1_frame1_chroma1.frag.qsb + ../shaders/terminal_dynamic_raster1_burn0_frame0_chroma0.frag.qsb + ../shaders/terminal_dynamic_raster1_burn0_frame0_chroma1.frag.qsb + ../shaders/terminal_dynamic_raster1_burn0_frame1_chroma0.frag.qsb + ../shaders/terminal_dynamic_raster1_burn0_frame1_chroma1.frag.qsb + ../shaders/terminal_dynamic_raster1_burn1_frame0_chroma0.frag.qsb + ../shaders/terminal_dynamic_raster1_burn1_frame0_chroma1.frag.qsb + ../shaders/terminal_dynamic_raster1_burn1_frame1_chroma0.frag.qsb + ../shaders/terminal_dynamic_raster1_burn1_frame1_chroma1.frag.qsb + ../shaders/terminal_dynamic_raster2_burn0_frame0_chroma0.frag.qsb + ../shaders/terminal_dynamic_raster2_burn0_frame0_chroma1.frag.qsb + ../shaders/terminal_dynamic_raster2_burn0_frame1_chroma0.frag.qsb + ../shaders/terminal_dynamic_raster2_burn0_frame1_chroma1.frag.qsb + ../shaders/terminal_dynamic_raster2_burn1_frame0_chroma0.frag.qsb + ../shaders/terminal_dynamic_raster2_burn1_frame0_chroma1.frag.qsb + ../shaders/terminal_dynamic_raster2_burn1_frame1_chroma0.frag.qsb + ../shaders/terminal_dynamic_raster2_burn1_frame1_chroma1.frag.qsb + ../shaders/terminal_dynamic_raster3_burn0_frame0_chroma0.frag.qsb + ../shaders/terminal_dynamic_raster3_burn0_frame0_chroma1.frag.qsb + ../shaders/terminal_dynamic_raster3_burn0_frame1_chroma0.frag.qsb + ../shaders/terminal_dynamic_raster3_burn0_frame1_chroma1.frag.qsb + ../shaders/terminal_dynamic_raster3_burn1_frame0_chroma0.frag.qsb + ../shaders/terminal_dynamic_raster3_burn1_frame0_chroma1.frag.qsb + ../shaders/terminal_dynamic_raster3_burn1_frame1_chroma0.frag.qsb + ../shaders/terminal_dynamic_raster3_burn1_frame1_chroma1.frag.qsb + ../shaders/terminal_static_rgb0_chroma0_bloom0_curve0.frag.qsb + ../shaders/terminal_static_rgb0_chroma0_bloom0_curve1.frag.qsb + ../shaders/terminal_static_rgb0_chroma0_bloom1_curve0.frag.qsb + ../shaders/terminal_static_rgb0_chroma0_bloom1_curve1.frag.qsb + ../shaders/terminal_static_rgb0_chroma1_bloom0_curve0.frag.qsb + ../shaders/terminal_static_rgb0_chroma1_bloom0_curve1.frag.qsb + ../shaders/terminal_static_rgb0_chroma1_bloom1_curve0.frag.qsb + ../shaders/terminal_static_rgb0_chroma1_bloom1_curve1.frag.qsb + ../shaders/terminal_static_rgb1_chroma0_bloom0_curve0.frag.qsb + ../shaders/terminal_static_rgb1_chroma0_bloom0_curve1.frag.qsb + ../shaders/terminal_static_rgb1_chroma0_bloom1_curve0.frag.qsb + ../shaders/terminal_static_rgb1_chroma0_bloom1_curve1.frag.qsb + ../shaders/terminal_static_rgb1_chroma1_bloom0_curve0.frag.qsb + ../shaders/terminal_static_rgb1_chroma1_bloom0_curve1.frag.qsb + ../shaders/terminal_static_rgb1_chroma1_bloom1_curve0.frag.qsb + ../shaders/terminal_static_rgb1_chroma1_bloom1_curve1.frag.qsb ../shaders/terminal_frame.frag.qsb ../shaders/burn_in.frag.qsb fonts/unscii/unscii-8-thin.ttf diff --git a/app/shaders/burn_in.frag b/app/shaders/burn_in.frag index ffb4f54..0e44943 100644 --- a/app/shaders/burn_in.frag +++ b/app/shaders/burn_in.frag @@ -6,33 +6,8 @@ layout(location = 0) out vec4 fragColor; layout(std140, binding = 0) uniform ubuf { mat4 qt_Matrix; float qt_Opacity; - float time; - vec4 fontColor; - vec4 backgroundColor; - float shadowLength; - vec2 virtualResolution; - float rasterizationIntensity; - int rasterizationMode; float burnInLastUpdate; float burnInTime; - float burnIn; - float staticNoise; - float screenCurvature; - float glowingLine; - float chromaColor; - vec2 jitterDisplacement; - float ambientLight; - float jitter; - float horizontalSync; - float horizontalSyncStrength; - float flickering; - float displayTerminalFrame; - vec2 scaleNoiseSize; - float screen_brightness; - float bloom; - float rbgShift; - float frameShadowCoeff; - vec4 frameColor; float prevLastUpdate; }; diff --git a/app/shaders/burn_in.frag.qsb b/app/shaders/burn_in.frag.qsb index 543399f..8f67421 100644 Binary files a/app/shaders/burn_in.frag.qsb and b/app/shaders/burn_in.frag.qsb differ diff --git a/app/shaders/burn_in.vert b/app/shaders/burn_in.vert new file mode 100644 index 0000000..8e478c9 --- /dev/null +++ b/app/shaders/burn_in.vert @@ -0,0 +1,19 @@ +#version 440 + +layout(location = 0) in vec4 qt_Vertex; +layout(location = 1) in vec2 qt_MultiTexCoord0; + +layout(std140, binding = 0) uniform ubuf { + mat4 qt_Matrix; + float qt_Opacity; + float burnInLastUpdate; + float burnInTime; + float prevLastUpdate; +}; + +layout(location = 0) out vec2 qt_TexCoord0; + +void main() { + qt_TexCoord0 = qt_MultiTexCoord0; + gl_Position = qt_Matrix * qt_Vertex; +} diff --git a/app/shaders/burn_in.vert.qsb b/app/shaders/burn_in.vert.qsb new file mode 100644 index 0000000..539661c Binary files /dev/null and b/app/shaders/burn_in.vert.qsb differ diff --git a/app/shaders/terminal_dynamic.frag b/app/shaders/terminal_dynamic.frag index cc0b057..179cd61 100644 --- a/app/shaders/terminal_dynamic.frag +++ b/app/shaders/terminal_dynamic.frag @@ -1,5 +1,18 @@ #version 440 +#ifndef CRT_RASTER_MODE +#define CRT_RASTER_MODE 0 +#endif +#ifndef CRT_BURN_IN +#define CRT_BURN_IN 1 +#endif +#ifndef CRT_DISPLAY_FRAME +#define CRT_DISPLAY_FRAME 1 +#endif +#ifndef CRT_CHROMA +#define CRT_CHROMA 1 +#endif + layout(location = 0) in vec2 qt_TexCoord0; layout(location = 1) in float vBrightness; layout(location = 2) in float vDistortionScale; @@ -13,10 +26,8 @@ layout(std140, binding = 0) uniform ubuf { float time; vec4 fontColor; vec4 backgroundColor; - float shadowLength; vec2 virtualResolution; float rasterizationIntensity; - int rasterizationMode; float burnInLastUpdate; float burnInTime; float burnIn; @@ -32,14 +43,8 @@ layout(std140, binding = 0) uniform ubuf { float flickering; float displayTerminalFrame; vec2 scaleNoiseSize; - float screen_brightness; - float bloom; - float rbgShift; - float frameShadowCoeff; float frameShininess; - vec4 frameColor; float frameSize; - float prevLastUpdate; }; layout(binding = 0) uniform sampler2D noiseSource; @@ -59,53 +64,57 @@ vec2 distortCoordinates(vec2 coords){ return (paddedCoords + cc * (1.0 + dist) * dist); } -vec3 applyRasterization(vec2 screenCoords, vec3 texel, vec2 virtualRes, float intensity, int mode) { - if (intensity <= 0.0 || mode == 0) { +vec3 applyRasterization(vec2 screenCoords, vec3 texel, vec2 virtualRes, float intensity) { +#if CRT_RASTER_MODE == 0 + return texel; +#else + if (intensity <= 0.0) { return texel; } const float INTENSITY = 0.30; const float BRIGHTBOOST = 0.30; - if (mode == 1) { // scanline - vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel; - vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * texel)) * texel; +#if CRT_RASTER_MODE == 1 + vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel; + vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * texel)) * texel; - vec2 coords = fract(screenCoords * virtualRes) * 2.0 - vec2(1.0); - float mask = 1.0 - abs(coords.y); + vec2 coords = fract(screenCoords * virtualRes) * 2.0 - vec2(1.0); + float mask = 1.0 - abs(coords.y); - vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask); - return mix(texel, rasterizationColor, intensity); - } else if (mode == 2) { // pixel - vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel; - vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * texel)) * texel; + vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask); + return mix(texel, rasterizationColor, intensity); +#elif CRT_RASTER_MODE == 2 + vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * texel)) * texel; + vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * texel)) * texel; - vec2 coords = fract(screenCoords * virtualRes) * 2.0 - vec2(1.0); - coords = coords * coords; - float mask = 1.0 - coords.x - coords.y; + vec2 coords = fract(screenCoords * virtualRes) * 2.0 - vec2(1.0); + coords = coords * coords; + float mask = 1.0 - coords.x - coords.y; - vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask); - return mix(texel, rasterizationColor, intensity); - } else if (mode == 3) { // subpixel - const float SUBPIXELS = 3.0; - vec3 offsets = vec3(3.141592654) * vec3(0.5, 0.5 - 2.0 / 3.0, 0.5 - 4.0 / 3.0); + vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask); + return mix(texel, rasterizationColor, intensity); +#elif CRT_RASTER_MODE == 3 + const float SUBPIXELS = 3.0; + vec3 offsets = vec3(3.141592654) * vec3(0.5, 0.5 - 2.0 / 3.0, 0.5 - 4.0 / 3.0); - vec2 omega = vec2(3.141592654) * vec2(2.0) * virtualRes; - vec2 angle = screenCoords * omega; - vec3 xfactors = (SUBPIXELS + sin(angle.x + offsets)) / (SUBPIXELS + 1.0); + vec2 omega = vec2(3.141592654) * vec2(2.0) * virtualRes; + vec2 angle = screenCoords * omega; + vec3 xfactors = (SUBPIXELS + sin(angle.x + offsets)) / (SUBPIXELS + 1.0); - vec3 result = texel * xfactors; - vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * result)) * result; - vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * result)) * result; + vec3 result = texel * xfactors; + vec3 pixelHigh = ((1.0 + BRIGHTBOOST) - (0.2 * result)) * result; + vec3 pixelLow = ((1.0 - INTENSITY) + (0.1 * result)) * result; - vec2 coords = fract(screenCoords * virtualRes) * 2.0 - vec2(1.0); - float mask = 1.0 - abs(coords.y); - - vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask); - return mix(texel, rasterizationColor, intensity); - } + vec2 coords = fract(screenCoords * virtualRes) * 2.0 - vec2(1.0); + float mask = 1.0 - abs(coords.y); + vec3 rasterizationColor = mix(pixelLow, pixelHigh, mask); + return mix(texel, rasterizationColor, intensity); +#else return texel; +#endif +#endif } float randomPass(vec2 coords){ @@ -113,11 +122,13 @@ float randomPass(vec2 coords){ } vec3 convertWithChroma(vec3 inColor) { +#if CRT_CHROMA == 1 vec3 outColor = fontColor.rgb * rgb2grey(inColor); - if (chromaColor != 0.0) { - outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor); - } + outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor); return outColor; +#else + return fontColor.rgb * rgb2grey(inColor); +#endif } void main() { @@ -140,15 +151,15 @@ void main() { vec3 txt_color = texture(screenBuffer, txt_coords).rgb; - if (burnIn > 0.0) { - vec4 txt_blur = texture(burnInSource, staticCoords); - float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0); - vec3 burnInColor = 0.65 * (txt_blur.rgb - vec3(blurDecay)); - txt_color = max(txt_color, convertWithChroma(burnInColor)); - } +#if CRT_BURN_IN == 1 + vec4 txt_blur = texture(burnInSource, staticCoords); + float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0); + vec3 burnInColor = 0.65 * (txt_blur.rgb - vec3(blurDecay)); + txt_color = max(txt_color, convertWithChroma(burnInColor)); +#endif txt_color += fontColor.rgb * vec3(color); - txt_color = applyRasterization(staticCoords, txt_color, virtualResolution, rasterizationIntensity, rasterizationMode); + txt_color = applyRasterization(staticCoords, txt_color, virtualResolution, rasterizationIntensity); vec3 finalColor = txt_color; float brightness = mix(1.0, vBrightness, step(0.0, flickering)); @@ -156,12 +167,12 @@ void main() { finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance); - if (displayTerminalFrame > 0.0) { - vec4 frameColor = texture(frameSource, qt_TexCoord0); - vec3 reflection = max(finalColor - backgroundColor.rgb, vec3(0.0)); - reflection *= frameShininess; - finalColor = mix(finalColor, frameColor.rgb + reflection, frameColor.a); - } +#if CRT_DISPLAY_FRAME == 1 + vec4 frameColor = texture(frameSource, qt_TexCoord0); + vec3 reflection = max(finalColor - backgroundColor.rgb, vec3(0.0)); + reflection *= frameShininess; + finalColor = mix(finalColor, frameColor.rgb + reflection, frameColor.a); +#endif fragColor = vec4(finalColor, qt_Opacity); } diff --git a/app/shaders/terminal_dynamic.frag.qsb b/app/shaders/terminal_dynamic.frag.qsb deleted file mode 100644 index ad4dd84..0000000 Binary files a/app/shaders/terminal_dynamic.frag.qsb and /dev/null differ diff --git a/app/shaders/terminal_dynamic.vert b/app/shaders/terminal_dynamic.vert index 7426420..5723b41 100644 --- a/app/shaders/terminal_dynamic.vert +++ b/app/shaders/terminal_dynamic.vert @@ -9,10 +9,8 @@ layout(std140, binding = 0) uniform ubuf { float time; vec4 fontColor; vec4 backgroundColor; - float shadowLength; vec2 virtualResolution; float rasterizationIntensity; - int rasterizationMode; float burnInLastUpdate; float burnInTime; float burnIn; @@ -28,14 +26,8 @@ layout(std140, binding = 0) uniform ubuf { float flickering; float displayTerminalFrame; vec2 scaleNoiseSize; - float screen_brightness; - float bloom; - float rbgShift; - float frameShadowCoeff; float frameShininess; - vec4 frameColor; float frameSize; - float prevLastUpdate; }; layout(binding = 0) uniform sampler2D noiseSource; diff --git a/app/shaders/terminal_dynamic.vert.qsb b/app/shaders/terminal_dynamic.vert.qsb index 99a6799..8a49f99 100644 Binary files a/app/shaders/terminal_dynamic.vert.qsb and b/app/shaders/terminal_dynamic.vert.qsb differ diff --git a/app/shaders/terminal_dynamic_raster0_burn0_frame0_chroma0.frag.qsb b/app/shaders/terminal_dynamic_raster0_burn0_frame0_chroma0.frag.qsb new file mode 100644 index 0000000..fa0ec2f Binary files /dev/null and b/app/shaders/terminal_dynamic_raster0_burn0_frame0_chroma0.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster0_burn0_frame0_chroma1.frag.qsb b/app/shaders/terminal_dynamic_raster0_burn0_frame0_chroma1.frag.qsb new file mode 100644 index 0000000..fa0ec2f Binary files /dev/null and b/app/shaders/terminal_dynamic_raster0_burn0_frame0_chroma1.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster0_burn0_frame1_chroma0.frag.qsb b/app/shaders/terminal_dynamic_raster0_burn0_frame1_chroma0.frag.qsb new file mode 100644 index 0000000..5de23e6 Binary files /dev/null and b/app/shaders/terminal_dynamic_raster0_burn0_frame1_chroma0.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster0_burn0_frame1_chroma1.frag.qsb b/app/shaders/terminal_dynamic_raster0_burn0_frame1_chroma1.frag.qsb new file mode 100644 index 0000000..5de23e6 Binary files /dev/null and b/app/shaders/terminal_dynamic_raster0_burn0_frame1_chroma1.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster0_burn1_frame0_chroma0.frag.qsb b/app/shaders/terminal_dynamic_raster0_burn1_frame0_chroma0.frag.qsb new file mode 100644 index 0000000..a671060 Binary files /dev/null and b/app/shaders/terminal_dynamic_raster0_burn1_frame0_chroma0.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster0_burn1_frame0_chroma1.frag.qsb b/app/shaders/terminal_dynamic_raster0_burn1_frame0_chroma1.frag.qsb new file mode 100644 index 0000000..1522000 Binary files /dev/null and b/app/shaders/terminal_dynamic_raster0_burn1_frame0_chroma1.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster0_burn1_frame1_chroma0.frag.qsb b/app/shaders/terminal_dynamic_raster0_burn1_frame1_chroma0.frag.qsb new file mode 100644 index 0000000..956a725 Binary files /dev/null and b/app/shaders/terminal_dynamic_raster0_burn1_frame1_chroma0.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster0_burn1_frame1_chroma1.frag.qsb b/app/shaders/terminal_dynamic_raster0_burn1_frame1_chroma1.frag.qsb new file mode 100644 index 0000000..5b17d86 Binary files /dev/null and b/app/shaders/terminal_dynamic_raster0_burn1_frame1_chroma1.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster1_burn0_frame0_chroma0.frag.qsb b/app/shaders/terminal_dynamic_raster1_burn0_frame0_chroma0.frag.qsb new file mode 100644 index 0000000..bae4e7c Binary files /dev/null and b/app/shaders/terminal_dynamic_raster1_burn0_frame0_chroma0.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster1_burn0_frame0_chroma1.frag.qsb b/app/shaders/terminal_dynamic_raster1_burn0_frame0_chroma1.frag.qsb new file mode 100644 index 0000000..bae4e7c Binary files /dev/null and b/app/shaders/terminal_dynamic_raster1_burn0_frame0_chroma1.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster1_burn0_frame1_chroma0.frag.qsb b/app/shaders/terminal_dynamic_raster1_burn0_frame1_chroma0.frag.qsb new file mode 100644 index 0000000..0f2cbca Binary files /dev/null and b/app/shaders/terminal_dynamic_raster1_burn0_frame1_chroma0.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster1_burn0_frame1_chroma1.frag.qsb b/app/shaders/terminal_dynamic_raster1_burn0_frame1_chroma1.frag.qsb new file mode 100644 index 0000000..0f2cbca Binary files /dev/null and b/app/shaders/terminal_dynamic_raster1_burn0_frame1_chroma1.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster1_burn1_frame0_chroma0.frag.qsb b/app/shaders/terminal_dynamic_raster1_burn1_frame0_chroma0.frag.qsb new file mode 100644 index 0000000..f45227b Binary files /dev/null and b/app/shaders/terminal_dynamic_raster1_burn1_frame0_chroma0.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster1_burn1_frame0_chroma1.frag.qsb b/app/shaders/terminal_dynamic_raster1_burn1_frame0_chroma1.frag.qsb new file mode 100644 index 0000000..319973b Binary files /dev/null and b/app/shaders/terminal_dynamic_raster1_burn1_frame0_chroma1.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster1_burn1_frame1_chroma0.frag.qsb b/app/shaders/terminal_dynamic_raster1_burn1_frame1_chroma0.frag.qsb new file mode 100644 index 0000000..43cd0f6 Binary files /dev/null and b/app/shaders/terminal_dynamic_raster1_burn1_frame1_chroma0.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster1_burn1_frame1_chroma1.frag.qsb b/app/shaders/terminal_dynamic_raster1_burn1_frame1_chroma1.frag.qsb new file mode 100644 index 0000000..b49203a Binary files /dev/null and b/app/shaders/terminal_dynamic_raster1_burn1_frame1_chroma1.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster2_burn0_frame0_chroma0.frag.qsb b/app/shaders/terminal_dynamic_raster2_burn0_frame0_chroma0.frag.qsb new file mode 100644 index 0000000..ec814f1 Binary files /dev/null and b/app/shaders/terminal_dynamic_raster2_burn0_frame0_chroma0.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster2_burn0_frame0_chroma1.frag.qsb b/app/shaders/terminal_dynamic_raster2_burn0_frame0_chroma1.frag.qsb new file mode 100644 index 0000000..ec814f1 Binary files /dev/null and b/app/shaders/terminal_dynamic_raster2_burn0_frame0_chroma1.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster2_burn0_frame1_chroma0.frag.qsb b/app/shaders/terminal_dynamic_raster2_burn0_frame1_chroma0.frag.qsb new file mode 100644 index 0000000..b32d821 Binary files /dev/null and b/app/shaders/terminal_dynamic_raster2_burn0_frame1_chroma0.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster2_burn0_frame1_chroma1.frag.qsb b/app/shaders/terminal_dynamic_raster2_burn0_frame1_chroma1.frag.qsb new file mode 100644 index 0000000..b32d821 Binary files /dev/null and b/app/shaders/terminal_dynamic_raster2_burn0_frame1_chroma1.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster2_burn1_frame0_chroma0.frag.qsb b/app/shaders/terminal_dynamic_raster2_burn1_frame0_chroma0.frag.qsb new file mode 100644 index 0000000..7535036 Binary files /dev/null and b/app/shaders/terminal_dynamic_raster2_burn1_frame0_chroma0.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster2_burn1_frame0_chroma1.frag.qsb b/app/shaders/terminal_dynamic_raster2_burn1_frame0_chroma1.frag.qsb new file mode 100644 index 0000000..5e2ecff Binary files /dev/null and b/app/shaders/terminal_dynamic_raster2_burn1_frame0_chroma1.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster2_burn1_frame1_chroma0.frag.qsb b/app/shaders/terminal_dynamic_raster2_burn1_frame1_chroma0.frag.qsb new file mode 100644 index 0000000..3168c94 Binary files /dev/null and b/app/shaders/terminal_dynamic_raster2_burn1_frame1_chroma0.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster2_burn1_frame1_chroma1.frag.qsb b/app/shaders/terminal_dynamic_raster2_burn1_frame1_chroma1.frag.qsb new file mode 100644 index 0000000..e5bc2ae Binary files /dev/null and b/app/shaders/terminal_dynamic_raster2_burn1_frame1_chroma1.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster3_burn0_frame0_chroma0.frag.qsb b/app/shaders/terminal_dynamic_raster3_burn0_frame0_chroma0.frag.qsb new file mode 100644 index 0000000..eb6d8fa Binary files /dev/null and b/app/shaders/terminal_dynamic_raster3_burn0_frame0_chroma0.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster3_burn0_frame0_chroma1.frag.qsb b/app/shaders/terminal_dynamic_raster3_burn0_frame0_chroma1.frag.qsb new file mode 100644 index 0000000..eb6d8fa Binary files /dev/null and b/app/shaders/terminal_dynamic_raster3_burn0_frame0_chroma1.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster3_burn0_frame1_chroma0.frag.qsb b/app/shaders/terminal_dynamic_raster3_burn0_frame1_chroma0.frag.qsb new file mode 100644 index 0000000..1b030dd Binary files /dev/null and b/app/shaders/terminal_dynamic_raster3_burn0_frame1_chroma0.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster3_burn0_frame1_chroma1.frag.qsb b/app/shaders/terminal_dynamic_raster3_burn0_frame1_chroma1.frag.qsb new file mode 100644 index 0000000..1b030dd Binary files /dev/null and b/app/shaders/terminal_dynamic_raster3_burn0_frame1_chroma1.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster3_burn1_frame0_chroma0.frag.qsb b/app/shaders/terminal_dynamic_raster3_burn1_frame0_chroma0.frag.qsb new file mode 100644 index 0000000..4f1aca1 Binary files /dev/null and b/app/shaders/terminal_dynamic_raster3_burn1_frame0_chroma0.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster3_burn1_frame0_chroma1.frag.qsb b/app/shaders/terminal_dynamic_raster3_burn1_frame0_chroma1.frag.qsb new file mode 100644 index 0000000..d4a73ad Binary files /dev/null and b/app/shaders/terminal_dynamic_raster3_burn1_frame0_chroma1.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster3_burn1_frame1_chroma0.frag.qsb b/app/shaders/terminal_dynamic_raster3_burn1_frame1_chroma0.frag.qsb new file mode 100644 index 0000000..c3d03b6 Binary files /dev/null and b/app/shaders/terminal_dynamic_raster3_burn1_frame1_chroma0.frag.qsb differ diff --git a/app/shaders/terminal_dynamic_raster3_burn1_frame1_chroma1.frag.qsb b/app/shaders/terminal_dynamic_raster3_burn1_frame1_chroma1.frag.qsb new file mode 100644 index 0000000..60dafe4 Binary files /dev/null and b/app/shaders/terminal_dynamic_raster3_burn1_frame1_chroma1.frag.qsb differ diff --git a/app/shaders/terminal_frame.frag b/app/shaders/terminal_frame.frag index 46c0b77..3fd31cc 100644 --- a/app/shaders/terminal_frame.frag +++ b/app/shaders/terminal_frame.frag @@ -6,36 +6,9 @@ layout(location = 0) out vec4 fragColor; layout(std140, binding = 0) uniform ubuf { mat4 qt_Matrix; float qt_Opacity; - float time; - vec4 fontColor; - vec4 backgroundColor; - float shadowLength; - vec2 virtualResolution; - float rasterizationIntensity; - int rasterizationMode; - float burnInLastUpdate; - float burnInTime; - float burnIn; - float staticNoise; float screenCurvature; - float glowingLine; - float chromaColor; - vec2 jitterDisplacement; - float ambientLight; - float jitter; - float horizontalSync; - float horizontalSyncStrength; - float flickering; - float displayTerminalFrame; - vec2 scaleNoiseSize; - float screen_brightness; - float bloom; - float rbgShift; - float frameShadowCoeff; - float frameShininess; vec4 frameColor; float frameSize; - float prevLastUpdate; }; float min2(vec2 v) { return min(v.x, v.y); } diff --git a/app/shaders/terminal_frame.frag.qsb b/app/shaders/terminal_frame.frag.qsb index 56a7760..efb12dd 100644 Binary files a/app/shaders/terminal_frame.frag.qsb and b/app/shaders/terminal_frame.frag.qsb differ diff --git a/app/shaders/terminal_frame.vert b/app/shaders/terminal_frame.vert new file mode 100644 index 0000000..dddd9f7 --- /dev/null +++ b/app/shaders/terminal_frame.vert @@ -0,0 +1,19 @@ +#version 440 + +layout(location = 0) in vec4 qt_Vertex; +layout(location = 1) in vec2 qt_MultiTexCoord0; + +layout(std140, binding = 0) uniform ubuf { + mat4 qt_Matrix; + float qt_Opacity; + float screenCurvature; + vec4 frameColor; + float frameSize; +}; + +layout(location = 0) out vec2 qt_TexCoord0; + +void main() { + qt_TexCoord0 = qt_MultiTexCoord0; + gl_Position = qt_Matrix * qt_Vertex; +} diff --git a/app/shaders/terminal_frame.vert.qsb b/app/shaders/terminal_frame.vert.qsb new file mode 100644 index 0000000..8c9f54c Binary files /dev/null and b/app/shaders/terminal_frame.vert.qsb differ diff --git a/app/shaders/terminal_static.frag b/app/shaders/terminal_static.frag index a2f3d73..718a36a 100644 --- a/app/shaders/terminal_static.frag +++ b/app/shaders/terminal_static.frag @@ -1,41 +1,33 @@ #version 440 +#ifndef CRT_RGB_SHIFT +#define CRT_RGB_SHIFT 1 +#endif +#ifndef CRT_CHROMA +#define CRT_CHROMA 1 +#endif +#ifndef CRT_BLOOM +#define CRT_BLOOM 1 +#endif +#ifndef CRT_CURVATURE +#define CRT_CURVATURE 1 +#endif + layout(location = 0) in vec2 qt_TexCoord0; layout(location = 0) out vec4 fragColor; layout(std140, binding = 0) uniform ubuf { mat4 qt_Matrix; float qt_Opacity; - float time; vec4 fontColor; vec4 backgroundColor; - float shadowLength; - vec2 virtualResolution; - float rasterizationIntensity; - int rasterizationMode; - float burnInLastUpdate; - float burnInTime; - float burnIn; - float staticNoise; float screenCurvature; - float glowingLine; float chromaColor; - vec2 jitterDisplacement; - float ambientLight; - float jitter; - float horizontalSync; - float horizontalSyncStrength; - float flickering; - float displayTerminalFrame; - vec2 scaleNoiseSize; float screen_brightness; float bloom; float rbgShift; - float frameShadowCoeff; float frameShininess; - vec4 frameColor; float frameSize; - float prevLastUpdate; }; layout(binding = 1) uniform sampler2D source; @@ -53,11 +45,13 @@ vec2 distortCoordinates(vec2 coords){ } vec3 convertWithChroma(vec3 inColor) { +#if CRT_CHROMA == 1 vec3 outColor = fontColor.rgb * rgb2grey(inColor); - if (chromaColor != 0.0) { - outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor); - } + outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor); return outColor; +#else + return fontColor.rgb * rgb2grey(inColor); +#endif } void main() { @@ -68,44 +62,49 @@ void main() { float isScreen = 1.0; vec2 txt_coords = qt_TexCoord0; - if (screenCurvature > 0.0 || frameSize > 0.0) { - vec2 curvatureCoords = distortCoordinates(qt_TexCoord0); - shownDraw = max2(step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords)); - isScreen = min2(step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords)); - isReflection = shownDraw - isScreen; - txt_coords = -2.0 * curvatureCoords + 3.0 * step(vec2(0.0), curvatureCoords) * curvatureCoords - 3.0 * step(vec2(1.0), curvatureCoords) * curvatureCoords; - } +#if CRT_CURVATURE == 1 + vec2 curvatureCoords = distortCoordinates(qt_TexCoord0); + shownDraw = max2(step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords)); + isScreen = min2(step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords)); + isReflection = shownDraw - isScreen; + txt_coords = -2.0 * curvatureCoords + 3.0 * step(vec2(0.0), curvatureCoords) * curvatureCoords - 3.0 * step(vec2(1.0), curvatureCoords) * curvatureCoords; +#endif vec3 txt_color = texture(source, txt_coords).rgb; - if (rbgShift > 0.0) { - vec2 displacement = vec2(12.0, 0.0) * rbgShift; - vec3 rightColor = texture(source, txt_coords + displacement).rgb; - vec3 leftColor = texture(source, txt_coords - displacement).rgb; - txt_color.r = leftColor.r * 0.10 + rightColor.r * 0.30 + txt_color.r * 0.60; - txt_color.g = leftColor.g * 0.20 + rightColor.g * 0.20 + txt_color.g * 0.60; - txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60; - } +#if CRT_RGB_SHIFT == 1 + vec2 displacement = vec2(12.0, 0.0) * rbgShift; + vec3 rightColor = texture(source, txt_coords + displacement).rgb; + vec3 leftColor = texture(source, txt_coords - displacement).rgb; + txt_color.r = leftColor.r * 0.10 + rightColor.r * 0.30 + txt_color.r * 0.60; + txt_color.g = leftColor.g * 0.20 + rightColor.g * 0.20 + txt_color.g * 0.60; + txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60; +#endif txt_color += vec3(0.0001); float greyscale_color = rgb2grey(txt_color); vec3 finalColor; - if (chromaColor > 0.0) { - vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor); - finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color * shownDraw); - } else { - finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color * shownDraw); - } +#if CRT_CHROMA == 1 + vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor); + finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color * shownDraw); +#else + finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color * shownDraw); +#endif + vec3 bloomColor; + float bloomAlpha; +#if CRT_BLOOM == 1 vec4 bloomFullColor = texture(bloomSource, txt_coords); - vec3 bloomColor = convertWithChroma(bloomFullColor.rgb); - float bloomAlpha = bloomFullColor.a; + bloomColor = convertWithChroma(bloomFullColor.rgb); + bloomAlpha = bloomFullColor.a; - if (bloom > 0.0) { - vec3 bloomOnScreen = bloomColor * isScreen; - finalColor += clamp(bloomOnScreen * bloom * bloomAlpha, 0.0, 0.5); - } + vec3 bloomOnScreen = bloomColor * isScreen; + finalColor += clamp(bloomOnScreen * bloom * bloomAlpha, 0.0, 0.5); +#else + bloomColor = finalColor; + bloomAlpha = 0.0; +#endif if (frameShininess > 0.0) { float shine = clamp(frameShininess, 0.0, 1.0); diff --git a/app/shaders/terminal_static.frag.qsb b/app/shaders/terminal_static.frag.qsb deleted file mode 100644 index 2cf21ec..0000000 Binary files a/app/shaders/terminal_static.frag.qsb and /dev/null differ diff --git a/app/shaders/terminal_static.vert b/app/shaders/terminal_static.vert new file mode 100644 index 0000000..bb27da1 --- /dev/null +++ b/app/shaders/terminal_static.vert @@ -0,0 +1,25 @@ +#version 440 + +layout(location = 0) in vec4 qt_Vertex; +layout(location = 1) in vec2 qt_MultiTexCoord0; + +layout(std140, binding = 0) uniform ubuf { + mat4 qt_Matrix; + float qt_Opacity; + vec4 fontColor; + vec4 backgroundColor; + float screenCurvature; + float chromaColor; + float rbgShift; + float frameShininess; + float frameSize; + float screen_brightness; + float bloom; +}; + +layout(location = 0) out vec2 qt_TexCoord0; + +void main() { + qt_TexCoord0 = qt_MultiTexCoord0; + gl_Position = qt_Matrix * qt_Vertex; +} diff --git a/app/shaders/terminal_static.vert.qsb b/app/shaders/terminal_static.vert.qsb new file mode 100644 index 0000000..5d59fa8 Binary files /dev/null and b/app/shaders/terminal_static.vert.qsb differ diff --git a/app/shaders/terminal_static_rgb0_chroma0_bloom0_curve0.frag.qsb b/app/shaders/terminal_static_rgb0_chroma0_bloom0_curve0.frag.qsb new file mode 100644 index 0000000..f0db04a Binary files /dev/null and b/app/shaders/terminal_static_rgb0_chroma0_bloom0_curve0.frag.qsb differ diff --git a/app/shaders/terminal_static_rgb0_chroma0_bloom0_curve1.frag.qsb b/app/shaders/terminal_static_rgb0_chroma0_bloom0_curve1.frag.qsb new file mode 100644 index 0000000..fb8768e Binary files /dev/null and b/app/shaders/terminal_static_rgb0_chroma0_bloom0_curve1.frag.qsb differ diff --git a/app/shaders/terminal_static_rgb0_chroma0_bloom1_curve0.frag.qsb b/app/shaders/terminal_static_rgb0_chroma0_bloom1_curve0.frag.qsb new file mode 100644 index 0000000..d56ac16 Binary files /dev/null and b/app/shaders/terminal_static_rgb0_chroma0_bloom1_curve0.frag.qsb differ diff --git a/app/shaders/terminal_static_rgb0_chroma0_bloom1_curve1.frag.qsb b/app/shaders/terminal_static_rgb0_chroma0_bloom1_curve1.frag.qsb new file mode 100644 index 0000000..57d47ab Binary files /dev/null and b/app/shaders/terminal_static_rgb0_chroma0_bloom1_curve1.frag.qsb differ diff --git a/app/shaders/terminal_static_rgb0_chroma1_bloom0_curve0.frag.qsb b/app/shaders/terminal_static_rgb0_chroma1_bloom0_curve0.frag.qsb new file mode 100644 index 0000000..31d6739 Binary files /dev/null and b/app/shaders/terminal_static_rgb0_chroma1_bloom0_curve0.frag.qsb differ diff --git a/app/shaders/terminal_static_rgb0_chroma1_bloom0_curve1.frag.qsb b/app/shaders/terminal_static_rgb0_chroma1_bloom0_curve1.frag.qsb new file mode 100644 index 0000000..db07e17 Binary files /dev/null and b/app/shaders/terminal_static_rgb0_chroma1_bloom0_curve1.frag.qsb differ diff --git a/app/shaders/terminal_static_rgb0_chroma1_bloom1_curve0.frag.qsb b/app/shaders/terminal_static_rgb0_chroma1_bloom1_curve0.frag.qsb new file mode 100644 index 0000000..39d0093 Binary files /dev/null and b/app/shaders/terminal_static_rgb0_chroma1_bloom1_curve0.frag.qsb differ diff --git a/app/shaders/terminal_static_rgb0_chroma1_bloom1_curve1.frag.qsb b/app/shaders/terminal_static_rgb0_chroma1_bloom1_curve1.frag.qsb new file mode 100644 index 0000000..ed2e6e5 Binary files /dev/null and b/app/shaders/terminal_static_rgb0_chroma1_bloom1_curve1.frag.qsb differ diff --git a/app/shaders/terminal_static_rgb1_chroma0_bloom0_curve0.frag.qsb b/app/shaders/terminal_static_rgb1_chroma0_bloom0_curve0.frag.qsb new file mode 100644 index 0000000..49bde30 Binary files /dev/null and b/app/shaders/terminal_static_rgb1_chroma0_bloom0_curve0.frag.qsb differ diff --git a/app/shaders/terminal_static_rgb1_chroma0_bloom0_curve1.frag.qsb b/app/shaders/terminal_static_rgb1_chroma0_bloom0_curve1.frag.qsb new file mode 100644 index 0000000..e173195 Binary files /dev/null and b/app/shaders/terminal_static_rgb1_chroma0_bloom0_curve1.frag.qsb differ diff --git a/app/shaders/terminal_static_rgb1_chroma0_bloom1_curve0.frag.qsb b/app/shaders/terminal_static_rgb1_chroma0_bloom1_curve0.frag.qsb new file mode 100644 index 0000000..4a84d79 Binary files /dev/null and b/app/shaders/terminal_static_rgb1_chroma0_bloom1_curve0.frag.qsb differ diff --git a/app/shaders/terminal_static_rgb1_chroma0_bloom1_curve1.frag.qsb b/app/shaders/terminal_static_rgb1_chroma0_bloom1_curve1.frag.qsb new file mode 100644 index 0000000..771767c Binary files /dev/null and b/app/shaders/terminal_static_rgb1_chroma0_bloom1_curve1.frag.qsb differ diff --git a/app/shaders/terminal_static_rgb1_chroma1_bloom0_curve0.frag.qsb b/app/shaders/terminal_static_rgb1_chroma1_bloom0_curve0.frag.qsb new file mode 100644 index 0000000..d430d08 Binary files /dev/null and b/app/shaders/terminal_static_rgb1_chroma1_bloom0_curve0.frag.qsb differ diff --git a/app/shaders/terminal_static_rgb1_chroma1_bloom0_curve1.frag.qsb b/app/shaders/terminal_static_rgb1_chroma1_bloom0_curve1.frag.qsb new file mode 100644 index 0000000..dbc795e Binary files /dev/null and b/app/shaders/terminal_static_rgb1_chroma1_bloom0_curve1.frag.qsb differ diff --git a/app/shaders/terminal_static_rgb1_chroma1_bloom1_curve0.frag.qsb b/app/shaders/terminal_static_rgb1_chroma1_bloom1_curve0.frag.qsb new file mode 100644 index 0000000..d23106a Binary files /dev/null and b/app/shaders/terminal_static_rgb1_chroma1_bloom1_curve0.frag.qsb differ diff --git a/app/shaders/terminal_static_rgb1_chroma1_bloom1_curve1.frag.qsb b/app/shaders/terminal_static_rgb1_chroma1_bloom1_curve1.frag.qsb new file mode 100644 index 0000000..3f1043c Binary files /dev/null and b/app/shaders/terminal_static_rgb1_chroma1_bloom1_curve1.frag.qsb differ