From e9ddd7d3b82bb06d1625d9683c4595e8c9541a31 Mon Sep 17 00:00:00 2001
From: Filippo Scognamiglio <flscogna@gmail.com>
Date: Mon, 3 Dec 2018 13:32:08 +0100
Subject: [PATCH] Split effects into static (cached) and dynamic computed at
 every frame.

---
 app/qml/ShaderTerminal.qml    | 586 +++++++++++++++++-----------------
 app/qml/TerminalContainer.qml |   2 -
 2 files changed, 292 insertions(+), 296 deletions(-)

diff --git a/app/qml/ShaderTerminal.qml b/app/qml/ShaderTerminal.qml
index 5ae04b3..ada73ef 100644
--- a/app/qml/ShaderTerminal.qml
+++ b/app/qml/ShaderTerminal.qml
@@ -23,320 +23,310 @@ import QtGraphicalEffects 1.0
 
 import "utils.js" as Utils
 
-ShaderEffect {
+Item {
     property ShaderEffectSource source
     property BurnInEffect burnInEffect
     property ShaderEffectSource bloomSource
 
-    property ShaderEffectSource screenBuffer: frameBuffer
-
     property color fontColor: appSettings.fontColor
     property color backgroundColor: appSettings.backgroundColor
-    property real bloom: appSettings.bloom * 2.5
-
-    property ShaderEffectSource burnInSource: burnInEffect.source
-    property real burnIn: appSettings.burnIn
-    property real burnInLastUpdate: burnInEffect.lastUpdate
-    property real burnInTime: burnInEffect.burnInFadeTime
-
-    property real jitter: appSettings.jitter
-    property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter)
-
-    property real staticNoise: appSettings.staticNoise
-    property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
-                                          (height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
 
     property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
-    property real glowingLine: appSettings.glowingLine * 0.2
 
-    property real chromaColor: appSettings.chromaColor;
-
-    property real rbgShift: (appSettings.rbgShift / width) * appSettings.totalFontScaling
-
-    property real flickering: appSettings.flickering
-    property real horizontalSync: appSettings.horizontalSync * 0.5
-
-    property int rasterization: appSettings.rasterization
-
-    property real screen_brightness: Utils.lint(0.5, 1.5, appSettings.brightness)
+    property real chromaColor: appSettings.chromaColor
 
     property real ambientLight: appSettings.ambientLight * 0.2
 
-    property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight)
-
     property size virtual_resolution
 
-    property real time: timeManager.time
-    property ShaderEffectSource noiseSource: noiseShaderSource
+     ShaderEffect {
+         id: dynamicShader
 
-    // If something goes wrong activate the fallback version of the shader.
-    property bool fallBack: false
+         property ShaderEffectSource screenBuffer: frameBuffer
+         property ShaderEffectSource burnInSource: burnInEffect.source
 
-    blending: false
+         property color fontColor: parent.fontColor
+         property color backgroundColor: parent.backgroundColor
+         property real screenCurvature: parent.screenCurvature
+         property real chromaColor: parent.chromaColor
+         property real ambientLight: parent.ambientLight
 
-    //Smooth random texture used for flickering effect.
-    Image{
-        id: noiseTexture
-        source: "images/allNoise512.png"
-        width: 512
-        height: 512
-        fillMode: Image.Tile
-        visible: false
-    }
-    ShaderEffectSource{
-        id: noiseShaderSource
-        sourceItem: noiseTexture
-        wrapMode: ShaderEffectSource.Repeat
-        visible: false
-        smooth: true
-    }
+         property real flickering: appSettings.flickering
+         property real horizontalSync: appSettings.horizontalSync * 0.5
+         property real glowingLine: appSettings.glowingLine * 0.2
+         property real burnIn: appSettings.burnIn
+         property real burnInLastUpdate: burnInEffect.lastUpdate
+         property real burnInTime: burnInEffect.burnInFadeTime
+         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) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
+                                               (height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
 
-    //Print the number with a reasonable precision for the shader.
-    function str(num){
-        return num.toFixed(8);
-    }
+         property size virtual_resolution: parent.virtual_resolution
 
-    vertexShader: "
-        uniform highp mat4 qt_Matrix;
-        uniform highp float time;
+         property real time: timeManager.time
+         property ShaderEffectSource noiseSource: noiseShaderSource
 
-        attribute highp vec4 qt_Vertex;
-        attribute highp vec2 qt_MultiTexCoord0;
+         // If something goes wrong activate the fallback version of the shader.
+         property bool fallBack: false
 
-        varying highp vec2 qt_TexCoord0;" +
+         anchors.fill: parent
+         blending: false
 
-        (!fallBack ? "
-            uniform sampler2D noiseSource;" : "") +
-
-        (!fallBack && rbgShift !== 0.0 ?"
-            varying lowp vec4 constantNoise;" : "") +
-
-        (!fallBack && flickering !== 0.0 ?"
-            varying lowp float brightness;
-            uniform lowp float flickering;" : "") +
-
-        (!fallBack && horizontalSync !== 0.0 ?"
-            uniform lowp float horizontalSync;
-            varying lowp float distortionScale;
-            varying lowp float distortionFreq;" : "") +
-
-        "
-        void main() {
-            qt_TexCoord0 = qt_MultiTexCoord0;
-            vec2 coords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));" +
-
-            (!fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0) ?
-                "vec4 initialNoiseTexel = texture2D(noiseSource, coords);"
-            : "") +
-
-            (!fallBack && rbgShift !== 0.0 ?"
-                constantNoise = initialNoiseTexel;" : "") +
-
-            (!fallBack && flickering !== 0.0 ? "
-                brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
-            : "") +
-
-            (!fallBack && horizontalSync !== 0.0 ? "
-                float randval = horizontalSync - initialNoiseTexel.r;
-                distortionScale = step(0.0, randval) * randval * horizontalSync;
-                distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
-            : "") +
-
-            "gl_Position = qt_Matrix * qt_Vertex;
-        }"
-
-    fragmentShader: "
-        #ifdef GL_ES
-            precision mediump float;
-        #endif
-
-        uniform sampler2D screenBuffer;
-        uniform highp float qt_Opacity;
-        uniform highp float time;
-        varying highp vec2 qt_TexCoord0;
-
-        uniform highp vec4 fontColor;
-        uniform highp vec4 backgroundColor;
-        uniform lowp float screen_brightness;
-        uniform lowp float shadowLength;
-
-        uniform highp vec2 virtual_resolution;" +
-
-        (burnIn !== 0 ? "
-            uniform sampler2D burnInSource;
-            uniform highp float burnInLastUpdate;
-            uniform highp float burnInTime;" : "") +
-        (staticNoise !== 0 ? "
-            uniform highp float staticNoise;" : "") +
-        (((staticNoise !== 0 || jitter !== 0 || rbgShift)
-          ||(fallBack && (flickering || horizontalSync))) ? "
-            uniform lowp sampler2D noiseSource;
-            uniform highp vec2 scaleNoiseSize;" : "") +
-        (screenCurvature !== 0 ? "
-            uniform highp float screenCurvature;" : "") +
-        (glowingLine !== 0 ? "
-            uniform highp float glowingLine;" : "") +
-        (chromaColor !== 0 ? "
-            uniform lowp float chromaColor;" : "") +
-        (jitter !== 0 ? "
-            uniform lowp vec2 jitterDisplacement;" : "") +
-        (ambientLight !== 0 ? "
-            uniform lowp float ambientLight;" : "") +
-
-        (fallBack && horizontalSync !== 0 ? "
-            uniform lowp float horizontalSync;" : "") +
-        (fallBack && flickering !== 0.0 ?"
-            uniform lowp float flickering;" : "") +
-        (!fallBack && flickering !== 0 ? "
-            varying lowp float brightness;"
-        : "") +
-        (!fallBack && horizontalSync !== 0 ? "
-            varying lowp float distortionScale;
-            varying lowp float distortionFreq;" : "") +
-
-        (!fallBack && rbgShift !== 0.0 ?"
-            varying lowp vec4 constantNoise;" : "") +
-
-        (glowingLine !== 0 ? "
-            float randomPass(vec2 coords){
-                return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015)));
-            }" : "") +
-
-        "float min2(vec2 v) {
-            return min(v.x, v.y);
-        }
-
-        float rgb2grey(vec3 v){
-            return dot(v, vec3(0.21, 0.72, 0.04));
-        }
-
-        float isInScreen(vec2 v) {
-            return min2(step(0.0, v) - step(1.0, v));
-        }
-
-        vec2 barrel(vec2 v, vec2 cc) {" +
-
-            (screenCurvature !== 0 ? "
-                float distortion = dot(cc, cc) * screenCurvature;
-                return (v - cc * (1.0 + distortion) * distortion);"
-            :
-                "return v;") +
-        "}" +
-
-        "vec3 convertWithChroma(vec3 inColor) {
-           vec3 outColor = inColor;" +
-
-            (chromaColor !== 0 ?
-                "outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor);"
-            :
-                "outColor = fontColor.rgb * rgb2grey(inColor);") +
-
-        "  return outColor;
-        }" +
-
-        "void main() {" +
-            "vec2 cc = vec2(0.5) - qt_TexCoord0;" +
-            "float distance = length(cc);" +
-
-            //FallBack if there are problems
-            (fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0.0) ?
-                "vec2 initialCoords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));
-                 vec4 initialNoiseTexel = texture2D(noiseSource, initialCoords);"
-            : "") +
-            (fallBack && flickering !== 0.0 ? "
-                float brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
-            : "") +
-            (fallBack && horizontalSync !== 0.0 ? "
-                float randval = horizontalSync - initialNoiseTexel.r;
-                float distortionScale = step(0.0, randval) * randval * horizontalSync;
-                float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
-            : "") +
-            (fallBack && rbgShift !== 0.0 ?"
-                lowp vec4 constantNoise = initialNoiseTexel;" : "") +
-
-            (staticNoise ? "
-                float noise = staticNoise;" : "") +
-
-            (screenCurvature !== 0 ? "
-                vec2 curvatureCoords = barrel(qt_TexCoord0, cc);
-                float staticInScreen = min2(step(0.0, curvatureCoords) - step(1.0, curvatureCoords));
-                vec2 staticCoords = curvatureCoords;"
-            :"
-                vec2 staticCoords = qt_TexCoord0;
-                float staticInScreen = 1.0;") +
-
-            "vec2 coords = qt_TexCoord0;" +
-
-            (horizontalSync !== 0 ? "
-                float dst = sin((coords.y + time * 0.001) * distortionFreq);
-                coords.x += dst * distortionScale;" +
-
-                (staticNoise ? "
-                    noise += distortionScale * 7.0;" : "")
-
-            : "") +
-
-            (jitter !== 0 || staticNoise !== 0 || rbgShift !== 0 ?
-                "vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));"
-            : "") +
-
-            (jitter !== 0 ? "
-                vec2 offset = vec2(noiseTexel.b, noiseTexel.a) - vec2(0.5);
-                vec2 txt_coords = coords + offset * jitterDisplacement;"
-            :  "vec2 txt_coords = coords;") +
-
-            "float color = 0.0001;" +
-
-            (staticNoise !== 0 ? "
-                float noiseVal = noiseTexel.a;
-                color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
-
-            (glowingLine !== 0 ? "
-                color += randomPass(coords * virtual_resolution) * glowingLine;" : "") +
-
-            "txt_coords = mix(qt_TexCoord0, txt_coords, staticInScreen);
-             float inScreen2 = isInScreen(barrel(txt_coords, cc));
-             vec3 origTxtColor = texture2D(screenBuffer, txt_coords).rgb;
-             vec3 txt_color = origTxtColor * inScreen2 + backgroundColor.rgb * (1.0 - inScreen2);" +
-
-            (burnIn !== 0 ? "
-                vec4 txt_blur = texture2D(burnInSource, staticCoords);
-                float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0);
-                vec3 burnInColor = 0.5 * (txt_blur.rgb - vec3(blurDecay));
-                txt_color = max(txt_color, convertWithChroma(burnInColor));"
-            : "") +
-
-             "txt_color += fontColor.rgb * vec3(color);" +
-
-            "vec3 finalColor = txt_color;" +
-
-            (flickering !== 0 ? "
-                finalColor *= brightness;" : "") +
-
-            (ambientLight !== 0 ? "
-                finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
-
-
-            "float inShadow = 1.0 - min2(smoothstep(0.0, shadowLength, staticCoords) - smoothstep(1.0 - shadowLength, 1.0, staticCoords));
-             finalColor = mix(finalColor, vec3(0.0), 0.35 * inShadow);
-
-             finalColor = mix(origTxtColor, finalColor, staticInScreen);
-             gl_FragColor = vec4(finalColor * screen_brightness, qt_Opacity);" +
-        "}"
-
-     onStatusChanged: {
-         // Print warning messages
-         if (log)
-             console.log(log);
-
-         // Activate fallback mode
-         if (status == ShaderEffect.Error) {
-            fallBack = true;
+         //Smooth random texture used for flickering effect.
+         Image{
+             id: noiseTexture
+             source: "images/allNoise512.png"
+             width: 512
+             height: 512
+             fillMode: Image.Tile
+             visible: false
          }
+         ShaderEffectSource{
+             id: noiseShaderSource
+             sourceItem: noiseTexture
+             wrapMode: ShaderEffectSource.Repeat
+             visible: false
+             smooth: true
+         }
+
+         //Print the number with a reasonable precision for the shader.
+         function str(num){
+             return num.toFixed(8);
+         }
+
+         vertexShader: "
+             uniform highp mat4 qt_Matrix;
+             uniform highp float time;
+
+             attribute highp vec4 qt_Vertex;
+             attribute highp vec2 qt_MultiTexCoord0;
+
+             varying highp vec2 qt_TexCoord0;" +
+
+             (!fallBack ? "
+                 uniform sampler2D noiseSource;" : "") +
+
+             (!fallBack && flickering !== 0.0 ?"
+                 varying lowp float brightness;
+                 uniform lowp float flickering;" : "") +
+
+             (!fallBack && horizontalSync !== 0.0 ?"
+                 uniform lowp float horizontalSync;
+                 varying lowp float distortionScale;
+                 varying lowp float distortionFreq;" : "") +
+
+             "
+             void main() {
+                 qt_TexCoord0 = qt_MultiTexCoord0;
+                 vec2 coords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));" +
+
+                 (!fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0) ?
+                     "vec4 initialNoiseTexel = texture2D(noiseSource, coords);"
+                 : "") +
+
+                 (!fallBack && flickering !== 0.0 ? "
+                     brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
+                 : "") +
+
+                 (!fallBack && horizontalSync !== 0.0 ? "
+                     float randval = horizontalSync - initialNoiseTexel.r;
+                     distortionScale = step(0.0, randval) * randval * horizontalSync;
+                     distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
+                 : "") +
+
+                 "gl_Position = qt_Matrix * qt_Vertex;
+             }"
+
+         fragmentShader: "
+             #ifdef GL_ES
+                 precision mediump float;
+             #endif
+
+             uniform sampler2D screenBuffer;
+             uniform highp float qt_Opacity;
+             uniform highp float time;
+             varying highp vec2 qt_TexCoord0;
+
+             uniform highp vec4 fontColor;
+             uniform highp vec4 backgroundColor;
+             uniform lowp float shadowLength;
+
+             uniform highp vec2 virtual_resolution;" +
+
+             (burnIn !== 0 ? "
+                 uniform sampler2D burnInSource;
+                 uniform highp float burnInLastUpdate;
+                 uniform highp float burnInTime;" : "") +
+             (staticNoise !== 0 ? "
+                 uniform highp float staticNoise;" : "") +
+             (((staticNoise !== 0 || jitter !== 0 || rbgShift)
+               ||(fallBack && (flickering || horizontalSync))) ? "
+                 uniform lowp sampler2D noiseSource;
+                 uniform highp vec2 scaleNoiseSize;" : "") +
+             (screenCurvature !== 0 ? "
+                 uniform highp float screenCurvature;" : "") +
+             (glowingLine !== 0 ? "
+                 uniform highp float glowingLine;" : "") +
+             (chromaColor !== 0 ? "
+                 uniform lowp float chromaColor;" : "") +
+             (jitter !== 0 ? "
+                 uniform lowp vec2 jitterDisplacement;" : "") +
+             (ambientLight !== 0 ? "
+                 uniform lowp float ambientLight;" : "") +
+
+             (fallBack && horizontalSync !== 0 ? "
+                 uniform lowp float horizontalSync;" : "") +
+             (fallBack && flickering !== 0.0 ?"
+                 uniform lowp float flickering;" : "") +
+             (!fallBack && flickering !== 0 ? "
+                 varying lowp float brightness;"
+             : "") +
+             (!fallBack && horizontalSync !== 0 ? "
+                 varying lowp float distortionScale;
+                 varying lowp float distortionFreq;" : "") +
+
+             (glowingLine !== 0 ? "
+                 float randomPass(vec2 coords){
+                     return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015)));
+                 }" : "") +
+
+             "float min2(vec2 v) {
+                 return min(v.x, v.y);
+             }
+
+             float rgb2grey(vec3 v){
+                 return dot(v, vec3(0.21, 0.72, 0.04));
+             }
+
+             float isInScreen(vec2 v) {
+                 return min2(step(0.0, v) - step(1.0, v));
+             }
+
+             vec2 barrel(vec2 v, vec2 cc) {" +
+
+                 (screenCurvature !== 0 ? "
+                     float distortion = dot(cc, cc) * screenCurvature;
+                     return (v - cc * (1.0 + distortion) * distortion);"
+                 :
+                     "return v;") +
+             "}" +
+
+             "vec3 convertWithChroma(vec3 inColor) {
+                vec3 outColor = inColor;" +
+
+                 (chromaColor !== 0 ?
+                     "outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor);"
+                 :
+                     "outColor = fontColor.rgb * rgb2grey(inColor);") +
+
+             "  return outColor;
+             }" +
+
+             "void main() {" +
+                 "vec2 cc = vec2(0.5) - qt_TexCoord0;" +
+                 "float distance = length(cc);" +
+
+                 //FallBack if there are problems
+                 (fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0.0) ?
+                     "vec2 initialCoords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));
+                      vec4 initialNoiseTexel = texture2D(noiseSource, initialCoords);"
+                 : "") +
+                 (fallBack && flickering !== 0.0 ? "
+                     float brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
+                 : "") +
+                 (fallBack && horizontalSync !== 0.0 ? "
+                     float randval = horizontalSync - initialNoiseTexel.r;
+                     float distortionScale = step(0.0, randval) * randval * horizontalSync;
+                     float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
+                 : "") +
+
+                 (staticNoise ? "
+                     float noise = staticNoise;" : "") +
+
+                 (screenCurvature !== 0 ? "
+                     vec2 curvatureCoords = barrel(qt_TexCoord0, cc);
+                     float staticInScreen = min2(step(0.0, curvatureCoords) - step(1.0, curvatureCoords));
+                     vec2 staticCoords = curvatureCoords;"
+                 :"
+                     vec2 staticCoords = qt_TexCoord0;
+                     float staticInScreen = 1.0;") +
+
+                 "vec2 coords = qt_TexCoord0;" +
+
+                 (horizontalSync !== 0 ? "
+                     float dst = sin((coords.y + time * 0.001) * distortionFreq);
+                     coords.x += dst * distortionScale;" +
+
+                     (staticNoise ? "
+                         noise += distortionScale * 7.0;" : "")
+
+                 : "") +
+
+                 (jitter !== 0 || staticNoise !== 0 || rbgShift !== 0 ?
+                     "vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));"
+                 : "") +
+
+                 (jitter !== 0 ? "
+                     vec2 offset = vec2(noiseTexel.b, noiseTexel.a) - vec2(0.5);
+                     vec2 txt_coords = coords + offset * jitterDisplacement;"
+                 :  "vec2 txt_coords = coords;") +
+
+                 "float color = 0.0001;" +
+
+                 (staticNoise !== 0 ? "
+                     float noiseVal = noiseTexel.a;
+                     color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
+
+                 (glowingLine !== 0 ? "
+                     color += randomPass(coords * virtual_resolution) * glowingLine;" : "") +
+
+                 "txt_coords = mix(qt_TexCoord0, txt_coords, staticInScreen);
+                  float inScreen2 = isInScreen(barrel(txt_coords, cc));
+                  vec3 origTxtColor = texture2D(screenBuffer, txt_coords).rgb;
+                  vec3 txt_color = mix(backgroundColor.rgb, origTxtColor, inScreen2);" +
+
+                 (burnIn !== 0 ? "
+                     vec4 txt_blur = texture2D(burnInSource, staticCoords);
+                     float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0);
+                     vec3 burnInColor = 0.5 * (txt_blur.rgb - vec3(blurDecay));
+                     txt_color = max(txt_color, convertWithChroma(burnInColor));"
+                 : "") +
+
+                  "txt_color += fontColor.rgb * vec3(color);" +
+
+                 "vec3 finalColor = txt_color;" +
+
+                 (flickering !== 0 ? "
+                     finalColor *= brightness;" : "") +
+
+                 (ambientLight !== 0 ? "
+                     finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
+
+
+                 "float inShadow = 1.0 - min2(smoothstep(0.0, shadowLength, staticCoords) - smoothstep(1.0 - shadowLength, 1.0, staticCoords));
+                  finalColor = mix(finalColor, vec3(0.0), 0.45 * inShadow * inShadow);
+
+                  finalColor = mix(origTxtColor, finalColor, staticInScreen);
+                  gl_FragColor = vec4(finalColor, qt_Opacity);" +
+             "}"
+
+          onStatusChanged: {
+              // Print warning messages
+              if (log)
+                  console.log(log);
+
+              // Activate fallback mode
+              if (status == ShaderEffect.Error) {
+                 fallBack = true;
+              }
+          }
      }
 
      ShaderEffect {
-         id: frame
+         id: staticShader
 
          width: parent.width * appSettings.windowScaling
          height: parent.height * appSettings.windowScaling
@@ -346,23 +336,24 @@ ShaderEffect {
 
          property color fontColor: parent.fontColor
          property color backgroundColor: parent.backgroundColor
-         property real bloom: parent.bloom
+         property real bloom: appSettings.bloom * 2.5
 
-         property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
+         property real screenCurvature: parent.screenCurvature
 
          property real chromaColor: appSettings.chromaColor;
 
-         property real rbgShift: (appSettings.rbgShift / width) * appSettings.totalFontScaling
+         property real rbgShift: (appSettings.rbgShift / width) * appSettings.totalFontScaling // TODO FILIPPO width here is wrong.
 
          property int rasterization: appSettings.rasterization
 
          property real screen_brightness: Utils.lint(0.5, 1.5, appSettings.brightness)
 
-         property real ambientLight: appSettings.ambientLight * 0.2
+         property real ambientLight: parent.ambientLight
 
          property size virtual_resolution: parent.virtual_resolution
 
          blending: false
+         visible: false
 
          //Print the number with a reasonable precision for the shader.
          function str(num){
@@ -479,24 +470,31 @@ ShaderEffect {
                           finalColor += clamp(bloomColor * bloom * bloomAlpha, 0.0, 0.5);"
                      : "") +
 
+                 "finalColor *= screen_brightness;" +
+
                  (screenCurvature !== 0 ? "
                      vec2 curvatureMask = step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords);
                      finalColor *= clamp(0.0, 1.0, curvatureMask.x + curvatureMask.y);"
                  :"") +
 
-                 "gl_FragColor = vec4(finalColor * screen_brightness, qt_Opacity);" +
+                 "gl_FragColor = vec4(finalColor, qt_Opacity);" +
              "}"
 
          NewTerminalFrame {
              anchors.fill: parent
              blending: true
          }
+
+         onStatusChanged: {
+             // Print warning messages
+             if (log) console.log(log);
+         }
      }
 
      ShaderEffectSource {
          id: frameBuffer
          visible: false
-         sourceItem: frame
+         sourceItem: staticShader
          hideSource: true
      }
 }
diff --git a/app/qml/TerminalContainer.qml b/app/qml/TerminalContainer.qml
index 00696d2..ea390ab 100644
--- a/app/qml/TerminalContainer.qml
+++ b/app/qml/TerminalContainer.qml
@@ -10,8 +10,6 @@ ShaderTerminal {
     id: mainShader
     opacity: appSettings.windowOpacity * 0.3 + 0.7
 
-    blending: false
-
     source: terminal.mainSource
     burnInEffect: terminal.burnInEffect
     virtual_resolution: terminal.virtualResolution