mirror of
https://github.com/libretro/slang-shaders.git
synced 2024-06-02 19:38:36 -04:00
crt-resswitch-glitch-koko: general improvements (#525)
* crt-resswitch-glitch-koko: use % of screen as treshold and skip initial frames to avoid unwanted glitches on flyback core. * crt-resswitch-glitch-koko: check for horizontal resolution too and code legibility improvement
This commit is contained in:
parent
619eaa82a9
commit
5e1db94e0d
|
@ -24,10 +24,11 @@ layout(std140, set = 0, binding = 0) uniform UBO {
|
|||
float RESSWITCH_GLITCH_TRESHOLD;
|
||||
float RESSWITCH_GLITCH_BAR;
|
||||
float RESSWITCH_GLITCH_SHAKE_MAX;
|
||||
uint FrameCount;
|
||||
} global;
|
||||
|
||||
#pragma parameter RESSWITCH_ENABLE "★ Resolution switch glitch enable? ==>" 1.0 0.0 1.0 1.0
|
||||
#pragma parameter RESSWITCH_GLITCH_TRESHOLD " Glitch if vertical resolution changes at least by" 50.0 1.0 1000.0 5.0
|
||||
#pragma parameter RESSWITCH_GLITCH_TRESHOLD " Glitch if vertical resolution changes at least by" 0.1 0.01 1.0 0.01
|
||||
#pragma parameter RESSWITCH_GLITCH_BAR " Bright glitch bars strength" 0.2 0.0 1.0 0.01
|
||||
#pragma parameter RESSWITCH_GLITCH_SHAKE_MAX " Screen shake amplitude" 0.2 0.0 1.0 0.01
|
||||
|
||||
|
@ -37,30 +38,48 @@ layout(location = 1) in vec2 TexCoord;
|
|||
layout(location = 0) out vec2 vTexCoord;
|
||||
layout(location = 1) out float vSwitchres_show_bar;
|
||||
|
||||
#define _3kHIST0 global.SourceSize.xy
|
||||
#define _3kHIST1 global.OriginalHistorySize1.xy
|
||||
#define _3kHIST2 global.OriginalHistorySize2.xy
|
||||
#define _3kHIST3 global.OriginalHistorySize3.xy
|
||||
#define _3kHIST4 global.OriginalHistorySize4.xy
|
||||
#define _3kHIST5 global.OriginalHistorySize5.xy
|
||||
|
||||
bool changed_enough(vec2 current, vec2 past){
|
||||
return (abs(current.y - past.y) / current.y > global.RESSWITCH_GLITCH_TRESHOLD) ||
|
||||
(abs(current.x - past.x) / current.x > global.RESSWITCH_GLITCH_TRESHOLD);
|
||||
}
|
||||
|
||||
void main() {
|
||||
gl_Position = global.MVP * Position;
|
||||
vTexCoord = TexCoord * 1.0001;
|
||||
|
||||
vSwitchres_show_bar = 0.0;
|
||||
if (global.RESSWITCH_ENABLE > 0.5 ) {
|
||||
if (abs(global.SourceSize.y - global.OriginalHistorySize1.y) > global.RESSWITCH_GLITCH_TRESHOLD) {
|
||||
// Skip a bunch of frames at the beginning to prevent unwanted glitches
|
||||
// with flycast core and maybe with fast-forward too.
|
||||
if (global.RESSWITCH_ENABLE > 0.5 && global.FrameCount > 10 ) {
|
||||
if (changed_enough(_3kHIST0, _3kHIST1)) {
|
||||
//first frame
|
||||
vSwitchres_show_bar = global.RESSWITCH_GLITCH_BAR;
|
||||
vTexCoord.y += global.RESSWITCH_GLITCH_SHAKE_MAX * +1.0 ;
|
||||
}
|
||||
else if (abs(global.SourceSize.y - global.OriginalHistorySize2.y) > global.RESSWITCH_GLITCH_TRESHOLD) {
|
||||
|
||||
else if (changed_enough(_3kHIST0, _3kHIST2)) {
|
||||
vSwitchres_show_bar = global.RESSWITCH_GLITCH_BAR;
|
||||
vTexCoord.y += global.RESSWITCH_GLITCH_SHAKE_MAX * -1.0;
|
||||
}
|
||||
else if (abs(global.SourceSize.y - global.OriginalHistorySize3.y) > global.RESSWITCH_GLITCH_TRESHOLD) {
|
||||
|
||||
else if (changed_enough(_3kHIST0, _3kHIST3)) {
|
||||
vSwitchres_show_bar = global.RESSWITCH_GLITCH_BAR;
|
||||
vTexCoord.y += global.RESSWITCH_GLITCH_SHAKE_MAX * +0.5;
|
||||
}
|
||||
else if (abs(global.SourceSize.y - global.OriginalHistorySize4.y) > global.RESSWITCH_GLITCH_TRESHOLD) {
|
||||
|
||||
else if (changed_enough(_3kHIST0, _3kHIST4)) {
|
||||
vSwitchres_show_bar = global.RESSWITCH_GLITCH_BAR;
|
||||
vTexCoord.y += global.RESSWITCH_GLITCH_SHAKE_MAX * -0.5;
|
||||
}
|
||||
else if (abs(global.SourceSize.y - global.OriginalHistorySize5.y) > global.RESSWITCH_GLITCH_TRESHOLD) {
|
||||
|
||||
else if (changed_enough(_3kHIST0, _3kHIST5)) {
|
||||
//last frame
|
||||
vTexCoord.y += global.RESSWITCH_GLITCH_SHAKE_MAX * +0.25;
|
||||
vSwitchres_show_bar = global.RESSWITCH_GLITCH_BAR;
|
||||
|
|
Loading…
Reference in a new issue