Skip to content
This repository was archived by the owner on Jun 28, 2024. It is now read-only.

Commit d625c80

Browse files
authored
update shaders
1 parent 26de331 commit d625c80

5 files changed

+70
-97
lines changed

README.md

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
# better-mpv-config
22

3-
Version: 1.0.6
4-
5-
Last Updated (AEST): 2022-02-01 01:11:48PM
3+
- Version: 1.0.7
4+
- Last Updated (AEST): 2022-06-02 01:19:57PM
65

76
## What's New
87

8+
_Version 1.0.7_:
9+
- Updated shaders (should improve performance)
10+
911
_Version 1.0.6_ fixes:
1012
- [profile restore actions](https://mpv.io/manual/stable/#configuration-files-copy-equal)
1113

shaders/KrigBilateral.glsl

+5-5
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,12 @@ vec4 hook() {
107107

108108
#define M(i,j) Mx[min(i,j)*N + max(i,j) - (min(i,j)*(min(i,j)+1))/2]
109109

110-
#define C(i,j) (inversesqrt(1.0 + (X[i].y + X[j].y) / Var) * exp(-0.5 * (sqr(X[i].x - X[j].x) / (localVar + X[i].y + X[j].y + sigma_nsq) + sqr((coords[i] - coords[j]) / radius))) + (X[i].x - y) * (X[j].x - y) / (Var + sigma_nsq))
111-
#define c(i) (inversesqrt(1.0 + X[i].y / Var) * exp(-0.5 * (sqr(X[i].x - y) / (localVar + X[i].y + sigma_nsq) + sqr((coords[i] - offset) / radius))))
110+
#define C(i,j) (inversesqrt(1.0 + (X[i].y + X[j].y) / Var) * exp(-0.5 * (sqr(X[i].x - X[j].x) / (localVar + X[i].y + X[j].y) + sqr((coords[i] - coords[j]) / radius))) /*+ (X[i].x - y) * (X[j].x - y) / Var*/) // commented out part works well only on test patterns
111+
#define c(i) (inversesqrt(1.0 + X[i].y / Var) * exp(-0.5 * (sqr(X[i].x - y) / (localVar + X[i].y) + sqr((coords[i] - offset) / radius))))
112112

113113
#define getnsum(i) X[i] = vec4(LOWRES_Y_tex(LOWRES_Y_pt*(pos+coords[i]+vec2(0.5))).xy, \
114114
CHROMA_tex(CHROMA_pt*(pos+coords[i]+vec2(0.5))).xy); \
115-
w = clamp(1.5 - abs(coords[i] - offset), 0.0, 1.0); \
115+
w = clamp(1.5 - abs(coords[i]), 0.0, 1.0); \
116116
total += w.x*w.y*vec4(X[i].x, X[i].x * X[i].x, X[i].y, 1.0);
117117

118118
#define I3(f, n) f(n) f(n+1) f(n+2)
@@ -135,7 +135,7 @@ vec4 hook() {
135135
I9(getnsum, 0)
136136

137137
total.xyz /= total.w;
138-
float localVar = max(total.y - total.x * total.x, 1e-6);
138+
float localVar = abs(total.y - total.x * total.x) + sigma_nsq;
139139
float Var = localVar + total.z;
140140
float radius = 1.0;
141141

@@ -213,4 +213,4 @@ vec4 hook() {
213213
interp += b[0] * (X[0] - X[N]).zw;
214214

215215
return interp.xyxy;
216-
}
216+
}

shaders/SSimDownscaler.glsl

+7-5
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,9 @@ vec4 hook() {
103103
//!COMPONENTS 4
104104
//!DESC SSimDownscaler mean & R
105105

106-
#define sigma_nsq 49. / (255.*255.)
106+
#define oversharp 0.0
107+
108+
#define sigma_nsq 10. / (255.*255.)
107109
#define locality 2.0
108110

109111
#define offset vec2(0,0)
@@ -153,9 +155,9 @@ vec4 hook() {
153155
}
154156
avg /= W;
155157

156-
float Sl = Luma(max(avg[1] - avg[0] * avg[0], 0.)) + sigma_nsq;
157-
float Sh = Luma(max(avg[2] - avg[0] * avg[0], 0.)) + sigma_nsq;
158-
return vec4(avg[0], sqrt(Sh / Sl));
158+
float Sl = Luma(max(avg[1] - avg[0] * avg[0], 0.));
159+
float Sh = Luma(max(avg[2] - avg[0] * avg[0], 0.));
160+
return vec4(avg[0], mix(sqrt((Sh + sigma_nsq) / (Sl + sigma_nsq)) * (1. + oversharp), clamp(Sh / Sl, 0., 1.), int(Sl > Sh)));
159161
}
160162

161163
//!HOOK POSTKERNEL
@@ -215,4 +217,4 @@ vec4 hook() {
215217
avg /= W;
216218
vec4 L = POSTKERNEL_texOff(0);
217219
return vec4(avg[1] + avg[2] * L.rgb - avg[0], L.a);
218-
}
220+
}

shaders/SSimSuperRes.glsl

+34-34
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,9 @@
3131
#define Kernel(x) MN(0.334, 0.333, abs(x))
3232
#define taps 2.0
3333

34-
#define Luma(rgb) ( dot(rgb*rgb, vec3(0.2126, 0.7152, 0.0722)) )
34+
#define Luma(rgb) dot(rgb*rgb, vec3(0.2126, 0.7152, 0.0722))
3535

3636
vec4 hook() {
37-
// Calculate bounds
3837
float low = ceil((HOOKED_pos - taps/input_size) * HOOKED_size - offset - 0.5)[axis];
3938
float high = floor((HOOKED_pos + taps/input_size) * HOOKED_size - offset - 0.5)[axis];
4039

@@ -75,10 +74,9 @@ vec4 hook() {
7574
#define Kernel(x) MN(0.334, 0.333, abs(x))
7675
#define taps 2.0
7776

78-
#define Luma(rgb) ( dot(rgb*rgb, vec3(0.2126, 0.7152, 0.0722)) )
77+
#define Luma(rgb) dot(rgb*rgb, vec3(0.2126, 0.7152, 0.0722))
7978

8079
vec4 hook() {
81-
// Calculate bounds
8280
float low = ceil((LOWRES_pos - taps/input_size) * LOWRES_size - offset - 0.5)[axis];
8381
float high = floor((LOWRES_pos + taps/input_size) * LOWRES_size - offset - 0.5)[axis];
8482

@@ -112,35 +110,36 @@ vec4 hook() {
112110
//!COMPONENTS 2
113111
//!DESC SSSR var
114112

115-
#define spread 1.0 / 1000.0
113+
#define spread 1.0 / 4.0
116114

117115
#define GetL(x,y) PREKERNEL_tex(PREKERNEL_pt * (PREKERNEL_pos * input_size + tex_offset + vec2(x,y))).rgb
118116
#define GetH(x,y) LOWRES_texOff(vec2(x,y)).rgb
119117

120-
#define Luma(rgb) ( dot(rgb*rgb, vec3(0.2126, 0.7152, 0.0722)) )
118+
#define Luma(rgb) dot(rgb*rgb, vec3(0.2126, 0.7152, 0.0722))
119+
#define diff(x,y) vec2(Luma((GetL(x,y) - meanL)), Luma((GetH(x,y) - meanH)))
121120

122121
vec4 hook() {
123-
vec3 meanL = vec3(0);
124-
vec3 meanH = vec3(0);
125-
for (int X=-1; X<=1; X++)
126-
for (int Y=-1; Y<=1; Y++) {
127-
meanL += GetL(X,Y) * pow(spread, abs(float(X)) + abs(float(Y)));
128-
meanH += GetH(X,Y) * pow(spread, abs(float(X)) + abs(float(Y)));
122+
vec3 meanL = GetL(0,0);
123+
vec3 meanH = GetH(0,0);
124+
for (int X=-1; X<=1; X+=2) {
125+
meanL += GetL(X,0) * spread;
126+
meanH += GetH(X,0) * spread;
129127
}
130-
meanL /= (1.0 + 4.0*spread + 4.0*spread*spread);
131-
meanH /= (1.0 + 4.0*spread + 4.0*spread*spread);
132-
133-
float varL = 0.0;
134-
float varH = 0.0;
135-
for (int X=-1; X<=1; X++)
136-
for (int Y=-1; Y<=1; Y++) {
137-
varL += Luma(abs(GetL(X,Y) - meanL)) * pow(spread, abs(float(X)) + abs(float(Y)));
138-
varH += Luma(abs(GetH(X,Y) - meanH)) * pow(spread, abs(float(X)) + abs(float(Y)));
128+
for (int Y=-1; Y<=1; Y+=2) {
129+
meanL += GetL(0,Y) * spread;
130+
meanH += GetH(0,Y) * spread;
139131
}
140-
varL = max(varL / (spread + 4.0*spread + 4.0*spread*spread), 1e-6);
141-
varH = max(varH / (spread + 4.0*spread + 4.0*spread*spread), 1e-6);
132+
meanL /= (1.0 + 4.0*spread);
133+
meanH /= (1.0 + 4.0*spread);
142134

143-
return vec4(varL, varH, 0, 0);
135+
vec2 var = diff(0,0);
136+
for (int X=-1; X<=1; X+=2)
137+
var += diff(X,0) * spread;
138+
139+
for (int Y=-1; Y<=1; Y+=2)
140+
var += diff(0,Y) * spread;
141+
142+
return vec4(max(var / (1.0 + 4.0*spread), vec2(1e-6)), 0, 0);
144143
}
145144

146145
//!HOOK POSTKERNEL
@@ -151,33 +150,34 @@ vec4 hook() {
151150
//!WHEN NATIVE_CROPPED.h OUTPUT.h <
152151
//!DESC SSSR final pass
153152

153+
#define oversharp 0.4
154+
154155
// -- Window Size --
155156
#define taps 3.0
156157
#define even (taps - 2.0 * floor(taps / 2.0) == 0.0)
157158
#define minX int(1.0-ceil(taps/2.0))
158159
#define maxX int(floor(taps/2.0))
159160

160-
#define Kernel(x) ( cos(acos(-1.0)*(x)/taps) ) // Hann kernel
161+
#define Kernel(x) cos(acos(-1.0)*(x)/taps) // Hann kernel
161162

162163
// -- Input processing --
163-
#define var(x,y) ( var_tex(var_pt * (pos + vec2(x,y) + 0.5)).rg )
164-
#define GetL(x,y) ( PREKERNEL_tex(PREKERNEL_pt * (pos + tex_offset + vec2(x,y) + 0.5)).rgb )
165-
#define GetH(x,y) ( LOWRES_tex(LOWRES_pt * (pos + vec2(x,y) + 0.5)) )
164+
#define var(x,y) var_tex(var_pt * (pos + vec2(x,y) + 0.5)).rg
165+
#define GetL(x,y) PREKERNEL_tex(PREKERNEL_pt * (pos + tex_offset + vec2(x,y) + 0.5)).rgb
166+
#define GetH(x,y) LOWRES_tex(LOWRES_pt * (pos + vec2(x,y) + 0.5))
166167

167-
#define Luma(rgb) ( dot(rgb*rgb, vec3(0.2126, 0.7152, 0.0722)) )
168+
#define Luma(rgb) dot(rgb*rgb, vec3(0.2126, 0.7152, 0.0722))
168169

169170
vec4 hook() {
170171
vec4 c0 = HOOKED_texOff(0);
171172

172-
// Calculate position
173173
vec2 pos = HOOKED_pos * LOWRES_size - vec2(0.5);
174174
vec2 offset = pos - (even ? floor(pos) : round(pos));
175175
pos -= offset;
176176

177177
vec2 mVar = vec2(0.0);
178178
for (int X=-1; X<=1; X++)
179179
for (int Y=-1; Y<=1; Y++) {
180-
vec2 w = clamp(1.5 - abs(vec2(X,Y) - offset), 0., 1.);
180+
vec2 w = clamp(1.5 - abs(vec2(X,Y)), 0.0, 1.0);
181181
mVar += w.r * w.g * vec2(GetH(X,Y).a, 1.0);
182182
}
183183
mVar.r /= mVar.g;
@@ -189,10 +189,10 @@ vec4 hook() {
189189
for (int X = minX; X <= maxX; X++)
190190
for (int Y = minX; Y <= maxX; Y++)
191191
{
192-
float R = -sqrt(var(X,Y).r / (var(X,Y).g + mVar.r));
192+
float R = (-1.0 - oversharp) * sqrt(var(X,Y).r / (var(X,Y).g + mVar.r));
193193

194194
vec2 krnl = Kernel(vec2(X,Y) - offset);
195-
float weight = krnl.r * krnl.g / (Luma(abs(c0.rgb - GetH(X,Y).rgb)) + GetH(X,Y).a);
195+
float weight = krnl.r * krnl.g / (Luma((c0.rgb - GetH(X,Y).rgb)) + GetH(X,Y).a);
196196

197197
diff += weight * (GetL(X,Y) + GetH(X,Y).rgb * R + (-1.0 - R) * (c0.rgb));
198198
weightSum += weight;
@@ -202,4 +202,4 @@ vec4 hook() {
202202
c0.rgb = ((c0.rgb) + diff);
203203

204204
return c0;
205-
}
205+
}

shaders/adaptive-sharpen.glsl

+19-50
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@
2828
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2929

3030
// Adaptive sharpen - version 2021-10-17
31-
// Tuned for use post-resize, EXPECTS FULL RANGE GAMMA LIGHT (requires ps >= 3.0)
31+
// Tuned for use post-resize
3232

33-
//!HOOK SCALED
33+
//!HOOK OUTPUT
3434
//!BIND HOOKED
3535
//!DESC adaptive-sharpen
3636

@@ -39,23 +39,16 @@
3939
#define curve_height 1.0 // Main control of sharpening strength [>0]
4040
// 0.3 <-> 2.0 is a reasonable range of values
4141

42-
#define anime_mode false // Only darken edges
43-
4442
#define overshoot_ctrl false // Allow for higher overshoot if the current edge pixel
4543
// is surrounded by similar edge pixels
4644

47-
#define video_level_out false // True to preserve BTB & WTW (minor summation error)
48-
// Normally it should be set to false
49-
5045
// Defined values under this row are "optimal" DO NOT CHANGE IF YOU DO NOT KNOW WHAT YOU ARE DOING!
5146

5247
#define curveslope 0.5 // Sharpening curve slope, high edge values
5348

54-
#define L_overshoot 0.003 // Max light overshoot before compression [>0.001]
5549
#define L_compr_low 0.167 // Light compression, default (0.167=~6x)
5650
#define L_compr_high 0.334 // Light compression, surrounded by edges (0.334=~3x)
5751

58-
#define D_overshoot 0.003 // Max dark overshoot before compression [>0.001]
5952
#define D_compr_low 0.250 // Dark compression, default (0.250=4x)
6053
#define D_compr_high 0.500 // Dark compression, surrounded by edges (0.500=2x)
6154

@@ -77,13 +70,13 @@
7770
#define wpmean(a,b,w) ( pow(w*pow(abs(a), pm_p) + abs(1.0-w)*pow(abs(b), pm_p), (1.0/pm_p)) )
7871

7972
// Get destination pixel values
80-
#define get(x,y) ( sat(HOOKED_texOff(vec2(x, y)).rgb) )
73+
#define get(x,y) ( HOOKED_texOff(vec2(x, y)).rgb )
8174
#define sat(x) ( clamp(x, 0.0, 1.0) )
8275
#define dxdy(val) ( length(fwidth(val)) ) // =~1/2.5 hq edge without c_comp
8376

84-
#define CtL(RGB) ( sqrt(dot(RGB*RGB, vec3(0.2126, 0.7152, 0.0722))) )
77+
#define CtL(RGB) ( sat(dot(RGB, vec3(0.2126, 0.7152, 0.0722))) )
8578

86-
#define b_diff(pix) ( abs(blur-c[pix]) )
79+
#define b_diff(pix) ( (blur-c[pix])*(blur-c[pix]) )
8780

8881
vec4 hook() {
8982

@@ -105,7 +98,7 @@ vec4 hook() {
10598
dxdy(c[10]), dxdy(c[11]), dxdy(c[12]));
10699

107100
// Blur, gauss 3x3
108-
vec3 blur = (2.0 * (c[2]+c[4]+c[5]+c[7]) + (c[1]+c[3]+c[6]+c[8]) + 4.0 * c[0]) / 16.0;
101+
vec3 blur = sat((2.0 * (c[2]+c[4]+c[5]+c[7]) + (c[1]+c[3]+c[6]+c[8]) + 4.0 * c[0]) / 16.0);
109102

110103
// Contrast compression, center = 0.5, scaled to 1/3
111104
float c_comp = sat(0.266666681f + 0.9*exp2(dot(blur, vec3(-7.4/3.0))));
@@ -187,17 +180,17 @@ vec4 hook() {
187180

188181
for (int pix = 0; pix < 12; ++pix)
189182
{
190-
float lowthr = clamp((20.*4.5*c_comp*e[pix + 1] - 0.221), 0.01, 1.0);
183+
float lowthr = sat((20.*4.5*c_comp*e[pix + 1] - 0.221));
191184

192-
neg_laplace += luma[pix+1] * weights[pix] * lowthr;
185+
neg_laplace += luma[pix+1] * luma[pix+1] * weights[pix] * lowthr;
193186
weightsum += weights[pix] * lowthr;
194187
lowthrsum += lowthr / 12.0;
195188
}
196189

197-
neg_laplace = neg_laplace / weightsum;
190+
neg_laplace = sqrt(neg_laplace / weightsum);
198191

199192
// Compute sharpening magnitude function
200-
float sharpen_val = curve_height/(curve_height*curveslope*pow(edge, 3.5) + 0.625);
193+
float sharpen_val = curve_height/(curve_height*curveslope*edge + 0.625);
201194

202195
// Calculate sharpening diff and scale
203196
float sharpdiff = (c0_Y - neg_laplace)*(lowthrsum*sharpen_val + 0.01);
@@ -223,40 +216,16 @@ vec4 hook() {
223216
luma[i2-1] = min(temp, luma[i2-1]);
224217
}
225218

226-
for (int i1 = 1; i1 < 24-1; i1 += 2)
227-
{
228-
temp = luma[i1];
229-
luma[i1] = min(luma[i1], luma[i1+1]);
230-
luma[i1+1] = max(temp, luma[i1+1]);
231-
}
232-
233-
for (int i2 = 24-1; i2 > 1; i2 -= 2)
234-
{
235-
temp = luma[1];
236-
luma[1] = min(luma[1], luma[i2]);
237-
luma[i2] = max(temp, luma[i2]);
238-
239-
temp = luma[24-1];
240-
luma[24-1] = max(luma[24-1], luma[i2-1]);
241-
luma[i2-1] = min(temp, luma[i2-1]);
242-
}
243-
244-
float nmax = (max(luma[23], c0_Y)*3.0 + luma[24])/4.0;
245-
float nmin = (min(luma[1], c0_Y)*3.0 + luma[0])/4.0;
246-
247-
float min_dist = min(abs(nmax - c0_Y), abs(c0_Y - nmin));
248-
vec2 pn_scale = vec2(L_overshoot, D_overshoot) + min_dist;
249-
250-
pn_scale = min(pn_scale, scale_lim*(1.0 - scale_cs) + pn_scale*scale_cs);
219+
float min_dist = min(abs(luma[24] - c0_Y), abs(c0_Y - luma[0]));
220+
min_dist = min(min_dist, scale_lim*(1.0 - scale_cs) + min_dist*scale_cs);
251221

252222
// Soft limited anti-ringing with tanh, wpmean to control compression slope
253-
sharpdiff = (anime_mode ? 0. :
254-
wpmean(max(sharpdiff, 0.0), soft_lim( max(sharpdiff, 0.0), pn_scale.x ), cs.x ))
255-
- wpmean(min(sharpdiff, 0.0), soft_lim( min(sharpdiff, 0.0), pn_scale.y ), cs.y );
223+
sharpdiff = wpmean(max(sharpdiff, 0.0), soft_lim( max(sharpdiff, 0.0), min_dist ), cs.x )
224+
- wpmean(min(sharpdiff, 0.0), soft_lim( min(sharpdiff, 0.0), min_dist ), cs.y );
256225

257226
float sharpdiff_lim = sat(c0_Y + sharpdiff) - c0_Y;
258-
float satmul = (c0_Y + max(sharpdiff_lim*0.9, sharpdiff_lim)*1.03 + 0.03)/(c0_Y + 0.03);
259-
vec3 res = c0_Y + (sharpdiff_lim*3.0 + sharpdiff)/4.0 + (c[0] - c0_Y)*satmul;
260-
261-
return vec4(video_level_out == true ? res + HOOKED_texOff(0).rgb - c[0] : res, HOOKED_texOff(0).a);
262-
}
227+
/*float satmul = (c0_Y + max(sharpdiff_lim*0.9, sharpdiff_lim)*0.3 + 0.03)/(c0_Y + 0.03);
228+
vec3 res = c0_Y + sharpdiff_lim + (c[0] - c0_Y)*satmul;
229+
*/
230+
return vec4(sharpdiff_lim + c[0], HOOKED_texOff(0).a);
231+
}

0 commit comments

Comments
 (0)