git.y1.nz

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.