1
0
mirror of https://github.com/Swordfish90/cool-retro-term.git synced 2026-02-08 00:32:27 +00:00

Create multiple shader variants for the various configurations.

This commit is contained in:
Filippo Scognamiglio
2025-12-23 21:37:31 +01:00
parent 7038c02173
commit f851dd0a72
69 changed files with 304 additions and 267 deletions

View File

@@ -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
#########################################

View File

@@ -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
}

View File

@@ -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)
}

View File

@@ -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

View File

@@ -45,9 +45,57 @@
<file>ShaderLibrary.qml</file>
<file>menus/OSXMenu.qml</file>
<file>../shaders/terminal_dynamic.vert.qsb</file>
<file>../shaders/terminal_dynamic.frag.qsb</file>
<file>../shaders/passthrough.vert.qsb</file>
<file>../shaders/terminal_static.frag.qsb</file>
<file>../shaders/terminal_static.vert.qsb</file>
<file>../shaders/terminal_frame.vert.qsb</file>
<file>../shaders/burn_in.vert.qsb</file>
<file>../shaders/terminal_dynamic_raster0_burn0_frame0_chroma0.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster0_burn0_frame0_chroma1.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster0_burn0_frame1_chroma0.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster0_burn0_frame1_chroma1.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster0_burn1_frame0_chroma0.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster0_burn1_frame0_chroma1.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster0_burn1_frame1_chroma0.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster0_burn1_frame1_chroma1.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster1_burn0_frame0_chroma0.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster1_burn0_frame0_chroma1.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster1_burn0_frame1_chroma0.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster1_burn0_frame1_chroma1.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster1_burn1_frame0_chroma0.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster1_burn1_frame0_chroma1.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster1_burn1_frame1_chroma0.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster1_burn1_frame1_chroma1.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster2_burn0_frame0_chroma0.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster2_burn0_frame0_chroma1.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster2_burn0_frame1_chroma0.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster2_burn0_frame1_chroma1.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster2_burn1_frame0_chroma0.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster2_burn1_frame0_chroma1.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster2_burn1_frame1_chroma0.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster2_burn1_frame1_chroma1.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster3_burn0_frame0_chroma0.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster3_burn0_frame0_chroma1.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster3_burn0_frame1_chroma0.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster3_burn0_frame1_chroma1.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster3_burn1_frame0_chroma0.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster3_burn1_frame0_chroma1.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster3_burn1_frame1_chroma0.frag.qsb</file>
<file>../shaders/terminal_dynamic_raster3_burn1_frame1_chroma1.frag.qsb</file>
<file>../shaders/terminal_static_rgb0_chroma0_bloom0_curve0.frag.qsb</file>
<file>../shaders/terminal_static_rgb0_chroma0_bloom0_curve1.frag.qsb</file>
<file>../shaders/terminal_static_rgb0_chroma0_bloom1_curve0.frag.qsb</file>
<file>../shaders/terminal_static_rgb0_chroma0_bloom1_curve1.frag.qsb</file>
<file>../shaders/terminal_static_rgb0_chroma1_bloom0_curve0.frag.qsb</file>
<file>../shaders/terminal_static_rgb0_chroma1_bloom0_curve1.frag.qsb</file>
<file>../shaders/terminal_static_rgb0_chroma1_bloom1_curve0.frag.qsb</file>
<file>../shaders/terminal_static_rgb0_chroma1_bloom1_curve1.frag.qsb</file>
<file>../shaders/terminal_static_rgb1_chroma0_bloom0_curve0.frag.qsb</file>
<file>../shaders/terminal_static_rgb1_chroma0_bloom0_curve1.frag.qsb</file>
<file>../shaders/terminal_static_rgb1_chroma0_bloom1_curve0.frag.qsb</file>
<file>../shaders/terminal_static_rgb1_chroma0_bloom1_curve1.frag.qsb</file>
<file>../shaders/terminal_static_rgb1_chroma1_bloom0_curve0.frag.qsb</file>
<file>../shaders/terminal_static_rgb1_chroma1_bloom0_curve1.frag.qsb</file>
<file>../shaders/terminal_static_rgb1_chroma1_bloom1_curve0.frag.qsb</file>
<file>../shaders/terminal_static_rgb1_chroma1_bloom1_curve1.frag.qsb</file>
<file>../shaders/terminal_frame.frag.qsb</file>
<file>../shaders/burn_in.frag.qsb</file>
<file>fonts/unscii/unscii-8-thin.ttf</file>

View File

@@ -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;
};

Binary file not shown.

19
app/shaders/burn_in.vert Normal file
View File

@@ -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;
}

Binary file not shown.

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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); }

Binary file not shown.

View File

@@ -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;
}

Binary file not shown.

View File

@@ -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);

Binary file not shown.

View File

@@ -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;
}

Binary file not shown.