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