From 0431103a1db81bc2a52f05c6ffd422a090836a42 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Thu, 13 Dec 2018 23:55:07 +0100 Subject: [PATCH] Move frame to separate framebuffer. This fixes some glitches in terminal frame. --- app/qml/NewTerminalFrame.qml | 11 +++-- app/qml/ShaderTerminal.qml | 78 +++++++++++++++++++++--------------- 2 files changed, 53 insertions(+), 36 deletions(-) diff --git a/app/qml/NewTerminalFrame.qml b/app/qml/NewTerminalFrame.qml index 22ee386..2ed3ff1 100644 --- a/app/qml/NewTerminalFrame.qml +++ b/app/qml/NewTerminalFrame.qml @@ -13,6 +13,8 @@ ShaderEffect { property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight) + property size aadelta: Qt.size(1.0 / width, 1.0 / height) + fragmentShader: " #ifdef GL_ES precision mediump float; @@ -22,6 +24,7 @@ ShaderEffect { uniform lowp float shadowLength; uniform highp float qt_Opacity; uniform lowp vec4 frameColor; + uniform mediump vec2 aadelta; varying highp vec2 qt_TexCoord0; @@ -53,10 +56,10 @@ ShaderEffect { float outShadowLength = shadowLength; float outShadow = max2(1.0 - smoothstep(vec2(-outShadowLength), vec2(0.0), coords) + smoothstep(vec2(1.0), vec2(1.0 + outShadowLength), coords)); - outShadow = clamp(0.0, 1.0, outShadow); - color += frameColor.rgb * sqrt(outShadow); - alpha = sum2(1.0 - step(0.0, coords) + step(1.0, coords)); - alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, sqrt(outShadow)); + outShadow = clamp(0.0, 1.0, sqrt(outShadow)); + color += frameColor.rgb * outShadow; + alpha = sum2(1.0 - smoothstep(vec2(0.0), aadelta, coords) + smoothstep(vec2(1.0) - aadelta, vec2(1.0), coords)); + alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, outShadow); gl_FragColor = vec4(color * alpha, alpha); } diff --git a/app/qml/ShaderTerminal.qml b/app/qml/ShaderTerminal.qml index 3e53baa..2385fbf 100644 --- a/app/qml/ShaderTerminal.qml +++ b/app/qml/ShaderTerminal.qml @@ -44,6 +44,7 @@ Item { property ShaderEffectSource screenBuffer: frameBuffer property ShaderEffectSource burnInSource: burnInEffect.source + property ShaderEffectSource frameSource: terminalFrameLoader.item property color fontColor: parent.fontColor property color backgroundColor: parent.backgroundColor @@ -167,7 +168,8 @@ Item { uniform lowp sampler2D noiseSource; uniform highp vec2 scaleNoiseSize;" : "") + (screenCurvature !== 0 ? " - uniform highp float screenCurvature;" : "") + + uniform highp float screenCurvature; + uniform lowp sampler2D frameSource;" : "") + (glowingLine !== 0 ? " uniform highp float glowingLine;" : "") + (chromaColor !== 0 ? " @@ -247,12 +249,9 @@ Item { 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 = barrel(qt_TexCoord0, cc);" :" - vec2 staticCoords = qt_TexCoord0; - float staticInScreen = 1.0;") + + vec2 staticCoords = qt_TexCoord0;") + "vec2 coords = qt_TexCoord0;" + @@ -283,10 +282,7 @@ Item { (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);" + + "vec3 txt_color = texture2D(screenBuffer, txt_coords).rgb;" + (burnIn !== 0 ? " vec4 txt_blur = texture2D(burnInSource, staticCoords); @@ -305,13 +301,12 @@ Item { (ambientLight !== 0 ? " finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") + + (screenCurvature !== 0 ? + "vec4 frameColor = texture2D(frameSource, qt_TexCoord0); + finalColor = mix(finalColor, frameColor.rgb, frameColor.a);" + : "") + - "float inShadow = 1.0 - min2(smoothstep(0.0, shadowLength, staticCoords) - smoothstep(1.0 - shadowLength, 1.0, staticCoords)); - inShadow = pow(inShadow, 100.0) + 0.35 * inShadow * inShadow; // Inner shadow and antialiasing when screen background is bright. - finalColor = mix(finalColor, vec3(0.0), inShadow); - - finalColor = mix(origTxtColor, finalColor, staticInScreen); - gl_FragColor = vec4(finalColor, qt_Opacity);" + + "gl_FragColor = vec4(finalColor, qt_Opacity);" + "}" onStatusChanged: { @@ -326,6 +321,29 @@ Item { } } + Loader { + id: terminalFrameLoader + + active: screenCurvature !== 0 + + width: staticShader.width + height: staticShader.height + + sourceComponent: ShaderEffectSource { + + sourceItem: terminalFrame + hideSource: true + visible: false + format: ShaderEffectSource.RGBA + + NewTerminalFrame { + id: terminalFrame + blending: false + anchors.fill: parent + } + } + } + ShaderEffect { id: staticShader @@ -415,6 +433,10 @@ Item { return min(v.x, v.y); } + float sum2(vec2 v) { + return v.x + v.y; + } + float rgb2grey(vec3 v){ return dot(v, vec3(0.21, 0.72, 0.04)); }" + @@ -457,11 +479,17 @@ Item { "txt_color += vec3(0.0001);" + "float greyscale_color = rgb2grey(txt_color);" + + (screenCurvature !== 0 ? " + float reflectionMask = sum2(step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords)); + reflectionMask = clamp(0.0, 1.0, reflectionMask);" + : + "float reflectionMask = 1.0;") + + (chromaColor !== 0 ? "vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor); - vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color);" + vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color * reflectionMask);" : - "vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color);") + + "vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color * reflectionMask);") + (bloom !== 0 ? "vec4 bloomFullColor = texture2D(bloomSource, txt_coords); @@ -473,23 +501,9 @@ Item { "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, qt_Opacity);" + "}" - Loader { - anchors.fill: parent - active: screenCurvature !== 0 - - sourceComponent: NewTerminalFrame { - blending: true - } - } - onStatusChanged: { // Print warning messages if (log) console.log(log);