1
0
mirror of https://github.com/Swordfish90/cool-retro-term.git synced 2025-04-20 01:31:01 +01:00

Split effects into static (cached) and dynamic computed at every frame.

This commit is contained in:
Filippo Scognamiglio 2018-12-03 13:32:08 +01:00
parent da6795f002
commit e9ddd7d3b8
2 changed files with 292 additions and 296 deletions

View File

@ -23,48 +23,48 @@ import QtGraphicalEffects 1.0
import "utils.js" as Utils import "utils.js" as Utils
ShaderEffect { Item {
property ShaderEffectSource source property ShaderEffectSource source
property BurnInEffect burnInEffect property BurnInEffect burnInEffect
property ShaderEffectSource bloomSource property ShaderEffectSource bloomSource
property ShaderEffectSource screenBuffer: frameBuffer
property color fontColor: appSettings.fontColor property color fontColor: appSettings.fontColor
property color backgroundColor: appSettings.backgroundColor property color backgroundColor: appSettings.backgroundColor
property real bloom: appSettings.bloom * 2.5
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
property real chromaColor: appSettings.chromaColor
property real ambientLight: appSettings.ambientLight * 0.2
property size virtual_resolution
ShaderEffect {
id: dynamicShader
property ShaderEffectSource screenBuffer: frameBuffer
property ShaderEffectSource burnInSource: burnInEffect.source property ShaderEffectSource burnInSource: burnInEffect.source
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
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 burnIn: appSettings.burnIn
property real burnInLastUpdate: burnInEffect.lastUpdate property real burnInLastUpdate: burnInEffect.lastUpdate
property real burnInTime: burnInEffect.burnInFadeTime property real burnInTime: burnInEffect.burnInFadeTime
property real jitter: appSettings.jitter property real jitter: appSettings.jitter
property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * 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 real staticNoise: appSettings.staticNoise
property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling), property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
(height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling)) (height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize property size virtual_resolution: parent.virtual_resolution
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 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 real time: timeManager.time
property ShaderEffectSource noiseSource: noiseShaderSource property ShaderEffectSource noiseSource: noiseShaderSource
@ -72,6 +72,7 @@ ShaderEffect {
// If something goes wrong activate the fallback version of the shader. // If something goes wrong activate the fallback version of the shader.
property bool fallBack: false property bool fallBack: false
anchors.fill: parent
blending: false blending: false
//Smooth random texture used for flickering effect. //Smooth random texture used for flickering effect.
@ -108,9 +109,6 @@ ShaderEffect {
(!fallBack ? " (!fallBack ? "
uniform sampler2D noiseSource;" : "") + uniform sampler2D noiseSource;" : "") +
(!fallBack && rbgShift !== 0.0 ?"
varying lowp vec4 constantNoise;" : "") +
(!fallBack && flickering !== 0.0 ?" (!fallBack && flickering !== 0.0 ?"
varying lowp float brightness; varying lowp float brightness;
uniform lowp float flickering;" : "") + uniform lowp float flickering;" : "") +
@ -129,9 +127,6 @@ ShaderEffect {
"vec4 initialNoiseTexel = texture2D(noiseSource, coords);" "vec4 initialNoiseTexel = texture2D(noiseSource, coords);"
: "") + : "") +
(!fallBack && rbgShift !== 0.0 ?"
constantNoise = initialNoiseTexel;" : "") +
(!fallBack && flickering !== 0.0 ? " (!fallBack && flickering !== 0.0 ? "
brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;" brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
: "") + : "") +
@ -157,7 +152,6 @@ ShaderEffect {
uniform highp vec4 fontColor; uniform highp vec4 fontColor;
uniform highp vec4 backgroundColor; uniform highp vec4 backgroundColor;
uniform lowp float screen_brightness;
uniform lowp float shadowLength; uniform lowp float shadowLength;
uniform highp vec2 virtual_resolution;" + uniform highp vec2 virtual_resolution;" +
@ -194,9 +188,6 @@ ShaderEffect {
varying lowp float distortionScale; varying lowp float distortionScale;
varying lowp float distortionFreq;" : "") + varying lowp float distortionFreq;" : "") +
(!fallBack && rbgShift !== 0.0 ?"
varying lowp vec4 constantNoise;" : "") +
(glowingLine !== 0 ? " (glowingLine !== 0 ? "
float randomPass(vec2 coords){ float randomPass(vec2 coords){
return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015))); return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015)));
@ -251,8 +242,6 @@ ShaderEffect {
float distortionScale = step(0.0, randval) * randval * horizontalSync; float distortionScale = step(0.0, randval) * randval * horizontalSync;
float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
: "") + : "") +
(fallBack && rbgShift !== 0.0 ?"
lowp vec4 constantNoise = initialNoiseTexel;" : "") +
(staticNoise ? " (staticNoise ? "
float noise = staticNoise;" : "") + float noise = staticNoise;" : "") +
@ -297,7 +286,7 @@ ShaderEffect {
"txt_coords = mix(qt_TexCoord0, txt_coords, staticInScreen); "txt_coords = mix(qt_TexCoord0, txt_coords, staticInScreen);
float inScreen2 = isInScreen(barrel(txt_coords, cc)); float inScreen2 = isInScreen(barrel(txt_coords, cc));
vec3 origTxtColor = texture2D(screenBuffer, txt_coords).rgb; vec3 origTxtColor = texture2D(screenBuffer, txt_coords).rgb;
vec3 txt_color = origTxtColor * inScreen2 + backgroundColor.rgb * (1.0 - inScreen2);" + vec3 txt_color = mix(backgroundColor.rgb, origTxtColor, inScreen2);" +
(burnIn !== 0 ? " (burnIn !== 0 ? "
vec4 txt_blur = texture2D(burnInSource, staticCoords); vec4 txt_blur = texture2D(burnInSource, staticCoords);
@ -318,10 +307,10 @@ ShaderEffect {
"float inShadow = 1.0 - min2(smoothstep(0.0, shadowLength, staticCoords) - smoothstep(1.0 - shadowLength, 1.0, staticCoords)); "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(finalColor, vec3(0.0), 0.45 * inShadow * inShadow);
finalColor = mix(origTxtColor, finalColor, staticInScreen); finalColor = mix(origTxtColor, finalColor, staticInScreen);
gl_FragColor = vec4(finalColor * screen_brightness, qt_Opacity);" + gl_FragColor = vec4(finalColor, qt_Opacity);" +
"}" "}"
onStatusChanged: { onStatusChanged: {
@ -334,9 +323,10 @@ ShaderEffect {
fallBack = true; fallBack = true;
} }
} }
}
ShaderEffect { ShaderEffect {
id: frame id: staticShader
width: parent.width * appSettings.windowScaling width: parent.width * appSettings.windowScaling
height: parent.height * appSettings.windowScaling height: parent.height * appSettings.windowScaling
@ -346,23 +336,24 @@ ShaderEffect {
property color fontColor: parent.fontColor property color fontColor: parent.fontColor
property color backgroundColor: parent.backgroundColor 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 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 int rasterization: appSettings.rasterization
property real screen_brightness: Utils.lint(0.5, 1.5, appSettings.brightness) 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 property size virtual_resolution: parent.virtual_resolution
blending: false blending: false
visible: false
//Print the number with a reasonable precision for the shader. //Print the number with a reasonable precision for the shader.
function str(num){ function str(num){
@ -479,24 +470,31 @@ ShaderEffect {
finalColor += clamp(bloomColor * bloom * bloomAlpha, 0.0, 0.5);" finalColor += clamp(bloomColor * bloom * bloomAlpha, 0.0, 0.5);"
: "") + : "") +
"finalColor *= screen_brightness;" +
(screenCurvature !== 0 ? " (screenCurvature !== 0 ? "
vec2 curvatureMask = step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords); vec2 curvatureMask = step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords);
finalColor *= clamp(0.0, 1.0, curvatureMask.x + curvatureMask.y);" 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 { NewTerminalFrame {
anchors.fill: parent anchors.fill: parent
blending: true blending: true
} }
onStatusChanged: {
// Print warning messages
if (log) console.log(log);
}
} }
ShaderEffectSource { ShaderEffectSource {
id: frameBuffer id: frameBuffer
visible: false visible: false
sourceItem: frame sourceItem: staticShader
hideSource: true hideSource: true
} }
} }

View File

@ -10,8 +10,6 @@ ShaderTerminal {
id: mainShader id: mainShader
opacity: appSettings.windowOpacity * 0.3 + 0.7 opacity: appSettings.windowOpacity * 0.3 + 0.7
blending: false
source: terminal.mainSource source: terminal.mainSource
burnInEffect: terminal.burnInEffect burnInEffect: terminal.burnInEffect
virtual_resolution: terminal.virtualResolution virtual_resolution: terminal.virtualResolution