SameBoy | Accurate GB/GBC emulator |
| download: https://git.y1.nz/archives/sameboy.tar.gz | |
| README | Files | Log | Refs | LICENSE |
Shaders/OmniScaleLegacy.fsh
1 STATIC float quickDistance(vec4 a, vec4 b)
2 {
3 return abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z);
4 }
5
6 STATIC vec4 scale(sampler2D image, vec2 position, vec2 input_resolution, vec2 output_resolution)
7 {
8 vec2 pixel = position * input_resolution - vec2(0.5, 0.5);
9
10 vec4 q11 = texture(image, (floor(pixel) + 0.5) / input_resolution);
11 vec4 q12 = texture(image, (vec2(floor(pixel.x), ceil(pixel.y)) + 0.5) / input_resolution);
12 vec4 q21 = texture(image, (vec2(ceil(pixel.x), floor(pixel.y)) + 0.5) / input_resolution);
13 vec4 q22 = texture(image, (ceil(pixel) + 0.5) / input_resolution);
14
15 vec2 pos = fract(pixel);
16
17 /* Special handling for diaonals */
18 bool hasDownDiagonal = false;
19 bool hasUpDiagonal = false;
20 if (equal(q12, q21) && inequal(q11, q22)) hasUpDiagonal = true;
21 else if (inequal(q12, q21) && equal(q11, q22)) hasDownDiagonal = true;
22 else if (equal(q12, q21) && equal(q11, q22)) {
23 if (equal(q11, q12)) return q11;
24 int diagonalBias = 0;
25 for (float y = -1.0; y < 3.0; y++) {
26 for (float x = -1.0; x < 3.0; x++) {
27 vec4 color = texture(image, (pixel + vec2(x, y)) / input_resolution);
28 if (equal(color, q11)) diagonalBias++;
29 if (equal(color, q12)) diagonalBias--;
30 }
31 }
32 if (diagonalBias <= 0) {
33 hasDownDiagonal = true;
34 }
35 if (diagonalBias >= 0) {
36 hasUpDiagonal = true;
37 }
38 }
39
40 if (hasUpDiagonal || hasDownDiagonal) {
41 vec4 downDiagonalResult, upDiagonalResult;
42
43 if (hasUpDiagonal) {
44 float diagonalPos = pos.x + pos.y;
45
46 if (diagonalPos < 0.5) {
47 upDiagonalResult = q11;
48 }
49 else if (diagonalPos > 1.5) {
50 upDiagonalResult = q22;
51 }
52 else {
53 upDiagonalResult = q12;
54 }
55 }
56
57 if (hasDownDiagonal) {
58 float diagonalPos = 1.0 - pos.x + pos.y;
59
60 if (diagonalPos < 0.5) {
61 downDiagonalResult = q21;
62 }
63 else if (diagonalPos > 1.5) {
64 downDiagonalResult = q12;
65 }
66 else {
67 downDiagonalResult = q11;
68 }
69 }
70
71 if (!hasUpDiagonal) return downDiagonalResult;
72 if (!hasDownDiagonal) return upDiagonalResult;
73 return mix(downDiagonalResult, upDiagonalResult, 0.5);
74 }
75
76 vec4 r1 = mix(q11, q21, fract(pos.x));
77 vec4 r2 = mix(q12, q22, fract(pos.x));
78
79 vec4 unqunatized = mix(r1, r2, fract(pos.y));
80
81 float q11d = quickDistance(unqunatized, q11);
82 float q21d = quickDistance(unqunatized, q21);
83 float q12d = quickDistance(unqunatized, q12);
84 float q22d = quickDistance(unqunatized, q22);
85
86 float best = min(q11d,
87 min(q21d,
88 min(q12d,
89 q22d)));
90
91 if (equal(q11d, best)) {
92 return q11;
93 }
94
95 if (equal(q21d, best)) {
96 return q21;
97 }
98
99 if (equal(q12d, best)) {
100 return q12;
101 }
102
103 return q22;
104 }
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.